当项目名称带有连字符时,为啥 VS 2010 ATL 简单对象向导不会生成 .cpp/.h 文件?

Posted

技术标签:

【中文标题】当项目名称带有连字符时,为啥 VS 2010 ATL 简单对象向导不会生成 .cpp/.h 文件?【英文标题】:Why won't VS 2010 ATL Simple Object wizard generate .cpp/.h files when project name has hyphen?当项目名称带有连字符时,为什么 VS 2010 ATL 简单对象向导不会生成 .cpp/.h 文件? 【发布时间】:2013-02-19 05:01:36 【问题描述】:

这既是一个问题,也是 Visual Studio 项目命名的“提示”。

我正在 VS 2010 中构建一个 ATL/COM 项目,当我运行 Add --> Class --> ATL Simple Object 向导来创建类 Foo 时,只有 Foo.rgs文件已创建,但未显示预期的 Foo.cpp 和 Foo.h 文件。

经过几次尝试使向导工作的变体(检查了不同的选项等等),我仍然没有成功。没有错误消息,除了输出中的“无源文件”之外,没有任何迹象表明发生了故障。

在尝试寻找“为什么会这样”的答案的过程中,我遇到了一个提示,即需要使用 ProjectName.ClassName 手动填写相关项目和类的 ProgID 字段。当我尝试输入项目名称(Some-Project)时,向导抱怨连字符在该字段中是“非法字符”。

此处的“为什么 ATL 向导不生成文件”的网络搜索和变体搜索也空无一物。

因此,猜测 ProgID 字段中的“不允许使用破折号”可能会产生进一步的影响,我着手将项目名称、文件名、目录名称等中的所有破折号更改为下划线,看看会产生什么影响有。在整个项目中,“Some-Project”变成了“Some_Project”,“Random-Module.*”变成了“Random_Module.*”。

所有破折号/连字符都转换为下划线后,向导运行正确,所有预期的文件都神奇地出现了,其中包括所有必需的 COM/ATL 管道材料。

所以。 . .

1) 知道为什么名称中带有破折号的项目是“合法的”,但破折号会破坏向导吗?

2) 不管是什么原因,我建议不要在 Visual Studio 项目名称中使用破折号/连字符。

【问题讨论】:

您是否在 Microsoft Connect 上向 Microsoft 提出过这个问题? 还没有。我想这种对话在我未来的某个地方。 因此,您想在 ProjectName.ClassName 中输入一个带有破折号的值。您希望如何在您的代码中看到它?你能用破折号创建一个 C++ 类吗?如您所见,向导将使用 C++ 代码中的值。他们只是决定简化事情。他们为项目提供了一个字段,稍后将在代码中使用。如果他们需要支持所有这些不寻常的设置,向导将包含很多无用的字段。如果您真的想要破折号,请创建一个空项目并手动完成所有操作。提供该向导是为了简化您的工作流程。 我没有“嫁给”项目名称中的破折号。我习惯于在非 MS 环境中使用破折号。当我创建项目时,出于习惯,我使用了一个连字符的名称,不知道这会在以后破坏向导。我很好奇 VS 允许在项目名称中使用破折号/连字符,但是当向导尝试生成源文件时,破折号会破坏 ATL 向导。没有计划在项目中“强制”破折号。新习惯 = 下划线。 该向导由一个解析项目文件的脚本驱动,并且显然没有正确使用那个意外的连字符。它看起来像一个小故障,因为向导只是一个助手,你总是可以在没有它的情况下手动添加东西。我建议将其发布到connect.microsoft.com,以便 MS 的某个人检查一下。 【参考方案1】:

因为向导使用包含项目名称的 c 和 c++ 预处理指令(宏)来生成新文件和代码,并在现有文件中生成代码,并且因为这些预处理指令无法正确理解其名称中的连字符.请参阅有关 c/c++ 宏的标准,但请记住例如您已经看到的所有宏:有很多下划线“_”来分隔名称,但没有连字符。

【讨论】:

以上是关于当项目名称带有连字符时,为啥 VS 2010 ATL 简单对象向导不会生成 .cpp/.h 文件?的主要内容,如果未能解决你的问题,请参考以下文章

VS2010里MFC中的ListBox为啥输出字符时,显示不出字体,只能看到有这一项?

为啥VS2010下建立Qt工程时源代码下面显示红色波浪线?

vs2010为啥总显示此项目已过期

vs2010调试时为啥会出现clr.dll与mscordacwks.dll版本不匹配?

将 WCF 项目从 VS 2008 移植到 2010 时出错

为啥 VS 2010 Intellisense 仅在我安装了视觉辅助 X 时才有效?