我用Delphi7写了一个DLL,其中用到数据库ADOConnection,在DLL工程文件begin end.中加入CoInitialize(nil),
  想通过设置DLLPROC函数达到DLL退出时调用CoUninitialize。代码如下:OldDLLProc: pointer;begin
  CoInitialize(nil);
  InitiaVar(Hint);
  CrtAdoC(Hint);
  OldDLLProc := @DLLProc;
  DLLProc := @ext;
  ext(DLL_Process_Detach); //此参数也曾尝试用DLL_Thread_Detach,效果一样
end. function ext(dwReason: Cardinal): integer; stdcall;
begin
  CloseFile(myTxt[0]);
  Application.MessageBox('czc','',0);
  CoUninitialize;
end;  函数ext无法在DLL退出时被调用,而是在启动时就被调用了。
  如果不显示在初始化时加上ext(DLL_Process_Detach);,在哪个地方加,可以达到DLL退出时自动被执行呢?
  从Delphi7帮助中得知,DLL退出时只能通过设置DLLPROC这个指针来处理DLL清场的事情。
  
  

解决方案 »

  1.   

    判断一下dwReason在,DETACH里面释放COM组件,你要手动加载的是ATTACH事件,DETACH似乎是系统调用的,试一下。
    procedure ext(dwReason: Cardinal);
    begin
      case dwReason of
        DLL_PROCESS_ATTACH:
          MessageBox(0,'Attach','Test',0);
        DLL_PROCESS_DETACH:
          MessageBox(0,'Detach','Test',0);
      end;
    end;
      

  2.   

    两个地方:
    1.
    function ext(dwReason: Cardinal): integer; stdcall;
    改成
    function ext(dwReason: Cardinal): integer; register;
    begin
      if dwReason= DLL_PROCESS_DETACH then
      begin
         CloseFile(myTxt[0]);
         Application.MessageBox('czc','',0);
         CoUninitialize;
      end;
    end;2.
      DLLProc := @ext;
    //  ext(DLL_Process_Detach);   //这一句不要