我有一个可执行文件(我使用 Visual C++ 10 创建的),我需要从我编写的另一个程序(相同的环境)中使用它的功能。由于复杂的部署要求,我不会涉及,从所需的功能构建一个 DLL 并将其加载到两个程序中并不是我能做的事情。
所以我想,我可以__declspec(dllexport)
在EXE中的一些功能,然后LoadLibrary()
让我GetProcAddress()
他们。
显然这是不可能的,尽管当我开始研究它时——它看起来是可行的。
具体来说,当您__declspec(dllexport)
在 EXE 项目中运行时,Visual C++ 还会生成一个lib
用于动态链接的文件——因此您甚至不需要使用LoadLibrary()
——只需链接到生成的库并调用这些函数。
不幸的是,主要问题是当您将生成的文件声明为 EXE 时,Visual C++ 将“CRTmain”入口点添加到生成的文件中,而不是 DLL 获取的“CRTDLLmain”。当 Windows(自动)LoadLibrary()
从您的主程序执行 EXE 时,它不会调用“CRTDLLmain”入口点(因为它不存在),模块的 C 运行时不会被初始化,因此所有有趣的工作(例如内存分配)因有趣的(*)运行时异常而失败。
所以如下,我的问题是:有没有办法让 Visual C++ 将“CRTmain”入口点和“CRTDLLmain”入口点都构建到结果文件中?
(*) “有趣”,就像中国古老的诅咒一样。