2013-12-19 4 views
0

я это в моем файле заголовка 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

Вы забыли 1-й аргумент 'void * ptr'. Это должно быть объявлено как IntPtr в коде C#. –

+0

жаль звучать глупо или что-то, но как бы присвоить значение для 'IntPtr ptr'? Является ли это конструктором или как его инициализировать/объявлять? – lookie

+1

Добавить член класса IntPtr в класс C#. Объявите функцию CreateS с возвращаемым типом IntPtr в C#, вызовите его и назначьте этому члену класса. Добавьте первый параметр IntPtr в CreateS, DestroyS и setvaluesDLL-функции в C#. –

ответ

1

Вы должны инициализировать первое значение параметра setvaluesDLL с помощью результата CreateS(). Этот метод также должен быть импортирован из DLL. То же, что и DestroyS - правильно освободить память

1

у вас есть 5 аргументов в вашем C++ файл:

void __stdcall setvaluesDLL(void *ptr, int x, int y,int s, int p) 

И только 4 в C#:

public static extern void setvaluesDLL(int x, int y, int s, int p) 

Кроме того, я не думаю, что существует прямой эквивалент указателю void *, поэтому вы можете использовать небезопасный код (его нужно разрешить в настройках вашего проекта).

0

Из того, что я знаю, вы не можете явно импортировать класс C++ в C# (для инициализации ptr в Assign_Click). Возможно, вы могли бы написать некоторые функции в dll, чтобы сделать его доступным для C#, - или вы могли бы вникать в сборку.

Смежные вопросы