+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 91.69 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

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

16.08.2012 15:20

Пролог

Предлагаемый 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.

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года