カスタムウィザードを使用して同様のことを行いました。
私の目的のために、単純なマクロを各クラスに挿入して、それを静的ファクトリ オブジェクトに挿入したかっただけです。
実際のウィザードを変更する必要はありませんでした。デフォルトのジェネリック クラス ウィザードをコピーし、コード生成 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
このフォルダーを複製し、その中の Generic.vsdir を変更して、..\Simple.vsz (VCAddClass フォルダー内のファイル) の複製を指すようにします。
Simple.vsz ファイルは、最初にコピーした VCWizards の "Generic" フォルダーの場所を指しているので、新しい simple.vsz をその場所に向けます。
コード生成
実際のコード生成に関しては、理解するのはそれほど難しくありません。物事をより迅速に開始するために、default.js の一般的な動作を次に示します。
ウィザードが完了すると、コード生成メソッドが次から開始されます。
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 を取得するには、コード生成ファイル (クラスやコンストラクターなど) 内の既存のアイテムの 1 つの場所を使用し、.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 文字列操作を介して必要なことを何でも行うことができます (これについてはまだ掘り下げていません)。