DLLImport get Попытка чтения или записи в защищенную память - PullRequest
1 голос
/ 05 октября 2011

Я схожу с ума.

У меня есть dll, с этой функцией:

function MyFunc(myId: integer; var LstCB: array of char): integer; stdcall;

Первый параметр - плохое целое число.Но вторым является символ [2048], который получает что-то вроде этого

('9', #13, #10, '8', '8', '8', '8', '0', '0', '0', '0', '0', '0', '0', '0', '2', '5', '0', '7', #13, #10, '8', '8', '8', '8', '0', '0', '0', '0', '0', '0', '0', '0', '2', '6', '0',  #13, #10, '8', '8', '8', '8', '0', '0', '0', '0', '0', '0', '0', '0', '3', '3', '1', '5', #13, #10, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,....#0)

Я импортировал это с помощью DllImport:

[DllImport(@"MyDll.dll", EntryPoint = "MyFunc", CallingConvention = CallingConvention.StdCall)]
internal static extern int MyFunc(int myId, string list);

И я получил:

Attempted to read or write protected memory. This is often an indication that other memory has been corrupted.

У вас есть идеи, пожалуйста ???

Спасибо.

1 Ответ

4 голосов
/ 05 октября 2011

Ваша функция Delphi использует открытый массив для строкового параметра. Это не то, что должно быть открыто через границы DLL. Протокол для вызова открытого массива Delphi зависит от реализации.

Вы должны изменить свой код Delphi, чтобы получить PChar.

function MyFunc(myId: Integer; LstCB: PChar): Integer; stdcall;

Если данные передаются из C # в Delphi DLL, тогда ваш P / invoke в порядке. Если DLL предназначена для возврата данных в код C #, вам нужно объявить текстовый параметр как StringBuilder в вызове P /.

[DllImport(@"MyDll.dll", EntryPoint = "MyFunc", CallingConvention = CallingConvention.StdCall)]
internal static extern int MyFunc(int myId, StringBuilder list);
...
StringBuilder list = new StringBuilder(2048);
int res = MyFunc(ID, list);
string theList = list.ToString();

Единственное, на что следует обратить внимание, это значение char в Delphi. Если DLL собрана с Delphi 2009 или более поздней версии, тогда char - это символ Unicode, и вам нужно указать CharSet в вашем вызове P /.

...