关于delphi中DLL中ADO使用和调试DLL的问题.

lightninglu 2003-01-17 12:13:50
我的程序源码如下:
library Project1;
uses
SysUtils,
Classes,
Unit1 in 'Unit1.pas' {Form1},
Uchg in 'Uchg.pas' {FrmChg},
UData in 'UData.pas' {Data: TDataModule};

{$R *.res}
procedure MyCreate;stdcall;
begin
data:=tdata.Create(nil);
Form1:= TForm1.Create(nil);
frmchg:=tfrmchg.Create(nil);
Form1.Show;
end;

exports
MyCreate;

begin
end.

//在UData(TDataModule)中

unit UData;

interface

uses
SysUtils, Classes, DB, ADODB,Dialogs;

type
TData = class(TDataModule)
ADOQry: TADOQuery;
ADOCnn: TADOConnection;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
SL:TSTRINGLIST;
end;

var
Data: TData;
FileName:string;
implementation

{$R *.dfm}

procedure TData.DataModuleCreate(Sender: TObject);
var Cnn:string;
begin
FileName:=extractfilepath(paramstr(0))+'hos.ini';
if FileExists(FileName) then
begin
SL:=TSTRINGLIST.Create;
SL.LoadFromFile(FILENAME);
Cnn:=sl.Text;
try
adocnn.Connected:=false;
adocnn.ConnectionString:=Cnn;
adocnn.Connected:=true;
adocnn.LoginPrompt:=false;
except
showmessage('数据库初始化错误,无法找到数据库'+#13+#10+cnn);
end;
end;
AdoQry.Close;
adoqry.Open;
end;
END.

在调用的部分中
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,ActiveX, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

procedure MyCreate;stdcall;external'E:\dephi\DILL\project1.dll';
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
///////////////////////////////
CoInitialize(nil); ///
///////////////////////////////
MyCreate;
end;
在我加上用斜线表出来的这一句后,在按下Button1后,就像死机一样,什么也没有,如果不用的话,调用时报错,"未调用CoInitialize",我不知道该怎么调试dll,设了断点也没用,我用的是delphi6, 请教请教。

...全文
542 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanlen 2003-03-03
  • 打赏
  • 举报
回复
我现在也碰到了这个问题,大侠相助啊。
menye 2003-02-14
  • 打赏
  • 举报
回复
在dll单元文件的尾部加上以下部分即可
unit UData;

interface

uses
SysUtils, Classes, DB, ADODB,Dialogs;

type
TData = class(TDataModule)
ADOQry: TADOQuery;
ADOCnn: TADOConnection;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
SL:TSTRINGLIST;
end;

var
Data: TData;
FileName:string;
implementation

{$R *.dfm}

procedure TData.DataModuleCreate(Sender: TObject);
var Cnn:string;
begin
FileName:=extractfilepath(paramstr(0))+'hos.ini';
if FileExists(FileName) then
begin
SL:=TSTRINGLIST.Create;
SL.LoadFromFile(FILENAME);
Cnn:=sl.Text;
try
adocnn.Connected:=false;
adocnn.ConnectionString:=Cnn;
adocnn.Connected:=true;
adocnn.LoginPrompt:=false;
except
showmessage('数据库初始化错误,无法找到数据库'+#13+#10+cnn);
end;
end;
AdoQry.Close;
adoqry.Open;
end;



Initialization
CoInitialize(nil);

Finalization
CoUnInitialize;

END.

lightninglu 2003-02-14
  • 打赏
  • 举报
回复
照各位的说法修改了DLL文件,但是调用的时候报错:
“ CAN'T FIND PROGRAM“ 路径什么的都对的,
一按F9就错了。
代码如下:

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

procedure MyCreate;stdcall;external'E:\dephi\DILL\project1.dll';
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//CoInitialize(nil);
MyCreate;
end;

end.
lightninglu 2003-02-13
  • 打赏
  • 举报
回复
还是不知道该怎么用CoInitialize(nil);CoUnInitialize;可不可以各个例子学习一下。
Wally_wu 2003-02-12
  • 打赏
  • 举报
回复
To: tibetty(laoduan)
你说的是,我没有看清楚代码里面有ADO Component。但是,就算要调用CoInitialize,也不是在主应用程外面调用,应该在DLL里面调用。
tibetty 2003-02-12
  • 打赏
  • 举报
回复
楼上的兄弟不要搞错,Delphi里面的ADO就是使用了M$的ADO(ActiveX Data Object), 所以初始化是必需的。
Wally_wu 2003-02-12
  • 打赏
  • 举报
回复
procedure MyCreate;stdcall;external'E:\dephi\DILL\project1.dll';是一个错误的声明,你应该写成这样:
procedure MyCreate;stdcall;external'E:\dephi\DILL\project1.dll'name'MyCreate';

CoInitialize函数并不是这样用的,因为CoInitialize是用于对COM Library 初始化而用的。 你只不过是调用Dll而已,不需要用到CoInitialize函数。
tibetty 2003-02-12
  • 打赏
  • 举报
回复
hehe,我以前也碰到这个问题,诚如menye(menye)所言,当然你可以选择
在其他地方调用CoInitialize和CoUnInitialize。掺乎一把,不是要分。
menye 2003-02-12
  • 打赏
  • 举报
回复
在dll中的use中加ComObj, ActiveX

dll文件中加入
Initialization
CoInitialize(nil);
Finalization
CoUnInitialize;
Billy_Chen28 2003-02-12
  • 打赏
  • 举报
回复
在菜单debug-》host中加入调用dll的宿主exe文件,按F9运行即可调试

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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