1

我想通过一次调用来编译一个 C++ 项目,WinExec以便使用一些命令行参数启动另一个可执行文件。我不知道在我的项目中要指定哪些设置才能生成不需要 Microsoft 并行 DLL 的可执行文件,我不想在我的目标系统上安装它。有什么提示吗?

症状是应用程序无法启动并且以下事件被写入应用程序日志(免费翻译自法语):

Error, SideBySide, event #33
Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" cannot be found. 

更新:我知道使用WinExec是不好的做法,但它就像一个魅力,微软不可能在任何未来的 API 版本中删除它,不是吗?

4

3 回答 3

7

如果您指定要静态链接运行时(/MT 或 /MTd),您应该很好。项目属性->C/C++->代码生成->运行时库

于 2009-03-27T22:31:38.220 回答
7

如果您只需要 CreateProcess/ShellExecute(WinExec 自 NT 3.1/Win 95 起已弃用),则根本不需要任何运行时库。在Project Properties/Configuration/Linker/Input中启用Ignore All Default Libraries并将 kernel32.lib 添加到Additional Dependencies

于 2009-03-27T22:38:12.760 回答
2

jachymko 和 Josh 已(部分)回答了该解决方案。这是完整的解决方案:

  1. Project Properties / Configuration / Linker / Input / Ignore All Default Libraries设置为Yes并添加kernel32.libAdditional Dependencies。仅此一项不会链接,因为代码会自动引用__security_check_cookieand _WinMainCRTStartup

  2. 移除/GS开关以指示编译器不要注入安全检查代码。为此,将Project Properties / Configuration / C/C++ / Code Generation / Buffer Security Check设置为No

  3. 项目属性/配置/C/C++/代码生成/运行时库设置为多线程 (/MT)

  4. 初始 Visual Studio 2008 生成的代码包含一个名为_tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int). 通过重命名来修改它WinMain并将第三个参数转换为LPSTR.

  5. 项目属性/配置/链接器/高级/入口点设置为WinMain.

通过对默认 C++ 项目的这些更改,代码最终可以编译和链接,并在缺少运行时库的新安装的 Vista 或 XP 上运行。

于 2009-03-28T09:36:37.017 回答