MD我已经精疲力尽了!! 再得不到有效帮助,就退出这个项目了!!!
我在DLL中使用了数据库,程序调用它,有时开始时会弹出
"Access violation at address 00000000. Read of address 00000000. "
可气的就是有时有,有时没有,出现的机率在20%左右!!!!
我想尽了办法,还是找不到错误出在何处!!!!
求高人指点迷津,实感激不尽!!!!!
附上DLL中的主要部分:
DLL的BEGIN,END间:
try
CoInitialize(nil);
ADOConnection := TADOConnection.Create(nil);
ADOConnection.LoginPrompt:=false;
ado:=TADODataSet.Create(nil);
ado1:=TADODataSet.Create(nil);
ado.Connection :=ADOConnection;
ado1.Connection:=ADOConnection;
except
end;
初始化函数:
//Receive init params
function InitVars(t:INITPARM):boolean;stdcall;
begin
try
//Get data inputed by user
pInit:=t;
//Init database connecting string
ADOConnection.Close;
ADOConnection.ConnectionString :=pInit.IniMDBConStr;
ADOConnection.Open();
//FillChar(vParm,sizeof(vParm),0);
except
end;
end;
DLL退出时
procedure opr(d:dword);
begin
if d=0 then begin
try
//ado.Free;
//ado1.Free;
//ADOConnection.Free;
CoUninitialize;
except
end;
end;
end;
[解决办法]
TADOConnection.Create(nil);
用
CreateOleObject( "ADODB.Connection ")
替换试试
[解决办法]
直接用ADODC的_Recordset之类的
不要用VCL封装的,那就一定OK
[解决办法]
在动态链接库中好像不能使用这样的程序功能,可以是逻辑功能吧?用COM组建肯定行的通。
[解决办法]
建议先用exe测试稳定,然后再移植到dll中,99%是你的代码有问题
须要一步一步测试,要有耐心的.
[解决办法]
读空指针吧 代码太弱了 没有一个地方有Assigned
[解决办法]
在DLL上加参数传递调用程序窗体句柄
procedure getconn(hwnd:dword);
begin
CoInitialize(nil);
application.handle:=hwnd;
adoconn:=tadoconnection.create(application);
end;
EXE传递
getconn(handle);
[解决办法]
你先把try except都去掉再说...
[解决办法]
你这样编写,不出问题才怪。建议把各种控件放到一个DataModule上面,然后创建DataModule。而且尽量不要动态创建、释放这种与COM相关的对象。应该创建出来后,一用到底