如果从dll传出string,一般定义成PChar,由调用者分配好内存,并告诉大小,这样比较麻烦。
既然delphi的dll可以传回variant(实际是array),就把字串转成byte array直接传回吧,如:
Delphi XE代码:
function Call(AEndPointURL:PWideChar;AServiceName,AMethodName:PWideChar;
const AParams:OLEVariant;out AResult:OLEVariant;out AErrorMsg:OLEVariant):HResult;
begin
try
....
except
on E:Exception do
begin
Result:=1000;
AErrorMsg:=WideBytesOf(E.Message);
end;
end;
end;
C#代码:
public static class inetdll
{
[DllImport("tmtsSoapStub.dll",
EntryPoint = "Call",
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern int Call(
[MarshalAs(UnmanagedType.LPWStr)]string AEndPointURL,
[MarshalAs(UnmanagedType.LPWStr)] string AServiceName,
[MarshalAs(UnmanagedType.LPWStr)] string AMethodName,
ref object AParams, out object AResult, out object AErrorMsg);
}
private void button4_Click(object sender, EventArgs e)
{
object vErrorMsg;
object r;
object vParams=null;
int hResult = inetdll.Call(
"http://127.0.0.1:8080/Broker.dll/soap/ISoapService",
"Test", "Test",
ref vParams, out r, out vErrorMsg);
if (hResult!=0)
MessageBox.Show(ASCIIEncoding.Unicode.GetString((byte[])vErrorMsg));
}