65.9K
CodeProject 正在变化。 阅读更多。
Home

CvsIn Visual Studio .NET 2002、2003 和 Visual Studio 2005 插件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (4投票s)

2006 年 9 月 22 日

CPOL

3分钟阅读

viewsIcon

32306

downloadIcon

482

CvsIn 插件适用于 Visual Studio .NET 2002、2003 和 Visual Studio 2005。

Sample Image - CvsInNetAddin.jpg

引言

我多年来一直在使用 Jerzy Kaczorowski 的 CvsIn for Microsoft Visual Studio 6.0。虽然它功能不是很强大,但它非常方便,就像提交按钮一样。Microsoft Visual Studio 还允许像 WinCvs 一样定义自定义快捷键,例如 Ctrl+D、Ctrl+U 和 Ctrl+M。可惜 CvsIn 后来没有更新以支持新版本的 Visual Studio。我继续开发以支持 MS Visual Studio .NET 2002 和 2003。然而,Visual Studio 2005 中的一些界面更改导致旧版本无法工作。其他人可能仍在为此插件,因此我决定在此分享代码。

关注点

信息输出窗格

CvsInNet 版本引入了一个新的信息输出窗格。

// This block of code is to create a "CvsIn" pane
// in Output window in function OnConnection.

IfFailGoCheck(m_pDTE->get_Windows(&spWindows), spWindows);
IfFailGoCheck
(
    spWindows->Item
    (
        CComVariant(CComBSTR(EnvDTE::vsWindowKindOutput)), 
        &spWindow
    ),
    spWindow
);

pDisp = NULL;
IfFailGoCheck(spWindow->get_Object(&pDisp), pDisp);

spOutputWindow = pDisp;
if (spOutputWindow == NULL)
    return E_FAIL;

IfFailGoCheck
(
    spOutputWindow->get_OutputWindowPanes(&spOutputWindowPanes),
    spOutputWindowPanes
);

hr = spOutputWindowPanes->Item
(
    CComVariant(OUTPANE_NAME), 
    &m_pOutputWindowPane
);

if (FAILED(hr))
{
    IfFailGoCheck
    (
        spOutputWindowPanes->Add
        (
            CComBSTR(OUTPANE_NAME), 
            &m_pOutputWindowPane
        ),
        m_pOutputWindowPane
    );
}

在 AppWizard 生成的代码的 CCommands 类(有时是 CConnect)中定义了一个函数

void CvsInPrintToOutput(LPCTSTR lpszMessage, BOOL bPrefix = TRUE);

用于显示消息。

例如,这段代码会输出欢迎消息

strMsg.Format
(
    STR_MSG_WELCOME_FORMAT, 
    g_AICIntegrationManager.GetVersion(),
    STR_MSG_WELCOME, 
    CCvsCommandsTool::FormatTimeString()
);

CvsInPrintToOutput(strMsg, FALSE);

这是消息

Up and running! [2006/09/23 13:02:04.250]

注意:AICIntetrationManager 未在 CvsInNet 中使用。

其他模块必须指定 CCommands 实例来输出消息。

m_pCommands->CvsInPrintToOutput(STR_MSG_RUNWINCVS_FAILED);

自定义插件位图

请注意,自 Visual Studio .NET 2002 以来,透明色已更改为特殊的绿色,RGB (0, 254, 0)。插件 DLL 中嵌入的自定义位图仍然可以在 VS.NET 2002 和 2003 中使用。VS 2005 中情况有所不同,例如使用资源 DLL 来存储自定义位图。在注册表中,使用字符串 SatelliteDllNameSatelliteDllPath 来实现此目的。

与 VS.NET 2002 和 2003 相比,VS 2005 中命令栏的界面也不同。

在 VS.NET 2002 和 2003 中,它是 Office 命令栏

CComPtr<Office::_CommandBars>   pCommandBars;
CComPtr<Office::CommandBar>     pCommandBar;
IfFailGoCheck(m_pDTE->get_Commands(&pCommands), pCommands);

并且 m_pDTE 被定义为 CComPtr<EnvDTE::_DTE> m_pDTE

而在 VS 2005 中,使用的是 Microsoft_VisualStudio_CommandBars

