Календарь на Май 2024 года: calendar2008.ru/2024/may/
Навигация
Главная »  Visual Studio 

Add-in для подключения MSDN .NET к Visual C++


Пролог Предлагаемый add-in есть не что иное, как макрос Игоря Соловьёва, самым тупым образом перенесённый на C++. В своё время, после прочтения статьи, установки макроса в VC++ и испробования его в деле, мне пришла в голову мысль оформить этот код в виде add-in"а. Формальным поводом послужили отсутствие автоматического встраивания в IDE и некоторая неспешность отклика. На самом деле, конечно основным мотивом было желание "побаловаться" с add-in"остроеним. Написать тривиальный add-in для обработки горячей клавиши в Visual C++ 6 не составляет особого труда, ибо писать ничего и не придётся (кроме непосредственно кода обработчика, естественно). Ниже представлено пошаговое описание процесса создания такого ad-in"а на примере add-in"а для подключения MSDN .NET к Visual C++ 6.

Описание

Визард

Первым делом надо создать новый проект, выбрав тип проекта "DevStudio Add-in Wizard". Заполнить единственную форму визарда (для таких простых случаев, как рассматриваемый, можно снять флаги "Provides a toolbar" и "Responds to Developer Studio events"). Нажать кнопку "Finish", и всё - add-in готов. Осталось только добавить функциональность.

Обработчик команды

Визард сгенерировал класс CCommands, поддерживающий интерфейс ICommands с единственным методом DotNetMsdnCommandMethod (в случае проекта с именем DotNetMsdn). Впрочем, имя метода можно изменить вручную, что я и сделал. Теперь это ShowDotNetHelp. Теперь достаточно открыть Commands.cpp найти реализацию метода и вставить туда нужный Вам код. Смеха для можете сравнить этот код с оригинальным кодом макроса. #import - это сила. ;)

	IDispatch* pdispActDocPtr = NULL; VERIFY_OK(m_pApplication->get_ActiveDocument(&pdispActDocPtr)); if (pdispActDocPtr == NULL) return S_OK; // not document  try {  DSTextEditor::ITextDocumentPtr ActDocPtr(pdispActDocPtr); pdispActDocPtr->Release();  DSTextEditor::ITextSelectionPtr SelPtr((IDispatch*)ActDocPtr->Selection);  _bstr_t bsSel = SelPtr->Text;  if ( bsSel.length() == 0 ) { long lLine = SelPtr->CurrentLine; long lColumn = SelPtr->CurrentColumn;  SelPtr->WordRight((long)DSTextEditor::dsMove); SelPtr->WordLeft((long)DSTextEditor::dsExtend);  bsSel = SelPtr->Text;  SelPtr->MoveTo(lLine, lColumn, (long)dsMove); }  CString sStr((const char*)bsSel); sStr.TrimRight(); bsSel = (const char*)sStr;  if ( m_HelpPtr == NULL ) { if ( FAILED(m_HelpPtr.CreateInstance("DExplore.AppObj")) ) { AfxMessageBox(IDS_DONT_CREATE_HELP_OBJECT, MB_OK / MB_ICONSTOP); return S_OK; }  //			m_HelpPtr->SetCollection(L"ms-help://MS.VSCC", L"Visual C++ and Related"); m_HelpPtr->SetCollection(L"ms-help://MS.VSCC", L""); m_HelpPtr->Index(); }    try { m_HelpPtr->DisplayTopicFromF1Keyword(bsSel); } catch (...) {}  SHost::IWshShell2Ptr ShellPtr(L"WScript.Shell"); ShellPtr->AppActivate(&_variant_t(L"Visual Studio .NET Combined Collection"));  } catch (_com_error& e) { AfxMessageBox(e.Description(), MB_OK / MB_ICONSTOP); } catch (...) { }  return S_OK; 

Назначение быстрой клавиши

	CComBSTR bszKey(L"Ctrl+F1"); CComBSTR bszEditor(L"Text"); VERIFY_OK(pApplication->AddKeyBinding(bszKey, bszCmdName, bszEditor)); 
Я не нашёл ничего умнее, чем вставить этот вызов в CDSAddIn::OnConnection - метод кокласса add-in"а (не перепутайте с коклассом команд CCommands) - что, конечно, далеко не самое удачное решение, так как в этом случае назначение "Ctrl+F1" происходит при каждом старте Visual Studio, невзирая на то, что пользователь, возможно, уже переназначил выполнение команды на другую, более удобную для себя клавишу. Если кто-нибудь найдёт изящное решение этой проблемы, пожалуйста, поделитесь со мной.

Добавление кода для саморегистрации

В файле DotNetMsdn.cpp (в случае проекта с именем DotNetMsdn) находится небезызвестная функция DllRegisterServer. Она идеально подходит для добавления кода, необходимого для регистрации add-in"а.

STDAPI DllRegisterServer(void) {	// ... код, сгенерированный визардом lRes = key.Open(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\DevStudio\\6.0\\AddIns")); if (lRes == ERROR_SUCCESS)	{ lRes = key.Create(key, _T("DotNetMsdn.DSAddIn.1")); key.SetValue(_T("1")); CString strValue; strValue.LoadString(IDS_DOTNETMSDN_DESCRIPTION); key.SetValue(strValue, _T("Description")); strValue.LoadString(IDS_DOTNETMSDN_LONGNAME); key.SetValue(strValue, _T("DisplayName"));  TCHAR szName[MAX_PATH]; GetModuleFileName(GetModuleHandle(_T("DotNetMsdn.dll")), szName, MAX_PATH); key.SetValue(szName, _T("FileName")); }  if (lRes != ERROR_SUCCESS) { hRes = HRESULT_FROM_WIN32(lRes); }  return hRes; } 
Конечно, отсутствие в DllUnregisterServer удаления ключа реестра, отвечающего за регистрацию add-in"а, есть следствие непростительного раздолбайства (каюсь, грешен), но ведь и исходники доступны - исправляйте, я потом с удовольствием скачаю обезглюченную версию. ;)

Инструкция по установке Программа установки сделана с помощью популярного NSIS от NullSoft"а. Для инсталляции add-in"а достаточно её запустить и несколько раз нажать ENTER.



 

 Миграция БД на Windows Azure SQL VM через виртуальный диск.
 Подключение проекта ASP.NET MVC к проекту ASP.NET WebForms.
 Ускоряем OpenMP в Visual C++.
 IBM Rational Purify PureCoverage.
 7 шагов успешной миграции портала SharePoint 2007 на SharePoint 2010.


Главная »  Visual Studio 

© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено.