DLLImport get Attempted读取或写入受保护的内存

时间:2011-10-05 14:30:27

标签: c# delphi pinvoke dllimport

我疯了。

我有一个dll,有这个功能:

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

第一个参数是一个差整数。 但第二个是char [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 个答案:

答案 0 :(得分:4)

你的Delphi函数使用一个开放数组作为字符串参数。这不是应该在DLL边界上暴露的东西。调用Delphi开放数组的协议是特定于实现的。

您应该更改Delphi代码以接收PChar

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

如果数据从C#传递到Delphi DLL,那么你的P / invoke就可以了。如果DLL要将数据返回到C#代码,那么您需要在P / invoke中将text参数声明为StringBuilder

[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字符,您需要在P / invoke中指定CharSet