按照本教程here,但没有成功。返回内存地址错误。
我想要这样,不是我的内存错误,而是返回nulls
Code Delphi:
interface
procedure getValores(samples: array of string); stdcall; external 'myDll.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
vet :array[0..400] of string;
begin
getValues(vet);
Layout('',vet);
end;
end.
C#代码
[DllExport(CallingConvention = CallingConvention.Cdecl)]
public static void getValores(
[Out]
[MarshalAs(UnmanagedType.LPArray,
ArraySubType=UnmanagedType.LPWStr, SizeConst=400)]
String[] test
)
{
if (test == null)
{
MessageBox.Show("null");
return;
}
MessageBox.Show("Recive" + test.Length);
for(int i = 0; i < test.Length; i++)
test[i] = "test";
return;
}
有人遇到过这个问题吗?
谢谢
答案 0 :(得分:1)
我会将问题分解为3个部分。
整理出调用约定。 Stdcall和cdecl是互斥的调用约定。您需要完全确定调用.dll的约定,然后调整您的应用程序代码以匹配。 https://en.wikipedia.org/wiki/X86_calling_conventions
制作一个只需要一个字符串(不是数组)的简单测试程序。您需要确保字符集(Ansi与Unicode)和字符串长度确定(BStr与LPStr)。
处理完这两个问题后,再处理原始数组 参数。