从归档

时间:2015-07-30 12:05:32

标签: c++ dll

我目前正在编写一个应用程序,我希望尽可能广泛地使用它 - >除核心功能外,每个组件都应被视为一个扩展。

基本上我提供了需要实现的抽象类(头文件)和静态库。另外,我提供了.py文件,其中包含.component文件的抽象类和示例,基本上是.ini文件 - 用户应该声明class_namepython_class_name等等。

所以最终用户需要创建DLL,python脚本,.ini文件。然后压缩到扩展名为package的存档中。那就是计划。

我的应用程序应该查找.package文件,解压缩它,从那里获取.component文件,读取它,按名称从DLL加载类,创建对象并将其存储在全局对象寄存器里面应用。然后我创建c++python桥(知道python类实现了什么接口有很多帮助),它允许按名称调用python方法。 python脚本也应该存储到zip中。

我基本上有两个问题:

1. Is it possible to load DLL from `.zip` in runtime? I believe its hardly possible without creating temporary unzipped file and then deleting it.
2. Is there other to load DLL except basic approach with `windows.h` header? I use `boost` library there and there, maybe there is some way to do it?

据我所知,对于压缩而言,使用zlib没有更好的解决方案,所以我打算使用它。

2 个答案:

答案 0 :(得分:2)

  1. 可以从zip /内存加载DLL。实际上很多exe包装工/病毒会手动加载dll。

  2. 这实际上是第一个问题的问题。

  3. LoadLibrary的功能是什么?

    Mapping or loading the DLL into memory.
    Relocating offsets in the DLL using the relocating table of the DLL (if present).
    Resolving the dependencies of the DLL, loading other DLLs needed by this DLL and resolving the offset of the needed functions.
    Calling its entrypoint (if present) with the DLL_PROCESS_ATTACH parameter.
    

    您可以编写自己的代码来手动加载库。但是,如果您没有像LoadLibrary那样加载dll,则可能存在一些限制。

    参考:http://www.codeproject.com/Tips/430684/Loading-Win-DLLs-manually-without-LoadLibrary

答案 1 :(得分:2)

你可以从内存加载.dll库,至少可以使用简单的.dll而不需要更多的依赖。

您所做的是模拟LoadLibrary的功能。自己解析PE可执行文件,调用VirtualAlloc,设置正确的页面属性,复制有效负载,进行重定位,并查找符号。

快速搜索显示详细而简单的教程here

请注意,这也可能会破坏某些病毒扫描程序。