我有一个可执行文件(我是使用VisualC++10创建的),我需要从我编写的另一个程序(相同的环境)中使用它的功能。由于复杂的部署需求,我不会进入,从所需的功能构建一个DLL并在两个程序中加载它不是我能做的事情。
所以我想我可以在EXE中__declspec(dllexport)一些函数,然后LoadLibrary()会允许我对它们进行GetProcAddress()。
显然,这是不可能的,虽然当我开始研究它-它看起来是可行的。
具体来说,当您在EXE项目中使用__declspec(dllexport)函数时,VisualC++还会生成一个用于动态链接的lib文件--因此您甚至不需要使用LoadLibrary() --只需针对结果库链接并调用这些函数。
不幸的是,当您将结果文件声明为EXE时,VisualC++将"CRTmain“入口点添加到结果文件中,而不是DLL获取的"CRTDLLmain”。当Windows (自动)从您的主程序中LoadLibrary() EXE时,它不会调用"CRTDLLmain“入口点(因为它不存在),模块的C运行时不会被初始化,因此所有有趣的工作(例如内存分配)都会由于有趣的(*)运行时异常而失败。
因此,我的问题是:是否有一种方法可以使VisualC++同时生成"CRTmain“入口点和 "CRTDLLmain”入口点?
(*)“有趣”,如在一个古老的中国诅咒中。
发布于 2014-04-22 16:05:14
简短的回答是“不”。看了很久之后,没有办法让VC++做我想做的事情,而且很可能没有其他编译器。
主要问题是,大多数人知道和喜爱的main()入口点并不是C++可执行文件中的真正入口点:编译器需要做大量初始化工作才能使"C++运行时库“达到可用状态,并初始化全局、静态等。这种初始化在共享库中使用的代码与在可执行文件中使用的代码不同,并且没有办法让其中一种行为类似于另一种代码。
可以做的一件事是将共享功能构建到DLL中,由主可执行文件将DLL作为资源嵌入,并从可执行文件的内存映射区域加载它(有几个代码示例,如何在堆栈溢出和web的其他地方使用VC++完成此操作)。现在,另一个程序可以通过从捆绑可执行文件加载DLL来完成同样的任务。
发布于 2015-11-11 20:44:01
是的是可能的。
http://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible
其想法是:( a)修补IAT,b)在调用出口之前调用CRT。
发布于 2013-10-01 08:13:05
简单地说不!问题是CRT和您想要加载的EXE中使用了一些全局变量。你主要的EXE也是这样做的。那么内存分配应该如何工作呢?
如果您想要使用这样的结构,您必须使用DLL来了解线程处理,CRT初始化和所有其他内容。你需要这个!
但是COM自动化呢?在一个EXE中从另一个EXE中使用您的代码不是一个简单的解决方案吗?
https://stackoverflow.com/questions/19110747
复制相似问题