插件库类的功能源代码,如何编写一个插件库类例程


程序窗口编写:

.版本 2
.支持库 iext

.程序集 窗口程序集_启动窗口
.程序集变量 集_当前选中表项, 整数型

.子程序 __启动窗口_创建完毕
.局部变量 文件数组, 文本型, , "0"
.局部变量 i, 整数型
.局部变量 id, 整数型
.局部变量 版本, 版本信息

枚举文件 (取运行目录 (), “*.dll”, 文件数组, 假)
.计次循环首 (取数组成员数 (文件数组), i)
    id = 超级列表框1.插入表项 (, , , , , )
    取文件版本信息 (取运行目录 () + “\” + 文件数组 [i], 版本)
    超级列表框1.置标题 (id, 1, 文件数组 [i])
    超级列表框1.置标题 (id, 2, 版本.描述)
.计次循环尾 ()
超级列表框1.现行选中项 = 0

.子程序 取文件版本信息, , 公开
.参数 文件路径, 文本型
.参数 版本信息, 版本信息, , 返回文件版本信息的数组
.局部变量 临时文本变量, 文本型
.局部变量 临时文本变量C, 文本型
.局部变量 版本信息位置, 字节集
.局部变量 临时文本变量B, 版本信息
.局部变量 版本信息长度, 整数型
.局部变量 内存复制长度, 整数型
.局部变量 内存复制首位置, 整数型
.局部变量 版本信息真实位置, 文本型
.局部变量 临时内存数据存放变量, 字节集

' 重定义数组 (版本信息, 假, 0)
版本信息长度 = GetFileVersionInfoSizeA (文件路径, 0)
.如果 (版本信息长度 ≤ 0)
    返回 ()
.否则
    版本信息位置 = 取空白字节集 (版本信息长度)
    GetFileVersionInfoA (文件路径, 0, 版本信息长度, 版本信息位置)
    .如果真 (VerQueryValueA (版本信息位置, “\VarFileInfo\Translation”, 内存复制首位置, 内存复制长度) = 0)
        返回 ()
    .如果真结束
    临时内存数据存放变量 = 取空白字节集 (内存复制长度)
    RtlMoveMemory (临时内存数据存放变量, 内存复制首位置, 内存复制长度)
    版本信息真实位置 = 取重复文本 (8 - 取文本长度 (取十六进制文本 (取字节集数据 (临时内存数据存放变量, 3))), “0”) + 取十六进制文本 (取字节集数据 (临时内存数据存放变量, 3))
    版本信息真实位置 = 取文本右边 (版本信息真实位置, 4) + 取文本左边 (版本信息真实位置, 4)
    .变量循环首 (1, 12, 1, 版本信息长度)
        .如果真 (VerQueryValueA (版本信息位置, “\StringFileInfo\” + 版本信息真实位置 + “\” + 多项选择 (版本信息长度, “Comments”, “CompanyName”, “FileDescription”, “FileVersion”, “InternalName”, “LegalCopyright”, “LegalTrademarks”, “OriginalFilename”, “PrivateBuild”, “ProductName”, “ProductVersion”, “SpecialBuild”), 内存复制首位置, 内存复制长度) ≠ 0)
            临时内存数据存放变量 = 取空白字节集 (内存复制长度)
            RtlMoveMemory (临时内存数据存放变量, 内存复制首位置, 内存复制长度)
            临时文本变量 = 取字节集数据 (临时内存数据存放变量, 10)
            .如果真 (临时文本变量 ≠ “”)
                .判断开始 (版本信息长度 = 1)
                    临时文本变量B.备注 = 临时文本变量
                .判断 (版本信息长度 = 2)
                    临时文本变量B.公司名 = 临时文本变量
                .判断 (版本信息长度 = 3)
                    临时文本变量B.描述 = 临时文本变量
                .判断 (版本信息长度 = 4)
                    临时文本变量B.文件版本 = 临时文本变量
                .判断 (版本信息长度 = 5)
                    临时文本变量B.内部名称 = 临时文本变量
                .判断 (版本信息长度 = 6)
                    临时文本变量B.版权 = 临时文本变量
                .判断 (版本信息长度 = 7)
                    临时文本变量B.合法商标 = 临时文本变量
                .判断 (版本信息长度 = 8)
                    临时文本变量B.原文件名 = 临时文本变量
                .判断 (版本信息长度 = 9)
                    临时文本变量B.个人用编译版说明 = 临时文本变量
                .判断 (版本信息长度 = 10)
                    临时文本变量B.产品名称 = 临时文本变量
                .判断 (版本信息长度 = 11)
                    临时文本变量B.产品版本 = 临时文本变量
                .默认
                    临时文本变量B.特殊编译版说明 = 临时文本变量
                .判断结束
                版本信息 = 临时文本变量B
            .如果真结束

        .如果真结束

    .变量循环尾 ()
