通过DLL对主程序或其它DLL做扩展的一种方法

一、原理: 通过事件来实现扩展

二、场景: 主DLL----A.DLL

扩展DLL---B.DLL

三、扩展实现:

1、A.DLL中 接口定义

//接口函数定义

TQueryFilterEvent = procedure(const AS: string) of object;

IService = Interface

//Get and Set事件

function  GetQueryFilterEvent: TQueryFilterEvent;

procedure SetQueryFilterEvent(AEvent: TQueryFilterEvent);

property OnQueryFilterEvent: TQueryFilterEvent read GetQueryFilterEvent write setQueryFilterEvent;

End;

2、A.DLL 接口实现

TService = class(TObject, IService)

//实现接口中的方法,并且执行事件

FOnQueryFilter: TQueryFilterEvent;

Function GetQueryFilterEvent: TQueryFilterEvent;

Procedure SetQueryFilterEvent(AEvent: TQueryFilterEvent);

Procedure DoQuery

procedure DoQueryFilter (const AS: string);

End;

Procedure TService.DoQueryFilter(const AS: string);

Begin

if Assigned(FOnQueryFilter) then

FOnQueryFilter (AS);

End;

3、A.DLL 中调用TService;

a.Frame

FService: TService;

procedure Init;

var

s: string;

begin

//通过事件做扩展

FService.DoQueryFilter(s);

end;

4、B.DLL 中事件扩展对IService挂事件

TPlugin = function(const AService: IService): IGBQ4Plugin;

//导出函数

Exports

CreatePlugin;

function CreatePlugin(const AService: IService): IPlugin;

begin

Result := TPlugin.Create(AService);

end;

TPlugin = class(TObject, IPlugin)

protected

FService: IService;

private

procedure ResponseQueryFilterEvent (const AS: string);

protected

procedure Register; virtual;

procedure UnRegister; virtual;

end;

//Register

procedure TPlugin.Register;

begin

//对FService挂事件

FService. OnQueryFilterEvent:= ResponseQueryFilterEvent;

end;

5、A.DLL 中加载B.DLL

TPlugin = function(const AService: IService): IGBQ4Plugin;

FPluginLibHandle: THandle;

FPlugin: IPlugin;

pFunc: TPlugin;

//加载B.DLL

FPluginLibHandle := LoadLibrary(B.DLL);

//得到导出函数

@ pFunc:= GetProcAddress(FPluginLibHandle, ‘CreatePlugin‘);

//得到扩展类

FPlugin := pFunc(FService);

FPlugin.Register;

时间: 2024-10-29 03:41:42

通过DLL对主程序或其它DLL做扩展的一种方法的相关文章

主程序与子程序之间的参数传递的四种方法

主程序调用子程序是,往往需要向子程序传递一些参数,同样,子程序运行的时候也需要把一些结果参数传回给主程序,主程序与子程序之间的这种信息传递称为参数传递,我们把主程序传给子存续的参数称为子程序的入口参数,把由子程序传给主程序的参数称为子程序的出口参数 有多种传递参数的方法,寄存器传递法,约定内存单元传递法,堆栈传递法和CALL后续传递法 4.2.1利用寄存器传递参数 利用寄存器传递参数就是把参数放在约定的寄存器中,这种方法的优点是实行啊你个简单和调用方便,但是由于寄存器的个数有限,并且寄存器往往还

windows做FTPserver的一种方法

一.windows做FTP server可以去下载file zilla然后打开配置一些基本的设置,创建用户设置密码,选择共享目录ftp是基于tcp/ip的,依靠tcp来传输,需要我们提前保证路由是通的,直连的话ip要是同一网段.我们client选择hcl中的交换机,修改接口工作模式是router然后配置与windows pc这边对应网卡的ip在同一网段的ip.然后我们在交换机的命令窗口下切换到用户视图(设备名由尖括号包围),登陆windows 这边的ftp serverps:乱码问题后面再研究,

dll编程导出接口的两种方法

前言: 在vc中到处dll有两种方法: 第一种:是通过模块定义def文件,把要导出的函数接口放在里面,而def文件为链接器提供有关程序的到处,属性等方面的信息. 第二种:在函数声明中加上__declspec(dllexport): 第一种方法示例: 先构建一个名为:mousehook_dll的dll项目: 在hookLoad.h种声明两个接口函数: #pragma once BOOL StartHookEv(HWND hWnd); VOID StopHookEv(void) ; 在hookLoa

C#导入c++ dll报找不到dll文件 masm32调用c++类库

最近需要在C#下调用一个c++ dll库,不管怎样dllimport就是报错找不到该dll文件,路径.函数名称.参数.dllimport参数逐个检查确认无误也无济于事,无奈想用其他语言调用试试,由于是c++的dll照理用c++试最好了,这点事用masm32开发简单快捷就用masm32写了个调用小程序,这其中有个修饰名问题需要注意.使用dumpbin 命令查看c++ dll发现使用的是默认修饰名__cdecl,关于masm32怎样调用c++最简单就是在c++里使用 extern "c",

C#实现Dll(OCX)控件自动注册的两种方法 网上找的 然后 自己试了试 还是可以用的

尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通过“添加引用”的方式将它们纳入到项目中,然后就可以像使用自己的类一样方便的使用它们了.但是,有些Dll库(OCX)文件是需要注册到Windows注册表后才能正常添加和使用的.本文介绍两种为Dll库(OCX)自动注册的方法,为大家提供参考. 首先,大家都知道在Windows的“运行”中,输入“Regs

WPF程序将DLL嵌入到EXE的两种方法

WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了>可以参看地下地址(两篇是一样的): 开源中国 http://my.oschina.net/chinesedragon/blog/308336 CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html 引言 前几一写了一个小工具----<Vi

.Net 程序在自定义位置查找托管/非托管 dll 的几种方法

一.自定义托管 dll 程序集的查找位置 目前(.Net4.7)能用的有2种: 1 #define DEFAULT_IMPLEMENT 2 //#define DEFAULT_IMPLEMENT2 3 //#define HACK_UPDATECONTEXTPROPERTY 4 5 namespace X.Utility 6 { 7 using System; 8 using System.Collections.Generic; 9 using System.IO; 10 using Syst

(转载)DLL动态链接库编程入门之五:MFC扩展DLL

MFC扩展DLL的内涵为MFC的扩展,用户使用MFC扩展DLL就像使用MFC本身的DLL一样.除了可以在MFC扩展DLL的内部使用MFC以外,MFC扩展DLL与应用程序的接口部分也可以是MFC.我们一般使用MFC扩展DLL来包含一些MFC的增强功能,譬如扩展MFC的CStatic.CButton等类使之具备更强大的能力. 使用Visual C++向导生产MFC扩展DLL时,MFC向导会自动增加DLL的入口函数DllMain: C++代码 extern "C" int APIENTRY

8.3 sikuli 集成进eclipse 报错:eclipse中运行提示 Win32Util.dll: Can&#39;t load 32-bit .dll on a AMD 64 bit platform

sikuli运行出现问题:Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform 在64位平台上无法加载32位的dll文件 解决办法:将该工程设置成JDK为32位的 之前eclipse中默认加载的是64位jdk .但由于eclipse中TESTNG需要用到1.7 jdk .为保证在解决问题后,testNG还能正常使用.所以原博主是下了个32位  1.7 jdk,将该工程设置成这个就ok了 解决问题启发来自: http://ww