请教一个问题

frankie_24 2007-05-31 04:44:38
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后就是报错,实在是不知道错那里了?各位帮我看看吧。。。谢谢了。。
...全文
185 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankie_24 2007-06-01
  • 打赏
  • 举报
回复
kjiwu(阿磊)
谢谢你了昂,我知道错那里了,我动态建立就可以了,我把ADO也是动态建立的就可以了。。
呵呵,就是你所说的,是我没有初始化,我在调用的时候DM上的ADO就没有执行,所以没有数据
非常感谢你了昂。。。给分
kjiwu 2007-05-31
  • 打赏
  • 举报
回复
我想你那个程序出错应该是DM这个单元,你的DM没有初始化!
给你个正解的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.
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
好的,谢谢你了昂,明天给分。。。我下班了。。呵呵。。非常感谢
kjiwu 2007-05-31
  • 打赏
  • 举报
回复
这个我没想好怎么弄,我不知道你的DM,TDataModal吗?你怎么创建的?这些情况我不太清楚呀!
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
呵呵。。。越来越糊涂了。
传进去啊。。我就是不希望再窗体中往里传,我希望都是在Dll中执行
我动态建立可以不?
ADO也是动态建立
kjiwu 2007-05-31
  • 打赏
  • 举报
回复
DataSource1.DataSet := OpenSQL('Select * from sql_test_table_1', DM.ADOCon);
这样呀,把你的TADOConnection传进来;
你先试试我写的,你就会明白了!不难的!
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
还是不明白啊。。
呵呵。。
那我再窗体调用的时候怎么办啊?
Con怎么写?
kjiwu 2007-05-31
  • 打赏
  • 举报
回复
动态库中,我没有引用DM.ADOCon,而是用一个参数代替了!
function OpenSQL(Str :String; Con: TADOConnection):TDataSet;stdcall
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
kjiwu(阿磊)
你的DM。ADOCon是动态库里面的?
还是窗体里面的,我不是很明白,你跟我说说吧,谢谢了昂。。
kjiwu 2007-05-31
  • 打赏
  • 举报
回复
我这也许是个折中的方法!你自己看看吧
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
大哥们帮帮我啊。。
还是不行啊,我也加了Uses就是不行,啊我跟了一下,根本就不运行 Close;
SQL.Clear;
SQL.Add(Str);
Open;这个,直接返回了。。不知是怎么了
kjiwu 2007-05-31
  • 打赏
  • 举报
回复
你DM是怎么定义的(DLL中)?我试了引用DM单元,那样会出错;
我改写了一下你的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单元没有初始化之类的原因导致错误!
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
开始我就没有写这句,就报错,我就加上看看,还是报错。。
报错没有很详细的说明,就是那种程序崩溃。。好像是内存的问题。。但是不知道那里错了、。
Comer 2007-05-31
  • 打赏
  • 举报
回复
试试在DLL里和调用DLL的程序里都
use ADODB;
chenzhuo 2007-05-31
  • 打赏
  • 举报
回复
报什么错?
Open;
end;
ADOset.Active :=True; //上面已经OPEN了,这句就不用了!
frankie_24 2007-05-31
  • 打赏
  • 举报
回复
我加了,一样不行。。。
而且我用的Pchar
我觉得没有问题。。就是报错啊。谢谢了
chenzhuo 2007-05-31
  • 打赏
  • 举报
回复
把ShareMem单元,放在Uses 的第一个位置,
Dll和Exe都一样!

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