.如果结束


.子程序 枚举文件, 整数型, , 枚举某个目录下的指定类型文件;成功返回文件数量;
.参数 欲寻找的目录, 文本型, , 文件目录
.参数 欲寻找的文件名, 文本型, , 如果寻找全部文件可以填入*.*,或*.txt只找txt文件
.参数 文件数组, 文本型, 参考 可空 数组, 用于装载文件数组的变量;把寻找到的文件都放在这个数组里,并返回;
.参数 是否带路径, 逻辑型, 可空, 默认为假; 真=带目录路径,如C:\012.txt; 假=不带,如 012.txt;
.局部变量 局_文件名, 文本型
.局部变量 局_目录, 文本型

局_目录 = 欲寻找的目录
.如果真 (取文本右边 (局_目录, 1) ≠ “\”)
    局_目录 = 局_目录 + “\”
.如果真结束
局_文件名 = 寻找文件 (局_目录 + 欲寻找的文件名, )
.判断循环首 (局_文件名 ≠ “”)
    .如果 (是否带路径)
        加入成员 (文件数组, 局_目录 + 局_文件名)
    .否则
        加入成员 (文件数组, 局_文件名)
    .如果结束
    ' 处理事件 ()
    局_文件名 = 寻找文件 (, )
.判断循环尾 ()
返回 (取数组成员数 (文件数组))

.子程序 装载, 整数型, 公开, 调用失败返回-1,调用成功返回DLL函数指针。
.参数 Dll路径, 文本型, , DLL完整路径
.参数 函数名称, 文本型, , 要调用的子程序命令名称
.参数 模块句柄, 整数型, 参考, 需要释放的话,使用:FreeLibrary (模块句柄)
.局部变量 函数地址, 整数型

模块句柄 = LoadLibraryA (Dll路径)  ' 载入指定的动态链接库,并将它映射到当前进程使用的地址空间
.如果真 (模块句柄 = 0)  ' 载入失败,返回-1
    返回 (-1)
.如果真结束
函数地址 = GetProcAddress (模块句柄, 函数名称)  ' 取DLL函数指针
.判断开始 (函数地址 ≠ 0)  ' 指针获取成功,返回地址;获取失败,释放动态链接库
    返回 (函数地址)
.默认
    FreeLibrary (模块句柄)  ' 释放动态链接库
.判断结束
返回 (-1)

.子程序 执行, 整数型, 公开, 支持多个参数,第一个参数未:载入DLL时,获得的DLL函数指针
.参数 子程序地址
.参数 参数1, , 可空
.参数 参数2, , 可空
.参数 参数3, , 可空
.参数 参数4, , 可空
.参数 参数5, , 可空
.参数 参数6, , 可空
.参数 参数7, , 可空
.参数 参数8, , 可空
.参数 参数9, , 可空
.参数 参数10, , 可空
.参数 参数11, , 可空
.参数 参数12, , 可空
.参数 参数13, , 可空
.参数 参数14, , 可空
.参数 参数15, , 可空

