function OpenSQL(Str :String):TDataSet;stdcall;
var
ADOset :TADOQUery;
begin
ADOset :=TADOQuery.Create(Nil);
ADOset.Connection :=DM.ADOConn;
with ADOset do
begin
Close;
SQL.Clear;
SQL.Add(Str);
Open;
end;
ADOset.Active :=True;
Result :=ADOset;
end;这个是在DLL中写的一个函数,我Exe文件中调试是通过的,但是编译成了DLL后就是报错,实在是不知道错那里了?各位帮我看看吧谢谢了。。
var
ADOset :TADOQUery;
begin
ADOset :=TADOQuery.Create(Nil);
ADOset.Connection :=DM.ADOConn;
with ADOset do
begin
Close;
SQL.Clear;
SQL.Add(Str);
Open;
end;
ADOset.Active :=True;
Result :=ADOset;
end;这个是在DLL中写的一个函数,我Exe文件中调试是通过的,但是编译成了DLL后就是报错,实在是不知道错那里了?各位帮我看看吧谢谢了。。
Dll和Exe都一样!
而且我用的Pchar
我觉得没有问题。。就是报错啊。谢谢了
Open;
end;
ADOset.Active :=True; //上面已经OPEN了,这句就不用了!
use ADODB;
我改写了一下你的OpenSQL函数;下面是完整的DLL定义:
library DBTest;uses
SysUtils,
Classes,
DB,
ADODB;{$R *.res}function OpenSQL(Str :String; Con: TADOConnection):TDataSet;stdcall;
var
ADOset :TADOQuery;
begin
ADOset :=TADOQuery.Create(Nil);
ADOset.Connection := Con;
with ADOset do
begin
Close;
SQL.Clear;
SQL.Add(Str);
Open;
end;
Result :=ADOset;
end;exports
OpenSQL;
begin
end.
下面是测试单元:
function OpenSQL(Str :String; Con: TADOConnection):TDataSet; stdcall; external 'DBTest.dll';DataSource1.DataSet := OpenSQL('Select * from sql_test_table_1', DM.ADOCon);
这样就可以了!
估计你那样调用可能是DM单元没有初始化之类的原因导致错误!
还是不行啊,我也加了Uses就是不行,啊我跟了一下,根本就不运行 Close;
SQL.Clear;
SQL.Add(Str);
Open;这个,直接返回了。。不知是怎么了
你的DM。ADOCon是动态库里面的?
还是窗体里面的,我不是很明白,你跟我说说吧,谢谢了昂。。
function OpenSQL(Str :String; Con: TADOConnection):TDataSet;stdcall
呵呵。。
那我再窗体调用的时候怎么办啊?
Con怎么写?
这样呀,把你的TADOConnection传进来;
你先试试我写的,你就会明白了!不难的!
传进去啊。。我就是不希望再窗体中往里传,我希望都是在Dll中执行
我动态建立可以不?
ADO也是动态建立
给你个正解的DLL单元:先自己好好看看吧!
library DBTest;uses
SysUtils,
Classes,
DB,
ADODB,
uDB in 'uDB.pas' {DM: TDataModule};{$R *.res}function OpenSQL(Str :String):TDataSet;stdcall;
var
ADOset :TADOQuery;
DM: TDM;
begin
DM := TDM.Create(nil);
ADOset :=TADOQuery.Create(Nil);
ADOset.Connection := DM.ADOCon;
with ADOset do
begin
Close;
SQL.Clear;
SQL.Add(Str);
Open;
end;
Result :=ADOset;
end;exports
OpenSQL;
begin
end.
谢谢你了昂,我知道错那里了,我动态建立就可以了,我把ADO也是动态建立的就可以了。。
呵呵,就是你所说的,是我没有初始化,我在调用的时候DM上的ADO就没有执行,所以没有数据
非常感谢你了昂给分