информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] ATL7 @ module handle 25.10.05 04:10  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
В проекте 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));

Как сделать хорошо?
Спасибо.
Вопрос закрыт. Разобрался. 27.10.05 18:36  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Посмотрел подробнее имплементацию 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));

Спасибо всем.
А тот hinstance, который в WinMain передается нельзя сохранить? 25.10.05 13:54  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
А потом использовать по мере необходимости
Нет, к сожалению нельзя. 26.10.05 07:19  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> А потом использовать по мере необходимости
Нет, к сожалению нельзя.
Это стандарная задача написания пользовательских контролов и команд для ArcGIS.
Каждая команда в их архитектуре - COM сервер. Для отривоски пиктограммы COM, имплементирующий команду, сам должен загрузить свой битмап, и в одном из паблик методов, вызываемых ArcGIS-сом возвратить ему HBITMAP, типа:

class ATL_NO_VTABLE CGaussTool :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CGaussTool, &CLSID_GaussTool>,
public IGaussTool,
public ICommand

{
private:
IApplicationPtr m_ipApp;
IDocumentPtr m_ipDoc;
HBITMAP m_bitmap;

public:
CGaussTool();
~CGaussTool();
...

BEGIN_COM_MAP(CGaussTool)
COM_INTERFACE_ENTRY(ICommand)
COM_INTERFACE_ENTRY(IGaussTool)
END_COM_MAP()

BEGIN_CATEGORY_MAP(CGaussTool)
IMPLEMENTED_CATEGORY(__uuidof(CATID_MxCommands))
END_CATEGORY_MAP()
...

public:
// ICommand
STDMETHOD (get_Enabled) (VARIANT_BOOL * Enabled);
STDMETHOD (get_Checked) (VARIANT_BOOL * Checked);
STDMETHOD (get_Name) (BSTR * Name);
STDMETHOD (get_Caption) (BSTR * Caption);
STDMETHOD (get_Tooltip) (BSTR * Tooltip);
STDMETHOD (get_Message) (BSTR * Message);
STDMETHOD (get_HelpFile) (BSTR * HelpFile);
STDMETHOD (get_HelpContextID) (LONG * helpID);
STDMETHOD (get_Bitmap) (OLE_HANDLE * Bitmap);
STDMETHOD (get_Category) (BSTR * categoryName);
STDMETHOD (OnCreate) (IDispatch * hook);
STDMETHOD (OnClick) ( void );
};

CGaussTool::CGaussTool()
{
m_bitmap = ::LoadBitmap(_AtlModule.m_hInst, MAKEINTRESOURCE(IDB_BITMAP_GAUSS));
(IDB_BITMAP_GAUSS));
}

CGaussTool::~CGaussTool()
{
DeleteObject(m_bitmap);
}

STDMETHODIMP CGaussTool::get_Bitmap(OLE_HANDLE * Bitmap)
{
if (Bitmap == NULL)
return E_POINTER;

*Bitmap = (OLE_HANDLE) m_bitmap;

return S_OK;
}

Не понятно, как улучшив ATL7 в сравнении с ATL3, MS избавили девелоперов от полезной функциональности CComModule, вчастности, от CComModule::m_hInst.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach