jer*_*erb 8 c++ templates createuserwizard visual-studio
为了使新的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
Spe*_*ose 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\Generic\Class\Scripts\1033\default.js
复制这比我想象的要复杂,你需要复制并粘贴
Microsoft Visual Studio 10.0\VC\VCWizards\CodeWiz\Generic \
文件夹,然后前往:
C:\ Program Files\Microsoft Visual Studio 10.0\VC\VCAddClass\Generic
Dupe这个文件夹并修改其中的Generic.vsdir以指向..\Simple.vsz(VCAddClass文件夹中的文件)的欺骗.
Simple.vsz文件指向您在开始时欺骗的VCWizards中"Generic"文件夹的位置,因此请将新的simple.vsz指向该位置.
至于实际的代码生成,它并不是那么难以接受.为了更快地启动,这里是default.js的通用方式:
向导完成后,代码gen方法开始于:
function OnFinish(selProj, selObj)
Run Code Online (Sandbox Code Playgroud)
selProj(据我所知)是EnvDTE.Project的一个实例
http://msdn.microsoft.com/en-us/library/envdte.project.aspx
从向导获取信息似乎基于:
wizard.FindSymbol("CLASS_NAME")
Run Code Online (Sandbox Code Playgroud)
真正的魔法开始在selProj.CodeModel对象上发生
oCM.AddClass(strClassName, strHeader, vsCMAddPositionEnd, "", "", vsCMAccessDefault);
Run Code Online (Sandbox Code Playgroud)
这些方法的惯例似乎是将任何内容添加到文件中只是将文件修改为单个操作,因为它需要文件路径作为其参数.
这将返回一个CodeClass实例,可以通过以下方法添加:
AddAttribute
AddFunction
...
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找非常严格的代码格式(或者在我的情况下插入不符合普通代码语法的宏),这是非常有限的.
解决这个问题的简单方法是只为自己构建一个字符串,用于需要使用EditPoint接口完全控制的部分.
EditPoint是代码文件中的一个位置,您可以将其调用到以下方法:
EditPoint.Insert(string)
Editpoint.InsertFromFile(path)
Run Code Online (Sandbox Code Playgroud)
要在要插入代码的位置获取EditPoint,只需使用代码gen文件中某个现有项的位置(如类或构造函数),并使用.StartPointOf或.EndPointOf获取TextPoint并操作参数.
拥有TextPoint后,您可以像这样创建一个EditPoint:
newclass.EndPointOf(vsCMPartBody).CreateEditPoint().Insert("\nprivate:\n REGISTER_TYPE_MEMBER("+strClassName+");\n");
Run Code Online (Sandbox Code Playgroud)
要在.cpp文件中获取TextPoint:
oConstructor.StartPointOf(vsCMPartWhole,vsCMWhereDefinition).CreateEditPoint().Insert("REGISTER_TYPE_BODY_ID("+strClassName+",REPLACE_ID);\n\n\n");
Run Code Online (Sandbox Code Playgroud)
只要您可以通过向导找到所需的输入数据(我还没有深入研究过),这使您可以通过JScript字符串操作执行任何操作.