我疯了。
我有一个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.
请你有什么想法吗?
感谢。
答案 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
。