【发布时间】:2013-10-07 07:00:18
【问题描述】:
我有一个可执行文件(我使用 Visual C++ 10 创建的),我需要从我编写的另一个程序(相同的环境)中使用它的功能。由于复杂的部署要求,我不会详细介绍,因此我无法从所需的功能构建 DLL 并将其加载到两个程序中。
所以我想我可以__declspec(dllexport)EXE中的一些功能,然后LoadLibrary()会让我GetProcAddress()他们。
显然这是不可能的,尽管当我开始研究它时 - 它看起来是可行的。
具体来说,当您在 EXE 项目中使用 __declspec(dllexport) 函数时,Visual C++ 还会生成一个 lib 文件用于动态链接 - 所以您甚至不需要使用 LoadLibrary() - 只需链接到生成的库并调用功能。
不幸的是,主要问题是当您将生成的文件声明为 EXE 时,Visual C++ 会将“CRTmain”入口点添加到生成的文件中,而不是 DLL 获取的“CRTDLLmain”。当 Windows(自动)LoadLibrary() 主程序中的 EXE 时,它不会调用“CRTDLLmain”入口点(因为它不存在),模块的 C 运行时不会被初始化,并且作为结果所有有趣的工作(例如内存分配)都失败并出现了有趣的(*)运行时异常。
如下,我的问题是:有没有办法让 Visual C++ 将“CRTmain”入口点和“CRTDLLmain”入口点都构建到结果文件中?
(*) “有趣”就像中国古语中的诅咒一样。
【问题讨论】:
-
你能在 exe 中公开一个“init”函数来显式初始化 C 运行时吗?
-
@Asaf:我不知道怎么做 - 这是编译器自动执行的操作,据我所知没有公共接口。
-
如果你在 exe 中调试你的'main'函数,我想你会看到为初始化 CRT 调用的确切函数(main() 在某个函数中调用,代码是裸露)。但另一个想法 - 如果 DLL 不可行,为什么不将功能提取到静态库并将其链接到两个 exe 中?
-
1) 是的,但是 CRT 初始化序列是深层 VC++ 私有内部的 - 我宁愿不复制它,尤其是在不了解的情况下,尤其是在未来升级到更新的编译器时。我想我不能使用 API,除非它是公开的。
标签: c windows visual-studio-2010 visual-c++