Delphi中一些DLL的运用(要传递Application和Screen,似乎还忘了传递提示控件)
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 < 32 then begin MessageBox(0, '没有找到附带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-Exe
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2015-10-12 EE就业最好的方向是转CS,其次是VLSI/ASIC DESIGN & VERIFICATION
2015-10-12 学EE做硬件找工作不如学CS做软件,为什么会这样?
2015-10-12 软件将吞掉整个世界——人类只要开发软件,让软件指挥机器,所有的其它工作智能机器人会帮你(哈哈哈,看完这篇我又爱上了做软件,而且更坚定了)——你迷茫是因为你没有分析未来的能力,这样就不能在低潮时坚持