Страница 1 из 1
ATL7 @ module handle
Добавлено: 24 окт 2005, 17:08
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));
Как сделать хорошо?
Спасибо.
Добавлено: 25 окт 2005, 14:18
aldep
GetModuleHandle( NULL ) возвращает модуль екзешника процесса.
А у тебя судя по всему код и русурсы находятся в DLL.
Поэтому надо вызывать GetModuleHandle("MyModule.DLL")
Другой способ вызвать:
BOOL GetModuleHandleEx() в качестве флага указать GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, и дать адрес любой функции из DLL.
Но последнее будет работать только в XP.
Добавлено: 25 окт 2005, 15:23
vg
aldep писал(а):
Поэтому надо вызывать GetModuleHandle("MyModule.DLL")
Это понятно, хотя и не приятно. Придётся пользоваться порочной пактикой для включения номера версий, включённых в имя файла. Но всё равно спасибо... Уж лучше так, как я сделал выше (не сам придумал; решение выложенно на кодепроджект).
Поинт и прикол в том - немогли же MS улучшая глобально новую версию ATL пропустить такие простые вопросы и ухудшить функциональность для неглобальных вопросов

по сравнению с CComModule в ATL3. Должно же быть изячное решение, о котором я пока не знаю.
Спасибо.
Вопрос закрыт. Разобрался.
Добавлено: 27 окт 2005, 07:41
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));
Спасибо всем.
Добавлено: 31 окт 2005, 14:35
MaskedRhyme
Вообще говоря, корректней было бы писать так:
Код: Выделить всё
m_bitmap = ::LoadBitmap(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
В коде CAtlBaseModule есть два хендла: m_hInst и m_hInstResource. Правда, при инициализации и тот, и другой устанавливаются в одинаковое значение:
Код: Выделить всё
m_hInst = m_hInstResource = reinterpret_cast<HINSTANCE>(&__ImageBase);

Добавлено: 31 окт 2005, 15:02
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 год у них ещё не наступил

).
Добавлено: 31 окт 2005, 18:19
MaskedRhyme
[offtopic]
А какие преимущества, кроме обновленной IDE дает VS.NET (2002 или 2003, не важно), если рассматривать ее как среду для разработки на С++? IMHO, не так много, чтобы большие legacy-проекты под нее переделывать...
Мы, например, так пока в VC6 и работаем.
Добавлено: 31 окт 2005, 19:09
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.
