vs【生成 cmd.exe 时出错】 解决方案

本文介绍了解决在Visual Studio 2005中运行CLR-Windows窗体应用程序时出现的“errorPRJ0003:生成cmd.exe时出错”的问题。通过正确设置环境变量,具体步骤为:在“工具”菜单中选择“选项”,然后勾选“显示所有设置”,接着在“项目和解决方案”选项中添加指定路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直被一个问题所困扰,那就是运行CLR—Windows窗体应用程序的时候,即使什么代码也不写,直接编译运行也会报错:“error PRJ0003 : 生成 cmd.exe 时出错” 。

一直在查找资料,看到是因为vs2005的环境变量设置不对,应该如下解决:

solution:

tools=> Options => Projects and Solutions -> VC++ Directories page

then place below rows:

$(SystemRoot)/System32
$(SystemRoot)
$(SystemRoot)/System32/wbem

但是我一直没有找到Projects and Solutions ,最后才发现原来是由于“工具”-〉“选项”里的“显示所有设置”没有勾选,只要勾上就会有“项目和解决方案”的选项,在该项目下添加 $(SystemRoot)/System32
$(SystemRoot)
$(SystemRoot)/System32/wbem

就ok了。

【转:http://blog.youkuaiyun.com/xxfigo/archive/2007/11/21/1897155.aspx

### 关于MIDL编译器生成类型库失败的问题分析 在使用 `midl.exe` 编译遇到错误 `SaveAllChanges Failed` 并导致 `.tlb` 类型库文件无法成功生成的情况,通常涉及以下几个方面的原因: #### 1. **基础类型的定义不匹配** 某些基本类型可能未被 `MIDL` 支持,或者其定义依赖于其他头文件。在这种情况下,`Oaidl.idl` 文件会被自动导入以提供这些基础类型的定义[^2]。然而,如果项目环境中缺少必要的头文件路径配置,则可能导致编译失败。 解决方法之一是确认开发环境已正确设置包含路径,确保能够找到并解析 `Oaidl.idl` 及其所依赖的其他 IDL 文件(如 `Objidl.idl`, `Unkwn.idl`, 和 `Wtypes.idl`)。可以通过以下命令验证路径是否有效: ```cmd midl /I "C:\Program Files (x86)\Windows Kits\10\Include\<version>\um" input_file.idl ``` #### 2. **类型库加载过程中的指针校验问题** 当类型库被加载到内存中后,`OLEAUT32.dll` 模块会对传入的指针进行 NULL 判断。如果此指针为空或指向非法地址,则可能会引发运行异常或编译期错误[^1]。因此,在编写 IDL 文件需特别注意参数的有效性和一致性。 建议检查输入给 `midl.exe` 的源码是否存在潜在的风险点,比如是否有悬空指针传递至外部调用者处;另外还需保证所有自定义结构体都遵循 COM 接口规范,并显式声明 `[in]`, `[out]` 属性以便更精确地控制数据流动方向。 #### 3. **资源脚本嵌入操作不当** 即使成功创建了 `.tlb` 文件,但如果后续未能将其正确嵌入目标 DLL 或 EXE 中也可能造成最终产物不可用的现象[^4]。具体表现为虽然表面上看似乎完成了整个构建流程但实际上并未真正完成最后一步——即将生成好的类型库附加到实际应用程序上供客户端访问。 针对这种情况应该仔细阅读官方文档了解如何恰当地运用 resource scripts 来实现这一目的。一般做法是在 Visual Studio 工程属性页里指定要链接哪些额外资源文件(.res),然后再重新启动完整的编连环节直至观察到预期效果为止。 #### 4. **系统兼容性差异带来的挑战** 不同版本的操作系统之间可能存在细微差别影响着我们能否顺利利用特定位置下的 TypeLib 进行攻击向量探索活动[^5]。例如,在较新的 Win10 上发现了一个允许 SYSTEM 用户写权限的位置存放有 SysFxUI.dll 对应的 TLB 数据包;而在旧版Win7环境下则另有他选如 .NET Framework v4.x 版本目录下预置的企业服务组件关联项等等... 这提示我们在设计跨平台解决方案候要考虑周全各种可能性因素以免遗漏重要细节部分从而降低整体成功率水平线。 --- ### 提交代码样例展示修复思路 下面给出一段简单的示例程序用于演示上述理论的实际应用情形: ```cpp // Example IDL File Content [ uuid(XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX), version(1.0) ] library MyLibrary { importlib("oaidl.lib"); importlib("oleaut32.lib"); [ object, uuid(YYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYY), dual, helpstring("IMyInterface Interface"), pointer_default(unique) ] interface IMyInterface : IDispatch{ [id(1)] HRESULT Method([in] BSTR strInput, [out,retval] long *pResult); }; }; ``` 随后按照标准步骤依次执行如下指令即可获得期望成果: ```bash midl myinterface.idl link /DLL /OUT:mydll.dll *.obj oledll.lib rc myresources.rc link /DLL /OUT:finalproduct.dll *.obj *.res oledll.lib ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值