ATL7 @ module handle

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

ATL7 @ module handle

Сообщение vg »

В проекте ATL7 есть класс модуля COM сервера. Типа

Код: Выделить всё

class CMyObjectsModule : public CAtlDllModuleT< CMyObjectsModule >
{
.....
};

CMyObjectsModule _AtlModule;
Надо получить хендл модуля hInstance для того, чтобы потом сделать, например,

Код: Выделить всё

HINSTANCE hInstance;

hInstance = ????????

m_bitmap = ::LoadBitmap( hInstance , MAKEINTRESOURCE(IDB_BITMAP_MYBITMAP));
GetModuleHandle( NULL ) - не прокатывает.

Сделал коряво:

Код: Выделить всё

class CMyObjectsModule :
	public CAtlDllModuleT< CMyObjectsModule >,
	public CAtlBaseModule
{
...
...
};

CMyObjectsModule _AtlModule;

Зато теперь можно сделать
m_bitmap = ::LoadBitmap(_AtlModule.m_hInst, MAKEINTRESOURCE(IDB_BITMAP_MYBITMAP));


Как сделать хорошо?

Спасибо.
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

GetModuleHandle( NULL ) возвращает модуль екзешника процесса.
А у тебя судя по всему код и русурсы находятся в DLL.
Поэтому надо вызывать GetModuleHandle("MyModule.DLL")
Другой способ вызвать:
BOOL GetModuleHandleEx() в качестве флага указать GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, и дать адрес любой функции из DLL.
Но последнее будет работать только в XP.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

aldep писал(а): Поэтому надо вызывать GetModuleHandle("MyModule.DLL")
Это понятно, хотя и не приятно. Придётся пользоваться порочной пактикой для включения номера версий, включённых в имя файла. Но всё равно спасибо... Уж лучше так, как я сделал выше (не сам придумал; решение выложенно на кодепроджект).

Поинт и прикол в том - немогли же MS улучшая глобально новую версию ATL пропустить такие простые вопросы и ухудшить функциональность для неглобальных вопросов :lol: по сравнению с CComModule в ATL3. Должно же быть изячное решение, о котором я пока не знаю.

Спасибо.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Вопрос закрыт. Разобрался.

Сообщение vg »

Вопрос закрыт. Разобрался. Думаю, будет полезно другим.
...Посмотрел подробнее имплементацию CAtlModuleT в atlbase.h.
Так вот, там я обнаружил обращение к _AtlBaseModule.m_hInst.
Как оказалось потом, _AtlBaseModule заменяет в ATL7 старый CComModule::_Module, см.

http://support.microsoft.com/kb/309705/EN-US/

Так, что вопрос закрыт. Вызов, как ниже, работает.
m_bitmap = ::LoadBitmap(_AtlBaseModule.m_hInst, MAKEINTRESOURCE(IDB_BITMAP1));

Спасибо всем.
MaskedRhyme
Пользователь
Сообщения: 57
Зарегистрирован: 18 апр 2005, 03:06

Сообщение MaskedRhyme »

Вообще говоря, корректней было бы писать так:

Код: Выделить всё

m_bitmap = ::LoadBitmap(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
В коде CAtlBaseModule есть два хендла: m_hInst и m_hInstResource. Правда, при инициализации и тот, и другой устанавливаются в одинаковое значение:

Код: Выделить всё

m_hInst = m_hInstResource = reinterpret_cast<HINSTANCE>(&__ImageBase);
:)
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

MaskedRhyme писал(а):Вообще говоря, корректней было бы писать так:

Код: Выделить всё

m_bitmap = ::LoadBitmap(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
В коде CAtlBaseModule есть два хендла: m_hInst и m_hInstResource. Правда, при инициализации и тот, и другой устанавливаются в одинаковое значение:

Код: Выделить всё

m_hInst = m_hInstResource = reinterpret_cast<HINSTANCE>(&__ImageBase);
:)
Согласен. На кодепроджект об этом тоже говорили

ПС. Забыл сказать... тот код, что я написал выше - от программеров esri core. Они до сих пор SDK дают с использованием ATL3. Впрочем AutoDesk от них не отстаёт, упорно не видя никаких IDE кроме NET 2002 (2003 год у них ещё не наступил :lol: ).
MaskedRhyme
Пользователь
Сообщения: 57
Зарегистрирован: 18 апр 2005, 03:06

Сообщение MaskedRhyme »

[offtopic]
А какие преимущества, кроме обновленной IDE дает VS.NET (2002 или 2003, не важно), если рассматривать ее как среду для разработки на С++? IMHO, не так много, чтобы большие legacy-проекты под нее переделывать...

Мы, например, так пока в VC6 и работаем.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

MaskedRhyme писал(а):[offtopic]
А какие преимущества, кроме обновленной IDE дает VS.NET (2002 или 2003, не важно), если рассматривать ее как среду для разработки на С++? IMHO, не так много, чтобы большие legacy-проекты под нее переделывать...

Мы, например, так пока в VC6 и работаем.
Я не настаиваю. Тем более, если знаешь как делать, так любая IDE будет хороша. Мне нравиться IDE 2003 за то, что там впервые появилалсь поддержка визарда и визуальных компонент WindowsForms для managed С++ (раньше было только для VB, С#). Неизмеримо легче стало делать GUI (да в MFC его и не сделать для managed code, разве что только куски кода, для которого всё равно нужен будет маршалинг в NET и обратно, да и непонятно кому такая кривость вообще нужна будет). В 2003 гораздо лучше редактор кода (работает как для C# или VB, "выделяя" и "свёртывая" целые куски кода в листинге, наприимер, классы и т.д., толтипы для для размеченного кода ну и т.д.).
Ну, а так, для неуча вроде меня ... так, конечно всё едино. Даже VC6.0 пойдёт. Хотя GUI tools, конечно, в NET 2003 максимально приближен к визуальному RAD, имяя ввиду то, что MS реализовал наконец то, что Borland реализовал в Delphi и Builder ещё лет 10 назад. И это мне нравиться в NET 2003. :lol:
Ответить