dll通用操作单元

/// <author>cxg 2019-3-4</author>
/// 装载(释放)DLL
/// 适用于Delphi所有版本 unit ynDLL; interface uses
Classes, Windows, SysUtils; type
TDll = record
dllName: string;
dllHandle: Cardinal;
end; var
dllList: array of TDll; type
TynFun = function(params: string): string; stdcall;
/// <summary>
/// 执行指名DLL里面的指名函数
/// </summary>
/// <param name="dllName">DLL文件名</param>
/// <param name="procName">函数名</param>
/// <param name="inParams">函数入参</param>
/// <returns>结果</returns> function ExecDllProc(const dllName, procName, inParams: string): string;
/// <summary>
/// 释放所有加载的DLL
/// </summary> procedure FreeDllList;
/// <summary>
/// 获取指定文件夹里面的所有文件名,不包括其子文件夹
/// </summary>
/// <param name="path">文件夹</param>
/// <param name="ext">文件扩展名,默认是所有类型</param>
/// <returns></returns> function SearchFiles(path: string; ext: string = '*.*'): TStringList;
/// <summary>
/// 加载指名文件夹里面的所有DLL
/// </summary>
/// <param name="path">文件夹</param> procedure LoadAllDll(path: string); implementation function SearchFiles(path: string; ext: string = '*.*'): TStringList;
var
SearchRec: TSearchRec;
found: integer;
begin
Result := TStringList.Create;
found := FindFirst(path + '\' + ext, faAnyFile, SearchRec);
while found = 0 do
begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and (SearchRec.Attr <> faDirectory) then
Result.Add(SearchRec.Name);
found := FindNext(SearchRec);
end;
FindClose(SearchRec);
end; procedure FreeDllList;
var
i: integer;
begin
for i := Low(dllList) to High(dllList) do
begin
FreeLibrary(dllList[i].dllHandle);
end;
end; procedure LoadAllDll(path: string);
var
list: TStringList;
fullName: string;
i: integer;
handle: Cardinal;
dll: TDll;
begin
list := SearchFiles(path, '*.dll');
SetLength(dllList, list.Count);
for i := 0 to list.Count - 1 do
begin
fullName := path + '\' + list[i];
handle := LoadLibrary(PChar(fullName));
if handle <> 0 then
begin
dll.dllName := list[i];
dll.dllHandle := handle;
dllList[i] := dll;
end;
end;
if Assigned(list) then
list.Free;
end; function ExecDllProc(const dllName, procName, inParams: string): string;
var
LHandle: Cardinal;
LPointer: Pointer;
LDll: TDll;
LSize: Integer; function ExistDll(const dll: string): Cardinal;
var
i: Integer;
s: string;
begin
result := 0;
s := ExtractFileName(dll);
for i := 0 to High(dllList) do
begin
if SameText(s, dllList[i].dllName) then
begin
result := dllList[i].dllHandle;
Exit;
end;
end;
end; begin
Result := '';
if (dllName = '') or (procName = '') then
Exit;
LHandle := ExistDll(dllName);
if LHandle = 0 then
begin
if LHandle = 0 then // dll not loaded
try
LHandle := LoadLibrary(PChar(dllName)); // load dll
LDll.dllName := ExtractFileName(dllName);
LDll.dllHandle := LHandle;
LSize := High(dllList);
if LSize = -1 then // dllList not init
begin
SetLength(dllList, 1);
dllList[0] := LDll;
end
else
begin
SetLength(dllList, LSize + 2);
dllList[LSize] := LDll;
end;
LPointer := GetProcAddress(LHandle, PChar(procName)); // load function
if LPointer <> nil then
begin
Result := TynFun(LPointer)(inParams) // execute function and get result
end;
except
FreeLibrary(LHandle);
end;
end
else
begin // dll is loaded
LPointer := GetProcAddress(LHandle, PChar(procName)); // load function
if LPointer <> nil then
begin
Result := TynFun(LPointer)(inParams) // execute function and get result
end;
end;
end; end.

  

dll通用操作单元的更多相关文章

  1. C++ dll 通用dll编写

    头文件 extern "C" _declspec(dllexport)void AddFunction(); cpp文件 extern "C" _declspe ...

  2. 那些年,用C#调用过的外部Dll

    经常有人找到我咨询以前在csdn资源里分享的dll调用.算算也写过N多接口程序.翻一翻试试写篇随笔. 明华IC读写器DLL 爱迪尔门锁接口DLL 通用OPOS指令打印之北洋pos打印机dll 明泰非接 ...

  3. VC++DLL动态链接库程序

    VC++DLL动态链接库程序 VC++DLL动态链接库程序 C++ DLL 导出函数 使用VS2017等IDE生成dll程序,示例如下: C++ DLL 导出类 1.导出类中第一种方法:简单导出类(不 ...

  4. Quartz.NET配置

    概述 Quartz.NET 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简单性.Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行 ...

  5. Quarzt.NET 任务调度框架

      Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性 ...

  6. windows XP系统内核文件分析(全)

    Windows XP个别 System32 文件 System32 文件夹下个别要移除的文件 我们就要删除另外600 个 system32 文件...我们要一次把它们全都解决掉. 以下是我所删除的 S ...

  7. 使用普通Windows服务创建Quartz.Net服务项目

    Quartz.NET 项目地址 http://quartznet.sourceforge.net/ 源码下载地址:Quartz.Net.2.0 首先创建Quartz.Net.2.0解决方案,添加 Wi ...

  8. 平时Error记录

    The Windows Firewall on this machine is currently 1.This row already belongs to another table. DataT ...

  9. 关于最新版本的log4net使用中遇到的问题

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

随机推荐

  1. C# UDP广播消息

    首先是发送端: /// <summary> /// 发送UDP消息 /// </summary> /// <param name="msg">消 ...

  2. centos7执行 wget命令: command not found的两种解决方法

    1.rpm 安装 下载wget的RPM包: http://mirrors.163.com/centos/6.8/os/x86_64/Packages/wget-1.12-8.el6.x86_64.rp ...

  3. 09 Go 1.9 Release Notes

    Go 1.9 Release Notes Introduction to Go 1.9 Changes to the language Ports ppc64x requires POWER8 Fre ...

  4. python3 pandas DataFrame常见用法

    df = pandas.read_clipboard() df 获取索引和值 df.index df.values DataFrame的values属性将数据以二维ndarray形式返回,dtype类 ...

  5. TcxGrid Sqlite text类型 显示memo

  6. 一个浏览器Fuzzing框架的学习

    一个浏览器Fuzzing框架的学习 关于框架 之前是LCatro师傅在小密圈分享的他写的这个Fuzzing框架(不过我以前翻github时好像就看到过),但是之前一直没啥时间搞这方面,这两天研究学习了 ...

  7. HDU 4348 To the moon(主席树区间修改)

    题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...

  8. MapReduce原理1

    Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算 ...

  9. P1736 创意吃鱼法 图的DP

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  10. 【已解决】Chrome提示:"请停用以开发者模式运行的扩展程序"的解决办法

    chrome用户在安装了一些第三方的chrome插件后,每次打开浏览器的时候都会出现“请停用以开发者模式运行的扩展程序”的提示,只有每次点击取消之后才能正常使用扩展.如下图所示 那么有没有什么方法可以 ...