Delphi的dll如何向C#传出string(1)

本文介绍了一种使用Delphi DLL向C#应用返回字符串的方法。通过将字符串转换为字节数组并利用OLEVariant进行传递,简化了跨语言数据交换的过程。文章提供了具体的Delphi和C#代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果从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));
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值