在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); ”就报内存错误,是不是代码有问题?

解决方案 »

  1.   

    敢问楼主,rtxobj是腾讯通里的对象吗?
      

  2.   

    下面纯属猜测。呵呵。。
    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。
    这个转换就出问题了。
      

  3.   

    halfdream老兄:
    不用参数,在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”
      

  4.   

    呵。。没有PB,无法调试楼主程序。不过我想,为什么楼主不用做一个COM来封装呢?
    这样可以避开一些普通DLL的问题。
      

  5.   

    还是在RTXParams.Add('SENDER', sender);中的sender出错,
    是传递参数类型的问题,不过用widestring,pwidechar等类型也都不行。