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
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
解决方案 »
- 有交通工具了
- 用没有办法在MEMO中贴入一个WORD的表格???????
- 如何在文本中任意地方插入一行空行?
- TTreeView的ShowLines属性简单问题! 200409
- 什么获得一个*.jpg的任一象素点颜色???
- 兄弟们!MSN上新认识一个mm,死活不理我,求高手支招!(其实就是找个借口散分啦~)
- 兄弟们怎么去掉chart中的网格,用程序实现急呀!!(在线等待)
- 为什么delphi写的*.ocx在vb或.net里不能安装?
- 结构体的问题
- 请教这个网站如何登陆,我总是登陆不了,用idhttp登陆,或者用webbrowser登陆获取cookie,再用idhttp去get,位登陆状态就OK
- 一个程序出错,请高手帮帮忙!
- 阻塞型Socket的例子下载不了,能发给我一份吗?
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 的值在复原成原来的值。有借有还嘛!!
应该是这样:
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;
**************************************************