难道这又是个未解之谜?--- 关于DLL中使用ADODATASET出错的问题 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061128102336156.html
搜索了之前的贴子,未找到有用的信息.
MD,搞了一天,头都大了,仍然找不到原因:
我在DLL中声明了全局ado:TADODataSet;
DLL装载时也有
CoInitialize(nil);
ado:=TADODataSet.Create(nil);
但是在读取记录时,
ado.CommandText:='select text from Menus where id='+inttostr(MenuID);
ado.Open;
n:=ado.recordcount;
或 ado.recno:=1;
主程序调用此DLL时,走到最后两条这里有时就报内存地址错误, 但有时又没有. 有错误时,严重时会令主程序退出!!!
改用DataMoudle,问题依旧!!!
百思不得其解,到底为什么???
可以要用 ShareMem, 放在用到 dll 和 dll 的第一 use 顺序处
同意楼上,另外,如果不是多线程,没有必要加CoInitialize(nil);这句,也容易造成地址错误。
帮顶
早就过ShareMem.
没用.
不用CoInitialize(nil)这句,编译都通不过.
没有那么多的迷呀 LZ F1帮助 可解决LZ一切问题~~
而且这个异常出现的很奇怪, 有时甚至打开QQ对话框, 也会导致它出错!
或打开其它一个软件或文件, 也导致其出那个错误, 而且错误都发声在访问ADO对象时!!!!
难解之谜啊
LZ这么写 把 ado:=TADODataSet.Create(nil);创建的时候写到异常里面去捕捉
ado:=TADODataSet.Create(nil);
try
执行ado要读取数据的代码
finally
ado.free;
and;
晕...拜托你看看题目再答吧,兄弟!!
创建对象时根本无任何问题,何况有时也能正常工作?
可能是dll中的ado连接的ADOConnection的问题,如果ADOConnection是放在数据模块中,而数据模块也是放在dll中,则这样使用肯定出错,如果是这种情况,你必须在装载dll时显式创建数据模块。
给你作了一个完整的DEMO,连续测试了1000次,OK。
uses
SysUtils,
Activex,
ADODB,
Classes;
{$R *.res}
function DataExport: integer;
var
ADOConnection: TADOConnection;
ADODataSet : TADODataSet;
begin
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=WANGS;Data Source=.';
ADOConnection.LoginPrompt := False;
ADODataSet:= TADODataSet.Create(nil);
ADODataSet.Connection := ADOConnection;
try
ADODataSet.Close;
ADODataSet.CommandText:= 'Select * From TWangs_UserInfo ';
ADODataSet.Open;
Result := ADODataSet.RecordCount;
finally
ADODataSet.Free;
ADOConnection.Free;
CoUnInitialize;
end;
end;
exports
DataExport;
begin
end.
老冯:
1.一定得用 ADODataSet.Connection吗? 这是不是那问题的症结所在?
2.可以将其它的ADO对象换成全局的吗?
1.一定得用 ADODataSet.Connection吗? 这是不是那问题的症结所在? (没有测试过)
2.可以将其它的ADO对象换成全局的吗? 可以(测试过)
1.一定得用 ADODataSet.Connection吗? 这是不是那问题的症结所在? 可以 (刚刚测试过)
问题症结应该在
CoUnInitialize;
不过我建议就按我上面的规格办。我所有的系统涉及这些元件我都是这样办的。久经沙场的。呵呵呵呵
CoUnInitialize;
我试过N次了, 加不加这个东西,都一样会有时报错