library SMS;uses
  Classes,
  SysUtils,
  SOAPHTTPClient,
  MonitorWebServices1 in 'MonitorWebServices1.pas',
  uWebServices in 'uWebServices.pas';{$R *.res}var
  rioList: TList;//得到一个新创建的THTTPRIO对象的地址
function Get_HTTPRIO: LongWord; stdcall;
var
  i: Integer;
begin
  i := rioList.Add(THTTPRIO.Create(nil));
  Result := LongWord(rioList.Items[i]);
end;exports
  Get_HTTPRIO;begin
  rioList := TList.Create;
end.如上,我在dll中创建了一个TList的全局变量,用来保存主调程序需要的THTTPRIO对象,这些THTTPRIO对象由dll动态创建,但是我这样创建好像不行,这样创建的THTTPRIO变量在函数执行完毕后好像就自动释放了,在主调程序中调用TList中的这些对象会报内存地址错误,谁有完美的解决方案?注意我需要的是动态创建THTTPRIO对象给外部程序使用。

解决方案 »

  1.   

    你这样实现没问题啊,你上面是怎么调用的?如果上层应用要操作DLL创建的对象,导出一个函数给上层用就好了.本来你是想实现创建操作分离的现在在上层应用又要操作,何不导出函数呢
      

  2.   

    主调与DLL模块在运行期的RTTI表不是共享的,且RTTI表的基址也不一定一样,你这样把一个DLL模块的地址传给主调模块,主调模块根据DLL传来的地址进行转型,肯定会出错。
    一再强调,不要在DLL与主调模块中搞个对象传来传去的!不会用COM吗?