CvsIn Visual Studio .NET 2002、2003 和 Visual Studio 2005 插件
CvsIn 插件适用于 Visual Studio .NET 2002、2003 和 Visual Studio 2005。
引言
我多年来一直在使用 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 来存储自定义位图。在注册表中,使用字符串 SatelliteDllName
和 SatelliteDllPath
来实现此目的。
与 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 示例)
- 在解决方案资源管理器中,右键单击项目并选择“属性”。
- 打开“调试”,然后进行以下更改
- 在“命令”中,输入 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 以获取更多详细信息。