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. ASP.NET MVC3 Model的常用验证示例

    1.金额(10位整数,2位小数) #region 余额 /// <summary> /// 余额 /// </summary> [DisplayName("余额&qu ...

  2. Springboot:java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required

    参考解决网址:https://www.cnblogs.com/studyDetail/p/7017911.html,谢谢. 数据库查询时报错:java.sql.SQLNonTransientConne ...

  3. like语句防止SQL注入

    mysql: select * from test where school_name like concat('%',${name},'%')   oracle: select * from tes ...

  4. 二十三、springboot之session共享

    通过redis实现session共享 SpringBoot集成springsession 1.引入依赖(gradle方式) dependencies { compile('org.springfram ...

  5. poj1221

    dp #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...

  6. 3.操作jQuery集合《jquery实战》

    3.1 创建HTML元素 使用 jquery 创建动态元素是相当容易的.可以通过 $() 函数包含一个 HTML 标签的字符串来创建. $('<div>Hello</div>' ...

  7. Java编程的逻辑 (11) - 初识函数

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  8. Codeforces 486E LIS of Sequence

    LIS of Sequence 我们先找出那些肯定不会再LIS里面. 然后我们从前往后扫一次, 当前位置为 i , 看存不存在一个 j 会在lis上并且a[ j ] > a[ i ], 如果满足 ...

  9. [USACO16JAN]子共七Subsequences Summing to Sevens

    [USACO16JAN]子共七Subsequences Summing to Sevensa[i]表示前缀和如果a[i]%7==t&&a[j]%7==t那么a[j]-a[i-1]一定是 ...

  10. 使用djcelery发送邮件

    发送邮件作为一个独立的业务模块,我们把它放到另外一个文件中,定义一个task文件,里面定义发送邮件的功能, 需要用到django.core.mail 里面的send_mail这个函数 发送邮件与网络环 ...