跟运行时包没关系,我的是Delphi5, 没有选中Project options/Packages/Build with runtime packages 照样行。 看是不是Delphi6的问题
没有问题,刚才我验证了一下D5DG的例子。都有断点。 注意,创建Thread的时候,仅仅是响一声(MessageBeep)。下面是测试代码: { Copyright ?1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira }unit MainFrm;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Gauges;type { Define a TThread descendant } TTestThread = class(TThread) procedure Execute; override; procedure SetCaptionData; end; TMainForm = class(TForm) btnLoadLib: TButton; btnFreeLib: TButton; btnCreateThread: TButton; btnFreeThread: TButton; lblCount: TLabel; procedure btnLoadLibClick(Sender: TObject); procedure btnFreeLibClick(Sender: TObject); procedure btnCreateThreadClick(Sender: TObject); procedure btnFreeThreadClick(Sender: TObject); procedure FormCreate(Sender: TObject); private LibHandle : THandle; TestThread : TTestThread; Counter : Integer; GoThread : Boolean; end;var MainForm: TMainForm;implementation{$R *.DFM}procedure TTestThread.Execute; begin while MainForm.GoThread do begin Synchronize(SetCaptionData); Inc(MainForm.Counter); end; end;procedure TTestThread.SetCaptionData; begin MainForm.lblCount.Caption := IntToStr(MainForm.Counter); end;procedure TMainForm.btnLoadLibClick(Sender: TObject); { This procedure loads the library DllEntryLib.DLL } begin if LibHandle = 0 then begin LibHandle := LoadLibrary('DLLENTRYLIB.DLL'); if LibHandle = 0 then raise Exception.Create('Unable to Load DLL'); end else MessageDlg('Library already loaded', mtWarning, [mbok], 0); end;procedure TMainForm.btnFreeLibClick(Sender: TObject); { This procedure frees the library } begin if not (LibHandle = 0) then begin FreeLibrary(LibHandle); LibHandle := 0; end; end;procedure TMainForm.btnCreateThreadClick(Sender: TObject); { This procedure creates the TThread instance. If the DLL is loaded a message beep will occur. } begin if TestThread = nil then begin GoThread := True; TestThread := TTestThread.Create(False); end; end;procedure TMainForm.btnFreeThreadClick(Sender: TObject); { In freeing the TThread a message beep will occur if the DLL is loaded. } begin if not (TestThread = nil) then begin GoThread := False; TestThread.Free; TestThread := nil; Counter := 0; end;end;procedure TMainForm.FormCreate(Sender: TObject); begin LibHandle := 0; TestThread := nil; end;end.
To chechy(我爱洁洁) :delphi5 下是没有问题的,我也试过了。 你在delphi6下试一下!!
DLL工程里设置
我试过了好使
你是不是设置错了
但是不选上就是不好使
以前也是试了好多次
因为
Delphi对这个入口函数与c的不同
不象c的有个DllMain
是用这个DllProc全局变量
定义在SysInit中
DllProc: TDLLProc;
如果不这么做,不共享包的话
那就是DLL有一份自己的DllProc变量
不知delphi怎么处理的
我想当在主程序的环境中装入,卸载, 创建线程,释放线程,
所用的DllPrco就是另一份
所以不好使
这纯属我瞎猜
希望高人指点
delphi6中声明为: DllProc : TDllProc;
TDllProc在System单元中声明为:
TDLLProc = procedure (Reason: Integer);可我按照 xzgyb的方法为什么不行呀??
没有选中Project options/Packages/Build with runtime packages
照样行。
看是不是Delphi6的问题
注意,创建Thread的时候,仅仅是响一声(MessageBeep)。下面是测试代码:
{
Copyright ?1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira
}unit MainFrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ComCtrls, Gauges;type { Define a TThread descendant }
TTestThread = class(TThread)
procedure Execute; override;
procedure SetCaptionData;
end; TMainForm = class(TForm)
btnLoadLib: TButton;
btnFreeLib: TButton;
btnCreateThread: TButton;
btnFreeThread: TButton;
lblCount: TLabel;
procedure btnLoadLibClick(Sender: TObject);
procedure btnFreeLibClick(Sender: TObject);
procedure btnCreateThreadClick(Sender: TObject);
procedure btnFreeThreadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
LibHandle : THandle;
TestThread : TTestThread;
Counter : Integer;
GoThread : Boolean;
end;var
MainForm: TMainForm;implementation{$R *.DFM}procedure TTestThread.Execute;
begin
while MainForm.GoThread do
begin
Synchronize(SetCaptionData);
Inc(MainForm.Counter);
end;
end;procedure TTestThread.SetCaptionData;
begin
MainForm.lblCount.Caption := IntToStr(MainForm.Counter);
end;procedure TMainForm.btnLoadLibClick(Sender: TObject);
{ This procedure loads the library DllEntryLib.DLL }
begin
if LibHandle = 0 then
begin
LibHandle := LoadLibrary('DLLENTRYLIB.DLL');
if LibHandle = 0 then
raise Exception.Create('Unable to Load DLL');
end
else
MessageDlg('Library already loaded', mtWarning, [mbok], 0);
end;procedure TMainForm.btnFreeLibClick(Sender: TObject);
{ This procedure frees the library }
begin
if not (LibHandle = 0) then
begin
FreeLibrary(LibHandle);
LibHandle := 0;
end;
end;procedure TMainForm.btnCreateThreadClick(Sender: TObject);
{ This procedure creates the TThread instance. If the DLL is loaded a
message beep will occur. }
begin
if TestThread = nil then
begin
GoThread := True;
TestThread := TTestThread.Create(False);
end;
end;procedure TMainForm.btnFreeThreadClick(Sender: TObject);
{ In freeing the TThread a message beep will occur if the DLL is loaded. }
begin
if not (TestThread = nil) then
begin
GoThread := False;
TestThread.Free;
TestThread := nil;
Counter := 0;
end;end;procedure TMainForm.FormCreate(Sender: TObject);
begin
LibHandle := 0;
TestThread := nil;
end;end.
你在delphi6下试一下!!