C#调用delphi编写的dll时如何传入传出OLEVariant

假设在delphi写一个dll,export这样一个函数:

在C#中如何调用这个函数呢?困难的地方在于OLEVariant如何处理,网上说处理成objec,先尝试一下这样:

结果产生一个异常:

无法封送处理“parameter #3”: 不能对返回类型、ByRef 参数、ArrayWithOffset 或从非托管传入托管的参数使用 AsAny。

再来试试:

结果还是产生异常:

无法封送处理“parameter #3”: 无效的托管/非托管类型组合(Object 类必须与 Interface、IUnknown、IDispatch、AsAny 或 Struct 成对出现)。

 

结果反复尝试,定义成这样就可以了:

即:传入的AParams定义成“ref object”,传出的AResult定义成“out object” 。

但是,如果返回的是VarArrayCreate([0,1000],varByte),在c#中就不能转换成object[],需要转换成byte[],这个比较奇怪,不是说anything is object吗?

 

但是如果函数在结果中返回Variant,却不会成功,会出现“PInvoke限制:无法返回变量”,如:

function Test_ReturnOLEVariant:OLEVariant;stdcall;
begin
  Result:=VarArrayCreate([0,9],varByte);
  Result[2]:=2;
end;

 

[DllImport("tmtsSoapStub.dll")]
        public static extern object Test_ReturnOLEVariant();


 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

火星牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值