为Visual Studio实现自定义向导以实现自定义C ++类

时间:2011-02-27 11:22:28

标签: c++ visual-studio templates createuserwizard

为了使新的C ++类符合一些相当挑剔的编码约定(前期:我不能讨论这些......),我正在考虑为新的C ++类生成存根的方法。目前,每个人都在做复制粘贴,经常缺少一些细节。正在使用的IDE是MS Visual Studio 2005,但我认为2008年和2010年这些主题没有太大变化。

我的第一个想法是实现一个命令行脚本来执行此操作,这将是相当直接的。或者,我考虑使用默认的VS扩展机制来实现更好的IDE集成。因此,当在过滤器(解决方案资源管理器)上选择 Add-> New Item ... 时,这会挂起一些自定义内容。

经过一番调查后,我发现有一种易于使用的模板机制,遗憾的是它不适用于C ++(http://msdn.microsoft.com/en-us/library/6db0hwky%28v=vs.80%29.aspx)。对于C ++,似乎你必须实现一个自定义向导,包括用于布局的html和用于逻辑的javascript。

关于自定义向导方法,我得出的结论是,这需要一些努力(至少对我来说)才能完成。 MSDN在这个主题上不是很详细。我在网上找到了一些演练,它们只处理项目的自定义向导( Add-> New Project ... 而不是 Add-> New Item ... )。

所以,这是qn:任何人做过这个或类似的事情?是(更好的IDE集成)值得付出努力(应对自定义向导实现的细节),还是建议转而使用命令行工具?我想,在当前的项目中,两天以上的工作不会得到回报。

如果您认为自定义向导很棒,也许您可​​以提供一些提示以便开始使用。此外,也许我没有提出替代方案。 VS Add-Ins似乎是最重要的,并且适应例如 VC \ vcprojectitems \ newc ++ file.cpp 将无法胜任。

提前致谢并致以最诚挚的问候...... Jerb

1 个答案:

答案 0 :(得分:13)

我使用自定义向导做了类似的事情。

出于我的目的,我只想在每个类中注入一些简单的宏,以将其插入到静态工厂对象中。

我不需要修改实际的向导,只需复制默认的泛型类向导并修改代码生成javascript。

关于这个主题的文档是垃圾,但这里是一个开始javascript的好地方(这是你将获得最大权力的地方):

http://msdn.microsoft.com/en-us/library/t41260xs(v=VS.71).aspx

默认类向导javascript位于此处:

  

C:\ Program Files \ Microsoft Visual Studio   10.0 \ VC \ VCWizards \ CodeWiz \通用\类\脚本\ 1033 \ default.js


重复项目

复制这比我想象的要复杂,你需要复制并粘贴

  

Microsoft Visual Studio 10.0 \ VC \ VCWizards \ CodeWiz \ Generic \

文件夹,然后前往:

  

C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ VCAddClass \ Generic

欺骗此文件夹并修改其中的Generic.vsdir以指向.. \ Simple.vsz(VCAddClass文件夹中的文件)的伪装。

Simple.vsz文件指向您在开始时欺骗的VCWizards中“Generic”文件夹的位置,因此将新的simple.vsz指向该位置。


代码生成

至于实际的代码生成,并不是那么难以接受。为了更快地开始工作,这里是default.js的通用方式:

向导完成后,代码gen方法开始于:

function OnFinish(selProj, selObj)

selProj(据我所知)是一个EnvDTE.Project实例

http://msdn.microsoft.com/en-us/library/envdte.project.aspx

从向导获取信息似乎基于:

wizard.FindSymbol("CLASS_NAME")

真正的魔法开始在selProj.CodeModel对象上发生

oCM.AddClass(strClassName, strHeader, vsCMAddPositionEnd, "", "", vsCMAccessDefault);

这些方法的惯例似乎是将任何内容添加到文件中只是将文件修改为单个操作,因为它需要文件路径作为其参数。

这将返回一个CodeClass实例,可以通过以下方法添加:

AddAttribute
AddFunction
...

如果您正在寻找非常严格的代码格式(或者在我的情况下插入不符合普通代码语法的宏,那么这是非常有限的。

解决这个问题的简单方法是自己为需要完全控制EditPoint接口的部分构建一个字符串。

EditPoint是代码文件中的一个位置,您可以在其中调用以下方法:

EditPoint.Insert(string)
Editpoint.InsertFromFile(path)

要在想要插入代码的位置获取EditPoint,只需使用代码gen文件中某个现有项的位置(如类或构造函数),并使用.StartPointOf或.EndPointOf获取TextPoint。操纵参数。

拥有TextPoint后,您可以像这样创建一个EditPoint:

newclass.EndPointOf(vsCMPartBody).CreateEditPoint().Insert("\nprivate:\n  REGISTER_TYPE_MEMBER("+strClassName+");\n");

要在.cpp文件中获取TextPoint:

oConstructor.StartPointOf(vsCMPartWhole,vsCMWhereDefinition).CreateEditPoint().Insert("REGISTER_TYPE_BODY_ID("+strClassName+",REPLACE_ID);\n\n\n");

只要您可以通过向导找到所需的输入数据(我还没有深入研究过),您就可以通过JScript字符串操作执行任何操作。