const
  SavedApplication : TApplication = nil;
  SavedScreen : TScreen = nil;// export this procedure and call it after loading the DLL
procedure Init(anApplicationHandle, aScreenHandle: LongWord);
begin
  if not Assigned(SavedApplication) then
  begin
    SavedApplication := Application;
    Application := TApplication(anApplicationHandle);
  end;  if not Assigned(SavedScreen) then
  begin
    // ....same...
  end;
end;initializationfinalization
  if Assigned(SavedApplication) then
  begin
    Application := SavedApplication;
  end;  if Assigned(SavedScreen) then
  begin
    // ....same.....
  end;
end.
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
  
  原帖地址:http://www.delphifaq.com/faq/delphi/vcl/f287.shtml

解决方案 »

  1.   

    Each DLL in Delphi maintains its own instance of Application & Screen,
    your DLL-calling application should send the its own Application and Screen values to the DLL. The DLL should save and restore its original values.原文说的很清楚了,LZ只要记住以下几点就可以了:
    1.  LZ引用的那段代码是要写在 DLL 中的,而不是写在调用 DLL 的 Application 中的。
    2.  每个Delphi中的 DLL 都包含自己的 Application 实例和 Screen 实例。(DLL有Application 实例和 Screen 实例,  调用 DLL 的 Application 同样有它自己的 Application 实例和 Screen 实例,注意区分哦!)
    3.  调用 DLL 的 Application(即DLL-calling application)需要将自己的Application 和Screen 值传给被调用的 DLL。
    4.  被调用的 DLL 会保存和恢复 Application 和Screen 值 (这的Application 和Screen 是DLL-calling application的Application 和Screen 值)的。调用DLL时传入DLL-calling application的Application 和Screen ,使用完DLL后将DLL-calling application的Application 和Screen 的值在复原成原来的值。有借有还嘛!!
      

  2.   

    不好意思啊,第4点说错了!
    应该是这样:
    4.  DLL 会保存和恢复DLL自己 Application 和Screen 值 (这的Application 和Screen 是 DLL 自己的Application 和Screen 值)的。所以LZ的那段代码中的变量的含义是这样的:
    Application         --DLL的Application 
    Screen              ——DLL的Screen  
    anApplicationHandle ——DLL-calling application的Application 
    aScreenHandle       ——DLL-calling application的Screen 所以 procedure Init(anApplicationHandle, aScreenHandle: LongWord);作用是:
    把DLL自己的Application和Screen值分别暂时保存在SavedApplication和SavedScreen,然后将DLL-calling application 的Application和Screen 值分别给了DLL的Application和Screen 变量(或许叫实例更合适)。
    Init的关键代码就是
    **************************************************    SavedApplication := Application;
        Application := TApplication(anApplicationHandle);    SavedScreen := Screen;
        Screen := TScreen(anScreenHandle);
    **************************************************而 finalization 一段则是完成了将Application和Screen值恢复为原来的DLL的Application和Screen值。
    finalization的关键代码就是:
    **************************************************
    Application := SavedApplication;
    Screen := SavedScreen;
    **************************************************
      

  3.   

    我在写DLL的时候都没有加过这样 一样的运行得很好 不知道这样写有什么好处呢?