在dll中封装com对象,rtxobj,rtxparams都是com对象,函数代码:
Function ReturnSMS(sender:string; receiver:string; sms:string;
cut:integer; notitle:integer):pchar;
var
se:string;
strerror:pchar;
RTXObj:variant;
RTXParams:variant;
begin
CoInitialize(nil);
RTXObj:= CreateOleObject('RTXServer.RTXObj');
RTXObj.name := 'SMSOBJECT';
RTXParams:= CreateOleObject('RTXServer.Collection');
RTXParams.Add('SENDER', sender); //'短信发送者
....
end;函数在delphi中调用能正确的返回结果,但在pb中调用发现当执行到“RTXParams.Add('SENDER', sender); ”就报内存错误,是不是代码有问题?
Function ReturnSMS(sender:string; receiver:string; sms:string;
cut:integer; notitle:integer):pchar;
var
se:string;
strerror:pchar;
RTXObj:variant;
RTXParams:variant;
begin
CoInitialize(nil);
RTXObj:= CreateOleObject('RTXServer.RTXObj');
RTXObj.name := 'SMSOBJECT';
RTXParams:= CreateOleObject('RTXServer.Collection');
RTXParams.Add('SENDER', sender); //'短信发送者
....
end;函数在delphi中调用能正确的返回结果,但在pb中调用发现当执行到“RTXParams.Add('SENDER', sender); ”就报内存错误,是不是代码有问题?
1,
Function ReturnSMS(sender:string; receiver:string; sms:string;
cut:integer; notitle:integer):pchar;这是一个DLL的函数吗?参数使用STRING类型便是问题!DELPHI,BCB的DLL传STRING类型的时候,是使用BORLANDMM。DLL来保持STRING内存管理。
PB是不用使用BORLAND公司的那DLL的。
当然,这并不意味着这会出问题,2,COM串参数通常是BSTR,也就是DELPHI中的WIDESTRING,当DELPHI代码传STRING参数时候,
实际上编译器会加上一点转换的代码。但你的DLL中的Sender,并不是DELPHI代码创建的STRING。
这个转换就出问题了。
不用参数,在dll中直接附值,即将
CoInitialize(nil);
RTXObj:= CreateOleObject('RTXServer.RTXObj');
RTXObj.name := 'SMSOBJECT';
RTXParams:= CreateOleObject('RTXServer.Collection');
RTXParams.Add('SENDER', sender);改为
.....
RTXParams.Add('SENDER', ‘1001’);
程序通过,但是在调用RTXObj.call2(4097,RTXParams)时,pb提示"0x042c76c1"指令引用的“0x00000000”内存,该内存不能为“writtern”
这样可以避开一些普通DLL的问题。
是传递参数类型的问题,不过用widestring,pwidechar等类型也都不行。