http://blog.csdn.net/wr960204/article/details/2134157
上几天有人说找遍互联网也找不到内存加载模块能够成功加载DelphiXE2编译出来的的64位DLL的.
看了一下,其实DelphiXE2编译出来的DLL本身是没问题的,而是这些内存加载忽略了X64情况下异常处理和X86不同.而XE2编译出来的 DLL的DLLMain的退出地方用到了halt0,这里面又用的抛异常方式跳出来的.这里就用到了64位PE文件的异常处理部分.而VC等编译的DLL 如果没有用到SEH则不会出现问题.
花了2天写了这个相对可以完整的处理32/64位Windows动态库的加载模块.
上传到了谷歌Code.如果哪位兄弟改了代码记得通知我哦.
http://code.google.com/p/delphi-memory-module/
大家需要看的可以在上面链接的SVN上拉取代码.也可以在这里下载.
很多VC DLL加载不了。。
如果能加载user32.dll这类的系统DLL就好了。^_^
user32.dll是可以加载的.但是加载后没有模块句柄.系统是不知道的.如果你的程序有界面还是会尝试调用user32.dll,会有问题的.
老大,测试了一下,不支持加过壳的DLL
老大,在WIN8 64 位操作系统 下, 用 DELPHI XE 32的DLL 加载失败
如果有新的帮发一个 272487184@QQ.COM
我WIN8.1 X64毫无问题
老大,我的DLL 是带包编译的,用你的加载有问题
用 BTMemoryModule.PAS 就可以加载,老大你有新版的吧
BTMemoryModule.PAS 只找到了32位的
松哥 你的这个加载dll的有崩溃的迹象
delphi xe编译x32位 exe 去加载delphi7 编译的DLL 直接崩溃。。。。
不会啊.我个版本都混合调试过啊
我的是 XE6 这应该跟XE版本没什么关系 我的会崩溃掉 不知道为什么
用法不对,我一直都用最新版Delphi,XE6没问题
代码我没改过 这是我编译的例子
http://pan.baidu.com/s/1nfGQU
D7的exe 带D7的DLL 崩溃, XE 的exe 带D7的DLL 崩溃
自己调试了一下 找到原因了
while importDesc^.Characteristics 0 do
的问题 已修复 3Q
松哥:
遇到麻烦了,win7、Delphi XE3、32位程序,调用DLL函数成功,调用MemFreeLibrary(FM)释放内存后弹出错误:
Access violation at address 00409078 in module ‘程序名.exe’.Read of address 0307C2A4
如果不调用释放(或者不调用DLL函数直接释放)就不会出错,但内存渐长不行啊。
用try *** except,不会在except下弹出异常,貌似在全部代码结束后才弹出的。
在网上找了另一个和您这个功能相同但写法不同的代码,测试后结果还是一样。
我没改您的代码,找不到问题在哪,请松哥帮忙啊!
谢了!
补充:
我是调用DLL函数成功后立即MemFreeLibrary(FM)释放的,刚才发现,用两个按钮,一个调用DLL函数,另一个再释放,这样就不会出错,内存也被减下来了。难道有异步,释放需要延时?求解!
再补充:
确实邪门!延时10秒后释放也报错,调用按钮2的过程来释放也报错,只要在同一个按钮事件中释放就报错。只要分开两个按钮,快速点击都不报错。疑惑…..
老大, 请教下, 调用你的单元加载dll没问题, 但是dll中用到了GetModuleFileName来获取当前dll所在路径, 并且加载这个路径下的其他文件(只读取, 不是加载其他dll)
这时, 内存加载后, 发现GetModuleFileName获取不到路径信息, 这个如何解决呢
网上查了查, 只找到一篇文章说附加个PeBlock, 奈何我才疏学浅没看明白….-_-
https://blog.csdn.net/lisunlin0/article/details/1748173
希望老大有时间能够指点一下
实际上根源在于是内存加载DLL,不存在模块和文件的概念。GetModuleFileName也就有问题。
我之前遇到这个问题都是HOOK这几个函数的。返回我希望给回的文件名。
如果要彻底改变就修改PEB中的模块链表,给它加个模块。这样在操作系统层面看起来就完全是个正常模块,但是似乎又失去了内存加载的意义。
哈 昨天折腾了一天系统, 没来得及看, 感谢老大回复
暂时我使用SetCurrentDirectory来指定工作目录解决了, 不过需要同步修改dll, 好在dll也是自己写的
万分感谢~
不支持加过壳的DLL的问题,松哥能解决一下吗? 谢谢!
用ASPack_2.4压缩后,windows的loadlibrary、GetProcAddress可以自由地加载dll,但用MemGetProcAddress操作就提示读地址为全0