(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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.



 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 16.08.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft 365 Apps for business (corporate)
Microsoft 365 Business Basic (corporate)
Microsoft Windows Professional 10, Электронный ключ
Microsoft 365 Business Standard (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Delphi - проблемы и решения
Краткие описания программ и ссылки на них
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100