dll 调用部分:

{****************************************************************}
{ }
{ Project: DllDebug             }
{ Copyright(c) 2003, 2005                 }
{ Unit for UCommonUnit                   }
{ Create : 2003-01-05 by 林红卫             }
{ Modify : 2003-01-16 by 林红卫             }
{ }
{****************************************************************} unit UCommonUnit; interface uses
Windows,
SysUtils,
Forms; type
TRunDLL = procedure(DLLName, FormName, FormCaption: PChar;
aApp: TApplication; Scr: TScreen) stdcall; procedure RunDLLForm(DLLName, FormName, FormCaption: string;
aApp: TApplication; Scr: TScreen) stdcall; implementation procedure RunDLLForm(DLLName, FormName, FormCaption: string;
aApp: TApplication; Scr: TScreen) stdcall;
var
RunDLL: TRunDLL;
GetDllHWND: HWND;
begin
GetDllHWND := LoadLibrary(PChar(DllName));
try
if GetDllHWND < then
begin
MessageBox(, '没有找到附带DLL文件,请确认程序是否完整!',
'加载DLL失败', MB_OK);
Exit;
end; @RunDLL := GetProcAddress(GetDllHWND, 'RunDLL');
if @RunDLL <> nil then
try
RunDLL(PChar(UpperCase(Trim(DLLName))), PChar(UpperCase(Trim(FormName))),
PChar(FormCaption), aApp,Scr);
except
raise Exception.Create('T' + FormName + '不存在!');
end;
finally
FreeLibrary(GetDllHWND);
end;
end; end. dll : {****************************************************************}
{ }
{ Project: UDllTest               }
{ Copyright(c) 2003, 2005                 }
{ Unit for UDllTest                   }
{ Create : 2003-01-05 by 林红卫             }
{ Modify : 2003-01-16 by 林红卫             }
{ }
{****************************************************************} library UDllTest; uses
SysUtils,
Forms,
Messages,
Variants,
Windows,
Classes,
UFrmTestForm1 in 'UFrmTestForm1.pas' {Form1},
UFrmTestForm2 in 'UFrmTestForm2.pas' {Form2}; var
DLLApp: TApplication;
DLLScreen: TScreen; procedure RunDLL(DLLName, FormName, FormCaption: PChar;
aApp: TApplication; Scr: TScreen) stdcall;
var
TheClass: TPersistentClass;
aForm: TForm;
begin
Application := aApp;
Screen := Scr;
RegisterClasses([TForm1, TForm2]); TheClass := GetClass('T' + FormName);
if (TheClass = nil) then
GetLastError; if TheClass.InheritsFrom(TForm)
and (TheClass <> TForm) then
begin
aForm := TForm(TheClass.Create).Create(nil);
aForm.Caption := FormCaption;
try
aForm.ShowModal;
finally
FreeAndNil(aForm);
end;
end;
end; procedure DLLUnloadProc(dwReason: DWORD);
begin
if dwReason = DLL_PROCESS_DETACH then
begin
Application := DLLApp; //恢复
Screen := DLLScreen;
end;
end; exports
RunDLL; begin
DLLApp := Application; //保存 DLL 中初始的 Application 对象
DLLScreen := Screen;
DLLProc := @DLLUnloadProc; //保证 DLL 卸载时恢复原来的 Application
DLLUnloadProc(DLL_PROCESS_DETACH);
end.

http://www.cnblogs.com/kfarvid/archive/2010/07/16/1778930.html

Delphi中一些DLL的运用(要传递Application和Screen,似乎还忘了传递提示控件)的更多相关文章

  1. Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)

    Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...

  2. Delphi控件之---通过编码学习TStringGrid(也会涉及到Panel控件,还有对Object Inspector的控件Events的介绍

    我是参考了万一的博客里面的关于TStringGrid学习的教程,但是我也结合自己的实际操作和理解,加入了一些个人的补充,至少对我有用! 学用TStringGrid之——ColCount.RowCoun ...

  3. Delphi中的dll操作

    利用delphi dll wizard进行dll的编写. 创建:保存时改dll名称 library test2; uses SysUtils, Classes, forms, dialogs; {$R ...

  4. 在delphi中,DLL加载时做初始化的Demo

    library DLLEntry;//dll源码 uses SysUtils, Classes, Dialogs, Windows; {$R *.res} procedure DLLEntryPoin ...

  5. Delphi中使用python脚本读取Excel数据

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  6. [转]Delphi 中动态链接库(dll)的建立和使用

    动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...

  7. Delphi 使用之dll文件生成与调用

    DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...

  8. delphi 中几种多线程操作方式

    在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:http: ...

  9. DELPHI中多线程知识【转】

    本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...

随机推荐

  1. Android中FTP服务器搭建入门

    http://www.2cto.com/kf/201501/374048.html http://blog.csdn.net/smile3670/article/details/44343617  有 ...

  2. C# IO操作(三)文件编码

    在.net环境下新建一个文本文件(所谓文本文件就是直接可以用记事本打开的文件,直接保存字符串)和在系统中新建一个文本文件的编码是不一样的,.net默认采用UTF-8,而中文操作系统采用的是ANSI.如 ...

  3. javascript form 第22节

    <html> <head> <title>Form对象</title> </style> <script type="tex ...

  4. javaee学习-新建servlet 直接返回html

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  5. makefile--#的不正确使用

    /usr/vacpp/bin/makeC++SharedLib -o /cicm/src/dao/testcase/rel/FUNCTEST.ibmcpp -brtl -bnortllib -p100 ...

  6. Windows和Linux下查看Apache、MySQL、PHP版本

    # Windows查看Apache版本: 使用命令:httpd -v # Linux查看Apache版本: 使用命令:apachectl -v # Windows查看MySQL版本: 使用命令:mys ...

  7. jquery 动态添加下拉框 需要增加 煊染 selectmenu("refresh");

    若通过js动态选择下拉框的值必须刷新下拉框,例如:var selArray = $("select#sel");selArray[0].selectedIndex = 1;selA ...

  8. C# Linq简介

    LInq是Language Integrated Query的简称,它是微软在.net framework 3.5里面新加入的特性,用以简化查询查询操作.它主要包含了3块,Linq to Object ...

  9. 可以自动安装mysql数据库的一个shell脚本

    发布:thatboy   来源:脚本学堂     [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...

  10. WPF 控件

    ****ScrollViewer**** 前台: <ScrollViewer  HorizontalScrollBarVisibility="Auto" VerticalSc ...