я это в моем файле заголовка C++экспорт с DLL ++ в C# WinForm
#ifndef S2dll_H
#define S2dll_H
#ifdef S2dll_EXPORTS
#define S2dll_API __declspec(dllexport)
#else
#pragma message("automatic link to S2dll.LIB")
#pragma comment(lib, "S2dll.lib")
#define S2dll_API __declspec(dllimport)
#endif
класс объявлен как этот
class S2dll_API Sample
{
//members here
}
ПГКС файл, содержащий определения функций, конструкторы
void * __stdcall CreateS() //constructor
{
return new SDLL;
}
void __stdcall DestroyS(void * objPtr) //destructor
{
s* sObj = (s *) objPtr;
if (sobj)
delete sObj;
}
экспорт/экспонирование этой функции
void __stdcall setvaluesDLL(void *ptr, int x, int y,int s, int p)
{
Sample *dll = (Sample *) ptr;
if (dll)
{
dll->setposition(c); //functions in the cpp file
dll->setlocation(x,y);
dll->setsize(s);
}
}
.def файл
LIBRARY BS2dll
EXPORTS
CreateS
DestroyS
setvaluesDLL
так что я пытаюсь получить к нему доступ в моей C# выиграть формы
сделал это, чтобы выставить его
static internal class dllcall
{
[DllImport(@"adrress\S2dll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void setvaluesDLL(IntPtr ptr,int x, int y, int s, int p);
}
назвав его в моей WinForm
private void Assign_Click(object sender, EventArgs e)
{
dllcall.setvaluesDLL(ptr, x, y, s, p);//all values are int
}
Я получаю эту ошибку: Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена.
был поиск Google и смотрел на этот код в течение нескольких часов и каждый раз, когда мне удается решить проблему, новый выходит каждый раз, когда я называю setvaluesDLL(//parameters)
Редакцией: IntPtr PTR моя основная проблема здесь, и у меня есть не абсолютно никакой идеи, как использовать и не инициализировать его
Вы забыли 1-й аргумент 'void * ptr'. Это должно быть объявлено как IntPtr в коде C#. –
жаль звучать глупо или что-то, но как бы присвоить значение для 'IntPtr ptr'? Является ли это конструктором или как его инициализировать/объявлять? – lookie
Добавить член класса IntPtr в класс C#. Объявите функцию CreateS с возвращаемым типом IntPtr в C#, вызовите его и назначьте этому члену класса. Добавьте первый параметр IntPtr в CreateS, DestroyS и setvaluesDLL-функции в C#. –