DLL中封装ClientDataSet,释放出错access violation at address(50)

  • 主题发起人 主题发起人 summer_core99
  • 开始时间 开始时间
S

summer_core99

Unregistered / Unconfirmed
GUEST, unregistred user!
function TOKDM.GetData(AConnection: TADOConnection; ASQL: string; var AData: Variant): Boolean;var qry: TADOQuery; dsp: TDataSetProvider; cds: TClientDataSet;begin qry := TADOQuery.Create(nil); dsp := TDataSetProvider.Create(nil); cds := TClientDataSet.Create(nil); try try //ClientDataSet建立Midas的连接关系 qry.Connection := AConnection; dsp.DataSet := qry; dsp.Options := [poAllowCommandText]; cds.SetProvider(dsp); with qry do begin Close; SQL.Clear; SQL.Text := ASQL; Open; cds.Open; AData := cds.XMLData; //AData := SoapPacket(AData); //Soap封包,采用先用Zlib压缩再进行Base64编码 Close; end; Result := True; except Result := False; end; finally //cds.Free; //不能释放cds,否则会出现access violation at address错误 dsp.Free; qry.Free; end; end;第一次调用可以通过,第二次调用就出错,位置在qry := TADOQuery.Create(nil);这一句出错。就是最后不能把cds释放了,一释放就出现access violation at address错误,已经在DLL的开始入加入了COM的初始化了,还是不行。
 
不要在这里free,建议你把qry、cds、dsp等都放到private下定义成全局的私有变量,然后在Destroy中释放,如下示例:destructor TOKDM.Destroy;begin cds.Free; dsp.Free; FQuery.Free; cmdMain.Free; adsMain.Free; FreeConnection(FConnection); inherited Destroy;end;你试试吧。
 
TO: szhcracker谢谢,这样是可以,但我有很多过程都要用到这些组件,不定义在过程里不方便。就不明白,为什么不能在过程内部定义,我把Create(nil)改为Create(Self)或Create(Application)也是不行
 
仔细看了你的代码,发现问题可能是在控件的绑定上:qry.Connection := AConnection; dsp.DataSet := qry; dsp.Options := [poAllowCommandText]; cds.SetProvider(dsp);你用了cds.SetProvider(dsp)进行绑定,所以建议你释放前先把这些关系去掉(如cds.SetProvider(nil);),然后再释放试试
 
我是第一次调用不会有问题,但第二次调用时,就出错了,出错位置在qry := TADOQuery.Create(nil);这一句上面
 
来自:szhcracker, 时间:2009-12-22 17:29:39, ID:3984534 仔细看了你的代码,发现问题可能是在控件的绑定上:qry.Connection := AConnection; dsp.DataSet := qry; dsp.Options := [poAllowCommandText]; cds.SetProvider(dsp);你用了cds.SetProvider(dsp)进行绑定,所以建议你释放前先把这些关系去掉(如cds.SetProvider(nil);),然后再释放试试 ============================也是不行
 
把function TOKDM.GetData(AConnection: TADOConnection; ASQL: string; var AData: Variant): Boolean;移动到 主程序中测试2测,而不是 dll 中!应该就明白问题了!
 
移到主程序中不会错,试过了
 
我也遇到你这个类似的问题,我是在中间层中,多线程创建ADOQUERY,但我和你不同,我更惨,我有用到托盘图标,我在退出程序时,10%机会会弹出1400无效句柄的错误.应当不是托盘图标,因为我有用Raise里的图标控件,后来也换成TrayIcon.建议你试一下,新做一个DLL,只用到以上代码,看看,会不会出错.(简单的DLL更容易找问题)
 
我试试简单的DLL,看是出现在哪里
 
CoInitializeCoUninitialize
 
DLL中和多线程中,必须有独立的数据连接对话你的qry.Connection := AConnection;换一下吧换一个TConnection;
 
后退
顶部