永利爆大奖安全网址-永利爆大奖线路检测中心

【永利爆大奖安全网址,永利爆大奖线路检测中心】,欢迎来到【LG】娱乐中心,玩你所玩,看你所看,澳门皇冠,太阳集团,澳门太阳赌城,永利402,55402com永利,永利402com,澳门十大赌场,手机网投平台,赌博app官网,永利官网,永利国际,永利皇宫,永利注册,金沙城,金沙官网奥门金沙网址,4166am金沙,我们是一家正规的网上官方平台,自创建以来,以其稳定、安全、快捷和良好的信誉得到了各界同仁的一致认可和好评。期待您的到来!

回调函数的线程推行空间,中的函数

日期:2020-01-04编辑作者:编程应用

调用外界 DLL 中的函数(2. 晚绑定卡塔尔
unit Unit1;

  dll 与 exe 之间的通讯格局有无数种, 本文接受回调函数的秘技实现, 本文也将研讨多线程,多模块的气象下,回调函数所在的线程, 啥也不说了,先附上代码:

interface

 

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

下边包车型大巴是dll模块的的, dll的工程文件:

type
//晚绑定,也正是动态调用外界函数主要用以下八个指令:
//LoadLibrary:获取 DLL
//GetProcAddress:获取函数
//FreeLibrary:释放

 

//定义一个进度类型,参数要和急需的函数后生可畏致
TMB = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

[delphi] view plaincopy

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MB: TMB; {注脚函数 MB}
inst: LongWord; {声圣元(Karicare卡塔尔(قطر‎个变量来记录要动用的 DLL 句柄}
public
{ Public declarations }
end;

 

var
Form1: TForm1;

  1. library DllAPP;  
  2.   
  3. uses  
  4.   windows,  
  5.   SysUtils,  
  6.   Classes,  
  7.   DllClass in 'DllClass.pas';  
  8.   
  9. {$R *.res}  
  10.   
  11.   
  12.  var  
  13.   GDllServer: TDllServer;  
  14.   
  15.   function AddServer(ADispatchFunc: TDispatchFunc): HRESULT; stdcall;  
  16.   begin  
  17.     Result := ERROR_INVALID_FUNCTION;  
  18.     if not Assigned(GDllServer) then  
  19.       Exit;  
  20.     GDllServer.AddServer(ADispatchFunc);  
  21.     Result := ERROR_SUCCESS;  
  22.   end;  
  23.   
  24.   function DataDispatch(ACommand: Integer):HRESULT; stdcall;  
  25.   begin  
  26.     Result := ERROR_INVALID_FUNCTION;  
  27.     GDllServer.DataDispatch(ACommand);  
  28.     Result := 0;  
  29.   end;  
  30.   
  31.   function DLLInitialize: HRESULT;  
  32.   begin  
  33.     Result := 1;  
  34.     GDllServer := TDllServer.create;  
  35.     Result := ERROR_SUCCESS;  
  36.   end;  
  37.   
  38.   function  DllFinalize: HRESULT;  
  39.   begin  
  40.     Result := ERROR_INVALID_FUNCTION;  
  41.     GDllServer.Free;  
  42.     GDllServer := nil;  
  43.     Result := ERROR_SUCCESS;  
  44.   end;  
  45.   
  46. exports  
  47.   AddServer,  
  48.   DataDispatch,  
  49.   DLLInitialize,  
  50.   DllFinalize;  
  51.       
  52. begin  
  53. end.  

implementation

 

{$R *.dfm}

dll中的类型文件

procedure TForm1.FormCreate(Sender: TObject);
begin
inst := LoadLibrary('user32.dll');
if inst <> 0 then
MB := GetProcAddress(inst, 'MessageBoxW');
// MB := GetProcAddress(inst, 'MessageBoxA'卡塔尔国; {Delphi 二〇一〇以前的版本用那句}
end;

 

//调用测量检验:
procedure TForm1.Button1Click(Sender: TObject);
var
t,b: PChar;
begin
t := '标题';
b := '内容';
MB(0, b, t, 0);
end;

[delphi] view plaincopy

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(instState of Qatar; {记得释放}
end;

 

end.

  1. unit DllClass;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9.   
  10. type  
  11.   TDispatchFunc = function(ACommand: Integer): HRESULT;stdcall;  
  12.   
  13. type  
  14.   TDLLSERVER = CLAss;  
  15.   
  16.   TDLLThread = class(TThread)  
  17.   private  
  18.     FCount: Integer;  
  19.     FDllServer: TDllServer;  
  20.   public  
  21.     procedure Execute; override;  
  22.   public  
  23.     constructor create;  
  24.   end;  
  25.   
  26.   TDllServer = class  
  27.   private  
  28.     FDispatchFunc: TDispatchFunc;  
  29.     FDllThread: TDLLThread;  
  30.   public  
  31.     procedure AddServer(ADispatchFunc: TDispatchFunc);  
  32.     procedure DataDispatch(ACommand: Integer);  
  33.   public  
  34.     constructor Create;  
  35.     destructor Destroy;  
  36.   end;  
  37.   
  38. implementation  
  39.   
  40. { TDllServer }  
  41.   
  42. ///保存exe的回调函数指针  
  43. procedure TDllServer.AddServer(ADispatchFunc: TDispatchFunc);  
  44. begin  
  45.   FDispatchFunc := ADispatchFunc;  
  46. end;  
  47.   
  48. constructor TDllServer.create;  
  49. var  
  50.   LThreadID: Cardinal;  
  51. begin  
  52. ///  
  53.   LThreadID := GetCurrentThreadid;  
  54.   ShowMessage('DLL,create:'+IntToStr(LThreadID));  
  55.   FDllThread := TDLLThread.create;  
  56.   FDllThread.FDllServer := Self;  
  57.   FDllThread.Resume;  
  58. end;  
  59.   
  60. ///DLL选拔exe传过来的吩咐, dll留给exe的调用借口  
  61. procedure TDllServer.DataDispatch(ACommand: Integer);  
  62. var  
  63.   LThreadID: Cardinal;  
  64. begin  
  65.   if not Assigned(FDispatchFunc) then  
  66.     Exit;  
  67.   FDispatchFunc(ACommand);  
  68.   LThreadID := GetCurrentThreadid;  
  69.   ShowMessage('DLL,DateDispatch:'+IntToStr(LThreadID));  
  70. end;  
  71.   
  72. destructor TDllServer.Destroy;  
  73. begin  
  74. ////  
  75. end;  
  76.   
  77. { TDLLThread }  
  78.   
  79. constructor TDLLThread.create;  
  80. var  
  81.   LThreadID: Cardinal;  
  82. begin  
  83.   FCount := 0;  
  84.   inherited create(True);  
  85. end;  
  86.   
  87. //那一个函数的指标正是核算区别模块下的不及线程下,回调函数的实行线程  
  88. procedure TDLLThread.Execute;  
  89. var  
  90.   LThreadID: Cardinal;  
  91. begin  
  92.   inherited;  
  93.   while not Terminated do  
  94.   begin  
  95.     Inc(FCount);  
  96.     if FCount = 2  then  
  97.     begin  
  98.       LThreadID := GetCurrentThreadid;  
  99.       ShowMessage('DLL,Thread--'+IntToStr(LThreadID));  
  100.     end;  
  101.     if FCount = 5 then  
  102.     begin  
  103.       if assigned(FDllServer) then  
  104.       begin  
  105.         FDllServer.FDispatchFunc(2);  
  106.       end;  
  107.         
  108.     end;  
  109.     Sleep(1000);  
  110.   end;  
  111. end;  
  112.   
  113. end.  

 

 

exe的文件

 

[c-sharp] view plaincopy

 

  1. unit ExeClass;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TDispatchFunc = function (ACommand: Integer): HRESULT;stdcall;  
  11.   TServerFunc = function (ADispatchFunc: TDispatchFunc): HRESULT;stdcall;  
  12.   TProc = function: HRESULT;  
  13.   
  14. type  
  15.   TForm2 = class(TForm)  
  16.     Button1: TButton;  
  17.     Memo1: TMemo;  
  18.     procedure FormDestroy(Sender: TObject);  
  19.     procedure Button1Click(Sender: TObject);  
  20.     procedure FormCreate(Sender: TObject);  
  21.   private  
  22.     { Private declarations }  
  23.     FServerDispatch: TServerFunc;    ///exe--->dll  
  24.     FDataDispatch: TDispatchFunc;    ///EXE--->DLL  
  25.     FDllInitialize: TProc;  
  26.     FDllFinalize: TProc;  
  27.   public  
  28.     { Public declarations }  
  29.   end;  
  30.   
  31. var  
  32.   Form2: TForm2;  
  33.   GHandleLibrary: THandle;  
  34.   GCount: Integer;  
  35.   
  36. implementation  
  37.   
  38. {$R *.dfm}  
  39.   
  40. ///DLL--->EXE,留给dll调用的回调函数  
  41. function DataDispatch(ACommand: Integer): HRESULT; stdcall;  
  42. var  
  43.   LThreadID: Cardinal;  
  44. begin  
  45.   LThreadID := GetCurrentThreadid;  
  46.   ShowMessage('EXE:'+IntToStr(LThreadID));  
  47. end;  
  48.   
  49. procedure TForm2.Button1Click(Sender: TObject);  
  50. begin  
  51.   Inc(GCount);  
  52.   FDataDispatch(GCount);  
  53. end;  
  54.   
  55. procedure TForm2.FormDestroy(Sender: TObject);  
  56. begin  
  57.   FDllFinalize;  
  58.   FServerDispatch := nil;  
  59.   FDataDispatch := nil;  
  60.   FDllInitialize := nil;  
  61.   FDllFinalize := nil;  
  62.   FreeLibrary(GHandleLibrary);  
  63. end;  
  64.   
  65. procedure TForm2.FormCreate(Sender: TObject);  
  66. var  
  67.   LThreadID: Cardinal;  
  68. begin  
  69.   GHandleLibrary := LoadLibrary(PChar('DLLAPP.dll'));  
  70.   @FDllInitialize := GetProcAddress(GHandleLibrary, 'DLLInitialize');  
  71.   @FDllFinalize := GetProcAddress(GHandleLibrary, 'DllFinalize');  
  72.   @FServerDispatch := GetProcAddress(GHandleLibrary, 'AddServer');  
  73.   @FDataDispatch := GetProcAddress(GHandleLibrary,'DataDispatch');  
  74.   FDllInitialize;  
  75.   FServerDispatch(DataDispatch);  
  76.   LThreadID := GetCurrentThreadid;  
  77.   Memo1.Lines.Add(IntToStr(LThreadID));  
  78. end;  
  79.   
  80. end.  

1,轻便完成的dll与exe之间的报纸发表, 其实就是运用了dll的导出函数, 先想dll传递五个回调函数之处,供dll面向exe的通信。 exe面向dll 的简报直接推行dll导出函数就能够

2, 本文是最大旨的完成,当然在那之中的回调函数,以至dll的管理函数,能够在数据包的等第上贯彻, 即: 定义不相同数据包,依据指令施行不相同的函数, 那样风度翩翩旦导出叁个函数,保留叁个回调函数 就能够完毕大气的效果与利益

3, 关于回调函数的线程实行空间,决意于调用者所在的线程, 比方dll线程中回调exe的函数, 则回调函数是实行在该dll线程。 假使是主线程实践回调,则在主线程。 上述代码GDLLclass的成立进程是导出函数,所以GDLLclass的主线程正是exe的主线程,他们在三个线程空间

 

本文由永利爆大奖安全网址发布于编程应用,转载请注明出处:回调函数的线程推行空间,中的函数

关键词:

读取dll全数输出函数名,进制转变

收获某黄金年代dll全部输出函数名 在uses里加上ImageHlp {*******************************************************} {           ...

详细>>

Linux下tomcat服务器部署web项目

使用工具:SecureFX 7.0,SecureCRT 7.0 JCE cannot authenticate the provider NUIMCSCGIBE IbeProvider.class package nuim.cs.crypto.ibe; 1.将web项目...

详细>>

自定义基类,ThinkPHP学习笔记1

  ThinkPHP 提供了一个 Model 类,供其他的 Model 进行继承。Model 类中是MVC 中的模型类,它是调用 持久层的上层类。感觉...

详细>>

Boot中利用小插件Lombok,Compiler时开启插件的笺注

对此IJ这么些IDE工具以来,大家会设置一些插件来帮忙大家越来越好的举行开拓,像lombok便是生龙活虎款不错的插件,...

详细>>