外部调用DLL里面的载入窗口, 由于DLL是编译后的程序或者注入了别的进程,Dll不能支持窗口类的操作我们必须借助窗口消息循环等办法,特别是采用了线程调用的时候。
DLL写法1
.版本 2 .支持库 EThread .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码 启动线程 (&dll_windeow, , ) _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 返回值被忽略。 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 .子程序 dll_windeow, , 公开, 在这个函数里写代码! 载入 (窗口1, , 真)
这种写法,必须这样调用,这样会自动加载窗口1
dll句柄 = LoadLibraryA (编辑框2.内容)
DLL写法2
我们借助第三方模块,实现窗口消息循环。这里调用了“黑月界面类插件
”中的 黑月消息循环
.版本 2 .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 返回值被忽略。 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 .子程序 Show_Dialog, , 公开 载入 (窗口1, , 假) 黑月消息循环 (窗口1.取窗口句柄 ())
这样随便调用,不至于线程调用,都能轻松载入窗口1
DLL写法3
采用子程序指针循环
.版本 2 .程序集 程序集1 .程序集变量 集_子程序指针, 子程序指针 .子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码 ' ’启动线程 (&hd, , ) _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 返回值被忽略。 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 .子程序 hd, , 公开, 这段代码请不要改动! .参数 子程序指针, 子程序指针 集_子程序指针 = 子程序指针 载入 (窗口1, , 真)
外部线程调用源码
.版本 2 .支持库 spec .支持库 EThread .子程序 _按钮2_被单击 .局部变量 函数地址 .局部变量 地址 .局部变量 线程句柄, 整数型 .局部变量 线程ID, 整数型 ' 取得DLL函数地址 函数地址 = GetProcAddress (dll句柄, 编辑框3.内容) ' 申请内存地址以便存放参数 地址 = 申请内存 (取文本长度 (编辑框3.内容), ) ' ’把参数写到内存 写到内存 (编辑框3.内容, 地址, ) ' 可以用远程线程调用已注入其它程序DLL的函数 线程句柄 = CreateThread (0, 0, 函数地址, 地址, 0, 线程ID) 调试输出 (线程句柄) .如果真 (等待线程 (线程句柄, 100)) 关闭线程句柄 (线程句柄) 释放内存 (地址) .如果真结束 .子程序 _按钮3_被单击 .如果真 (FreeLibrary (dll句柄) ≠ 0) dll句柄 = 0 .如果真结束 .子程序 _按钮4_被单击 dll句柄 = LoadLibraryA (编辑框2.内容) .如果真 (dll句柄 < 1) 信息框 (“载入DLL失败”, 48, “提示”) 返回 ()