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. 第三篇、C_双向链表(循环链表)

    简介: 在用C/C++开发系统中,我们知道用数组或者单链表来开发,如果是数据比较大的话,性能很不好,效率也不高.因此常常需要考虑系统的实用性,常常采用双向链表来开发. 示例: 1.数据 typedef ...

  2. 第22条:理解NSCopying协议

    如果想自定义类支持拷贝操作,那就要实现NSCopying协议(而不是复写copy方法)或 NSMutableCopying的协议. 不可变版本的拷贝: NSCopying协议,该协议只有一个方法: - ...

  3. HTTP 和 Socket 的区别

    要弄明白 http 和 socket 首先要熟悉网络七层:物 数 网 传 会 表 应,如图1 如图1 HTTP 协议:超文本传输协议,对应于应用层,用于如何封装数据. TCP/UDP 协议:传输控制协 ...

  4. ios开发之UIView的frame、bounds跟center属性的区别(附图)

    博文暂时想到什么写什么,不顺理成章,不顺章成篇. 先看几个概念 坐标点Poit:向右侧为X轴正方向的值x,原点下侧为Y轴正方向的值y 大小Size:由宽度width和高度height构成,表示一个矩形 ...

  5. <a>多颜色标签点击之后保持原色的一次实践, Ext Panel下解决及通用方案思路

    代码为片段, 需要自行设置全部环境方可全部运行. 案例背景 使用Ext开发了一个表格,需要根据一列值来动态设置颜色. 效果如下: 说明: 不同行显示不同的内容, 作为标题行, 可以点击链接到其他地方. ...

  6. C# 高精度减法 支持小数(待优化)

    是现实思路 1,先小数点补位,8913758923475893274958738945793845-4893127498372459823745324532453245.284929384729837 ...

  7. Vue.js中Directive知识

    近期所学的Vue.js这个MVVM前端技术缓解了我一直愁于前后端开发杂糅所带来的痛苦.今天就来说说关于Vue.js里面的Directive知识. Directive Directive看上去虽然和An ...

  8. JDBC-ODBC桥接访问SQLServer2008数据库

    来源:十二随风博客 将对JDBC API的调用,转换为对另一组数据库连接API的调用优点:可以访问所有ODBC可以访问的数据库缺点:执行效率低.功能不够强大 (1)建立数据源,注意系统DNS才行,用户 ...

  9. form表单重置

    Jquery中重置表单的错误姿势 $('#yigeform').reset() 正确姿势 $('#yigeform')[0].reset()

  10. iOS极光推送集成步骤

    1.下载SDK,导入Xcode 2.在苹果开发者中心建立AppId与bundleID进行关联,注意勾选推送功能 3.在苹果开发者中心建立推送证书 4.在极光后台建立应用且上传推送证书 5.建立描述文件 ...