2012-01-16 1 views
0

Visual Studio 2008用のAddInを開発しました。これはコマンドバー項目を「プロジェクト」コンテキストメニュー(ソリューションエクスプローラでプロジェクトを右クリック)にインストールします。 (Connect.csで)以下、簡素化コードは、1つを除いて、私たちのすべてのマシンのために正常に動作します:1台のマシン上でコマンドバーコントロールが表示されません

object[] contextGUIDS = new object[] { }; 

string commandName = "My_Command"; 
string tooltip = "My tooltip"; 

Command projectCommand = applicationObject.Commands.AddNamedCommand(addInInstance, commandName, commandName, tooltip, false, 1, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled); 

CommandBars commandBars = (CommandBars)(fApplicationObject.CommandBars); 

CommandBar projectCommandBar = commandBars["Project"]; 

CommandBarControl projectButton = (CommandBarControl)(projectCommand.AddControl(projectCommandBar, projectCommandBar.Controls.Count + 1)); 

projectButton.Caption = "My caption"; 
projectButton.TooltipText = tooltip; 

、コードが例外なく実行されますが、ボタンは表示されません。もう一度インストールコードを呼び出すと、既存のコマンドバー項目のために例外がスローされます。ただし、「ツール」メニューにある別のアイテムがインストールされ、正しく表示されます。

OSとVisual Studioを再インストールしても、問題は解決しません(Windows 7 x86 SP1ドイツ語、Visual Studio Development Edition SP1英語)。 OSとVSの設定が同じ他のマシンもありますが、ボタンが正しく表示されています。

このトピックのヒントはすべて歓迎します!

答えて

1

Visual Studio 2008に複数のコマンドバーProjectが存在するため、正しいボタンを挿入する必要があります。幸運にも、これを行うには絶対にシンプルで、合理的で直感的な方法があります。

1.コマンドバー

レジストリエディタを開きますのユニークなIDを見つけるとHKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Generalに移動します。 EnableVSIPLoggingという名前の新しいDWORD値を作成し、値を1に設定します。

これにより、SHIFTおよびCTRL修飾子が押されている間にコントロールを挿入するコントロールを右クリックすることで、コマンドバーの一意のGUIDとコマンドIDを特定できます。 CTRL + Cを押してメッセージの内容をコピーし、どこかにテキストボックスに貼り付け

Visual Studio 2008 Debugging Message

:それは、このようなメッセージボックスが表示されます。 GuidCmdIDの値に注意してください。

private CommandBar FindCommandBar(Guid guidCmdGroup, uint menuID) 
{ 
    IOleServiceProvider sp = (IOleServiceProvider)fApplicationObject; 
    Guid guidSvc = typeof(IVsProfferCommands).GUID; 
    Object objService; 
    sp.QueryService(ref guidSvc, ref guidSvc, out objService); 
    IVsProfferCommands vsProfferCmds = (IVsProfferCommands)objService; 
    return vsProfferCmds.FindCommandBar(IntPtr.Zero, ref guidCmdGroup, menuID) as CommandBar; 
} 

[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 
internal interface IOleServiceProvider 
{ 

    [PreserveSig] 
    int QueryService([In]ref Guid guidService, [In]ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out System.Object obj); 

} 

を確認し、コマンドこと:あなたが上に決定された値からのコマンドバーをフェッチするために、次のコードスニペットを使用することができますGUIDとCmdIDによって

をコマンドバーをフェッチ

2バーはFindCommandBarメソッドを呼び出す前に適切に初期化されます。そうでない場合は、ComException(HResult E_FAIL)でコールが失敗します。これを行うための簡単な方法:

private void EnsureInitialized() 
{ 
    var menuBar = ((CommandBars)fApplicationObject.CommandBars)["MenuBar"]; 
} 

出典:http://blogs.msdn.com/b/dr._ex/archive/2007/04/17/using-ivsproffercommands-to-retrieve-a-visual-studio-commandbar.aspx

関連する問題