CComQIPtr<_CommandBars>         pCommandBars;
CComPtr<CommandBar>             pCommandBar;

并且 m_pDTE 被定义为 CComPtr<EnvDTE80::DTE2> m_pDTE

命令信息在 ConnectNet.cpp 的顶部定义。

static CCommands::CommandInfo s_commandList[] =
{
    {L"CvsInOptions",               "", true,  false, IDB_CVS_OPTIONS, IDS_CMD_OPTIONS},
    {L"CvsInWinCvsSessionsManager", "", false,  false, 0, IDS_CMD_WINCVSSESSIONSMANAGER},
    // ...

    {L"CvsInWizard",                "", true,  false, IDB_CVS_WIZARD, IDS_CMD_CVSINWIZARD},
};

资源号 IDB_CVS_OPTIONS 必须与资源 DLL 中的资源号相同,因为 CvsIn for VS.NET 2002 和 2003 中不使用 SatelliteDll

VS 2005 的 AddNamedCommand 代码是

pCommands2->AddNamedCommand2
(
    m_pAddInInstance,
    CComBSTR(commandInfo->m_name),
    CComBSTR(buttonText),
    CComBSTR(toolTip),
    VARIANT_FALSE,
    CComVariant(commandInfo->m_bitmapID),
    NULL,
    (
        EnvDTE::vsCommandStatusSupported
        +
        EnvDTE::vsCommandStatusEnabled
    ),
    EnvDTE80::vsCommandStylePict,
    EnvDTE80::vsCommandControlTypeButton,
    &pCreatedCommand
)

第五个参数 VARIANT_FALSE 表示不使用 MS Office 位图。

注册表文件包含卫星信息

val SatelliteDllName = s 'CvsInUI.dll'
val SatelliteDllPath = s '%MODULE_PATH%'

其中,%MODULE_PATH% 是一个自定义条目,它将由 CCommands 类中的 UpdateRegistry 函数(来自 MS Automation 示例)更新。

#if _MSC_VER < 1400
    DECLARE_REGISTRY_RESOURCEID(IDR_REGISTRY_VC7)
#else
 static HRESULT WINAPI UpdateRegistry( BOOL bRegister )
 {
  _ATL_REGMAP_ENTRY rgMap[ 2 ];
  memset( rgMap, '\0', sizeof( _ATL_REGMAP_ENTRY ) * 2 );

  TCHAR szModule[_MAX_PATH];
  GetModuleFileName(_Module.GetResourceInstance(), szModule, _MAX_PATH);
  PTCHAR pchSlash = strrchr( szModule, '\\' );
  if( pchSlash != NULL )  *pchSlash = '\0';

  USES_CONVERSION;
  rgMap[ 0 ].szKey  = OLESTR( "MODULE_PATH" );
  rgMap[ 0 ].szData = T2OLE( szModule );

  return _Module.UpdateRegistryFromResource(IDR_REGISTRY_VC8, 
                                   bRegister, rgMap );
 }
#endif

调试插件

如果您想调试您的插件 DLL,可以按照以下步骤操作(来自 VS 2005 Automation 示例)

  1. 在解决方案资源管理器中,右键单击项目并选择“属性”。
  2. 打开“调试”,然后进行以下更改
    • 在“命令”中,输入 devenv.exe 的路径(例如,c:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe)。
    • 将“命令参数”设置为 /resetaddin RegExplore.Connect
    • 在“工作目录”中,输入包含 devenv.exe 的目录(例如,c:\Program Files\Microsoft Visual Studio 8\Common7\IDE)。

一些改进

进行了一些线程细化,以减少快速点击命令按钮导致的崩溃。

WWhizInterface 和用法

使用 DllRegSrv32 注册插件 DLL。对于 VS 2005,请确保将资源 DLL CvsInUI.dll 放在插件 DLL 的 1033 目录下。

如果您想使用向导,则必须安装 WWhizInterface。如果您想调试 CvsIn 插件 DLL,还需要 WWhizInterface 的调试二进制文件。请参阅 WWhizInterface: Enhancements to the Visual C++ Automation Interface 以获取更多详细信息。

© . All rights reserved.