在DLL工程里需要
Project options/Packages/Build with runtime packages打上勾
在编译

解决方案 »

  1.   

    为什么??与环境有关吗?我是在Win2k+Delphi6下编译的!
      

  2.   

    是在
    DLL工程里设置
    我试过了好使
    你是不是设置错了
      

  3.   

    我也不懂
    但是不选上就是不好使
    以前也是试了好多次
    因为
    Delphi对这个入口函数与c的不同
    不象c的有个DllMain
    是用这个DllProc全局变量
    定义在SysInit中
    DllProc: TDLLProc; 
    如果不这么做,不共享包的话
    那就是DLL有一份自己的DllProc变量
    不知delphi怎么处理的
    我想当在主程序的环境中装入,卸载, 创建线程,释放线程,
    所用的DllPrco就是另一份
    所以不好使
    这纯属我瞎猜
    希望高人指点
      

  4.   

    与delphi环境有关的:在delphi5下编译的Dll就可以、delphi6下编译的就不行;看了一下对DllProc的声明:delphi5中声明为: DllProc : Pointer;
    delphi6中声明为: DllProc : TDllProc;
    TDllProc在System单元中声明为:
    TDLLProc = procedure (Reason: Integer);可我按照 xzgyb的方法为什么不行呀??
      

  5.   

    跟运行时包没关系,我的是Delphi5,
    没有选中Project options/Packages/Build with runtime packages
    照样行。
    看是不是Delphi6的问题
      

  6.   

    没有问题,刚才我验证了一下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.
      

  7.   

    To chechy(我爱洁洁) :delphi5 下是没有问题的,我也试过了。
    你在delphi6下试一下!!
      

  8.   

    正要进行补丁测试但我的Delphi不是按照默认路径安装的,安装不上Patch1,现在正在卸掉重装。
      

  9.   

    To chechy(我爱洁洁) :D6安装补丁了吗?编译环境有特殊设置吗?
      

  10.   

    编译环境我没有设置过,补丁倒是打了。我补了UPDATE PACK2
      

  11.   

    问题解决了,Patch1不行,非Patch2不可!多谢各位了!!