置入代码 ({ 86, 190, 15, 0, 0, 0, 141, 77, 8, 141, 76, 241, 252, 139, 65, 4, 133, 192, 116, 2, 255, 49, 78, 131, 233, 8, 133, 246, 117, 239, 255, 85, 8, 94, 201, 194, 124, 0 })
返回 (0)

.子程序 释放, 逻辑型, 公开, 如果DLL中线程正在执行或者窗口未销毁等,执行该命令会导致整个程序结束。
.参数 模块句柄, 整数型

返回 (FreeLibrary (模块句柄) = 0)

.子程序 _超级列表框1_当前表项被改变

超级列表框1.置图片 (集_当前选中表项, 0, 0)
超级列表框1.置图片 (超级列表框1.现行选中项, 0, 1)
集_当前选中表项 = 超级列表框1.现行选中项

.子程序 _按钮1_被单击
.局部变量 addr, 整数型
.局部变量 path, 文本型
.局部变量 句柄, 整数型

path = 取运行目录 () + “\” + 超级列表框1.取标题 (超级列表框1.现行选中项, 1)
addr = 装载 (path, “go”, 句柄)
输出调试文本 (path)
.如果真 (addr ≠ -1)
    执行 (addr, 222)
    释放 (句柄)
.如果真结束

自定义数据类型:

.版本 2

.数据类型 版本信息, 公开
    .成员 备注, 文本型
    .成员 公司名, 文本型
    .成员 描述, 文本型
    .成员 文件版本, 文本型
    .成员 内部名称, 文本型
    .成员 版权, 文本型
    .成员 合法商标, 文本型
    .成员 原文件名, 文本型
    .成员 个人用编译版说明, 文本型
    .成员 产品名称, 文本型
    .成员 产品版本, 文本型
    .成员 特殊编译版说明, 文本型

Dll:

.版本 2

.DLL命令 LoadLibraryA, 整数型, "kernel32", "LoadLibraryA", , 载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源  成功则返回库模块的句柄,零表示失败。会设置GetLastError
    .参数 lpLibFileName, 文本型, , 指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序;

.DLL命令 GetProcAddress, 整数型, "kernel32", "GetProcAddress", , 返回函数地址
    .参数 hModule, 整数型
    .参数 lpProcName, 文本型

.DLL命令 FreeLibrary, 整数型, "kernel32", "FreeLibrary", , 释放指定的动态链接库,它们早先是用LoadLibrary ;    API函数装载的  非零表示成功,零表示失败。会设置GetLastError
    .参数 hLibModule, 整数型, , 要释放的一个库句柄在VB里使用只能用这个函数释放那些由应用程序明确装载的DLL。对LoadLibrary的每一次调用都应该有一个对应的FreeLibrary调用;

.DLL命令 GetFileVersionInfoSizeA, 整数型, "VERSION.DLL", "GetFileVersionInfoSizeA"
    .参数 文件名称, 文本型
    .参数 文件句柄, 整数型, , 添入0

.DLL命令 GetFileVersionInfoA, 整数型, "VERSION.DLL", "GetFileVersionInfoA"
    .参数 文件名称, 文本型
    .参数 指定句柄, 整数型, , win32中未用
    .参数 缓冲变量长度, 整数型
    .参数 装载缓冲变量, 字节集, 传址

.DLL命令 VerQueryValueA, 整数型, "VERSION.DLL", "VerQueryValueA"
    .参数 内存块首区域位置, 字节集, 传址
    .参数 版本信息相对路径, 文本型, 传址
    .参数 装载缓冲变量, 整数型, 传址
    .参数 缓冲变量长度, 整数型, 传址

.DLL命令 RtlMoveMemory, , , "RtlMoveMemory"
    .参数 目标数据, 字节集, 传址
    .参数 源数据, 整数型
    .参数 内存长度, 整数型

声明:GhostKylin‘S BLOG|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 插件库类的功能源代码,如何编写一个插件库类例程


你好!世界!XladminShell箱子仅供个人学习使用务必遵守《网络安全法》