LoadLibrary()一个EXE?

时间:2013-10-01 07:48:59

标签: c windows visual-studio-2010 visual-c++

我有一个可执行文件(我使用Visual C ++ 10创建),我需要使用我编写的另一个程序(相同环境)的功能。由于我不会进入复杂的部署要求,从所需的功能构建DLL并在两个程序中加载它不是我能做的。

所以我认为我可以__declspec(dllexport) EXE中的某些功能,然后LoadLibrary()会让我GetProcAddress()

显然这不可能做到,但是当我开始研究它时 - 它看起来很可行。

具体来说,当您在EXE项目中__declspec(dllexport)运行时,Visual C ++还会为动态链接生成lib文件 - 因此您甚至不需要使用LoadLibrary() - 只需链接生成的lib并调用函数。

不幸的是,主要的问题是,当您将结果文件声明为EXE时,Visual C ++会添加" CRTmain"进入生成的文件的入口点,而不是" CRTDLLmain"一个DLL得到。当Windows(自动)LoadLibrary()来自主程序的EXE时,它不会调用" CRTDLLmain"入口点(因为它不存在),模块的C运行时不会被初始化,因此所有有趣的工作(例如内存分配)都会因有趣的(*)运行时异常而失败。 / p>

如下所示,我的问题是:有没有办法让Visual C ++在结果文件中构建" CRTmain"入口点" CRTDLLmain"切入点?

(*)"有趣"就像在一个古老的中国诅咒中一样。

3 个答案:

答案 0 :(得分:10)

是的,这是可能的。

http://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible

这个想法是:a)修补IAT,b)在调用你的出口之前调用CRT。

答案 1 :(得分:0)

根本没有! 问题是CRT和你想加载的EXE使用了一些全局变量。你主要的EXE做同样的事情。那么内存分配应该如何工作呢?

如果你想使用这样的结构,你必须使用DLL来意识到多线程,CRT初始化和所有这些其他的东西。你需要这个!

但COM自动化怎么样?在一个EXE中使用您的代码不是一个简单的解决方案吗?

答案 2 :(得分:-1)

简短的回答是“不”。在远远地观察之后,没有办法让VC ++做我想做的事情,而且很可能没有任何其他编译器。

主要问题是大多数人都知道并喜欢的main()入口点不是C ++可执行文件的真正入口点:编译器需要做很多初始化工作才能获得“C ++运行时库”到一个可用的状态,以及初始化全局,静态等。这种初始化在共享库中使用的代码不同于可执行文件中的代码,并且没有办法像其他代码一样。

可能可以做的一件事是将共享功能构建到DLL中,并将主要可执行文件嵌入DLL作为资源,并从可执行文件的内存映射区域加载它(有几个)代码示例如何使用VC ++在stackoverflow和Web上的其他地方执行此操作。现在,另一个程序可以通过从捆绑可执行文件加载DLL来执行相同的操作。