Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инстансы приложения и DLL

279
04 октября 2006 года
bave
456 / / 07.03.2004
Я функции связанные с регистрацией классов окна, созданием окна, его
уничтожением и т.п. перенёс в DLL - в связи с этим вопрос -
при создании класса окна указывать hInstnace приложения или DLL-ки?
(WNDCLASS wc; wc.hInstance = ?? - hDLLInstance или hAppInstance??)
Чей инстанс нужен классу окна вот в чём вопрос :)
398
04 октября 2006 года
Alexandoros
630 / / 21.10.2005
Приложения. Скорее всего. :)
3.3K
04 октября 2006 года
ShadyMan
191 / / 15.07.2006
Конечно, нужен экземпляр (instance) приложения. Но вообще-то в MSDN'е по этому поводу бывает большая неразбериха. Почему-то сами авторы иногда путают понятия хэндла экземпляра и хэндла модуля. В описании функции CreateWindow сначала написано, что "hInstance - handle to application instance", а потом "hInstance - Identifies the instance of the module to be associated with the window". Между тем, в данном случае это принципиально, потому что хэндлы экземпляров приложения и подключённой к нему библиотеки разные, а вот хэндл модуля (возвращаемый по GetModuleHandle(NULL)) - один и тот же (специально проверено).
1.8K
04 октября 2006 года
_const_
229 / / 26.11.2003
Читаем MSDN:
hInstance
Handle to the instance that contains the window procedure for the class.

Т.е. модуля, в котором находится оконная процедура.

PS А вообще, топик не в том разделе - в WinAPI надо бы.
279
04 октября 2006 года
bave
456 / / 07.03.2004
Я машинально сюда тему влепил (восномном тока сюда захожу потому-что) - модеры перенесут...
-------------------------------------------------------------------
Цитата:

хэндл модуля (возвращаемый по GetModuleHandle(NULL)) - один и тот же


Вот это дельное замечание... - потому как в MSDN написано:
If this parameter is NULL, GetModuleHandle returns a handle of the file used to create the calling process.
Я позырил в отладке - и неважно кто вызывает, хоть DLL, хоть екзешник
в обоих случаях одно значение, а в моём случае это ещё и важно
потому, что ресурсы лежат в DLL
Поэтому когда, я вызывал GetModuleHandle - я свято верил, что получаю хендл для DLL, а получал для приложения... - соответствено ресурсы и не грузились. Не знал что и думать... :)

3.3K
05 октября 2006 года
ShadyMan
191 / / 15.07.2006
Граждане, что же это делается?! Почему все вокруг краснеют? У меня что - паранойя или bave ещё вчера был зелёным?
351
06 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=bave]Я машинально сюда тему влепил (восномном тока сюда захожу потому-что) - модеры перенесут...
-------------------------------------------------------------------

Вот это дельное замечание... - потому как в MSDN написано:
If this parameter is NULL, GetModuleHandle returns a handle of the file used to create the calling process.
Я позырил в отладке - и неважно кто вызывает, хоть DLL, хоть екзешник
в обоих случаях одно значение, а в моём случае это ещё и важно
потому, что ресурсы лежат в DLL
Поэтому когда, я вызывал GetModuleHandle - я свято верил, что получаю хендл для DLL, а получал для приложения... - соответствено ресурсы и не грузились. Не знал что и думать... :)[/QUOTE]
можт ты когда вызываешь для DLL забываешь ее имя указать ?

 
Код:
hInstance = GetModuleHandle( "fuck.dll" );


гым вот у рихтера:

Описатель экземпляра процесса
Любому EXE- или DLL-модулю, загружаемому в адресное пространство процесса, при сваивается уникальный описатель экземпляра. Описатель экземпляра Вашего EXE файла передается как первый параметр функции (w)WinMain - hinstExe. Это значе ние обычно требуется при вызовах функций, загружающих те или иные ресурсы. На пример, чтобы загрузить из образа ЕХЕ-файла такой ресурс, как значок, надо вызвать:

HICON LoadIcon( HINSTANCE hinst, PCTSTR pszIcori);

Первый параметр в LoadIcon указывает, в каком файле (EXE или DLL) содержится интересующий Вас ресурс. Многие приложения сохраняют параметр hinstExe функ ции (w)WinMain в глобальной переменной, благодаря чему он доступен из любой части кода ЕХЕ-файла.

В документации Platform SDK утверждается, что некоторые Windows-функции требуют параметр типа HMODULE. Пример — функция GetModuleFileName

DWORD GetModuleFileName( HMODULE hinstModule, PTSTR pszPath, DWORD cchPath);

NOTE:
Как оказалось, HMODULE и HINSTANCE — это идно и то же. Встретив в доку ментации указание передать какой-то функции HMODULE, смело передавайте HINSTANCE, и наоборот. Они существуют в таком виде лишь потому, что в l6 разрядпой Windows идентифицировали совершенно разные вещи.

Истинное значение параметра hinstExe функции (w)WinMain — базовый адрес в памяти, определяющий ту область в адресном пространстве процесса, куда был заг ружен образ данного ЕХЕ-файла, Например, если система открывает исполняемый файл и загружает его содержимое по адресу 0x00400000, то hinstExe функции (w)Win Main получает значение 0x00400000.

Базовый адрес, но которому загружается приложение, определяется компоновщи ком. Разные компоновщики выбирают и разные (no умолчанию) базовые адреса. Ком поновщик Visual С++ использует по умолчанию базовый адрес 0x00400000 — самый нижний в Windows 98, начиная с которого в ней допускается загрузка образа испол няемого файла. Указав параметр /BASE: адрес (в случае компоновщика от Microsoft), можно изменить базовый адрес, по которому будет загружаться приложение.

При попытке загрузить исполняемый файл в Windows 98 по базовому адресу ниже 0x00400000 загрузчик переместит его на другой адрес. Это увеличит время загрузки приложения, но оно по крайней мере будет выполнено. Если Вы разрабатываете про граммы и для Windows 98, и для Windows 2000, сделайте так, чтобы приложение заг ружалось по базовому адресу не ниже 0x00400000. Функция GetModuleHandle.

HMODULE GetModuleHandle( PCTSTR pszModule);

возвращает описатель/базовый адрес, указывающий, куда именно (в адресном про странстве процесса) загружается EXE- или DLL-файл. При вызове этой функции имя нужного EXE- или DLL-файла передается как строка с нулевым символом в конце. Если система находит указанный файл, GetModuleHandle возвращает базовый адрес, по которому располагается образ данного файла. Если же файл системой не найден, функция возвращает NULL. Кроме того, можно вызвать эту функцию, передав ей NULL вместо параметра pszModule, — тогда Вы узнаете базовый адрес EXE-файла. Именно это и делает стартовый код из библиотеки С/С++ при вызове (w)WinMain из Вашей программы.

Есть еще две важные вещи, касающиеся GetModuleHandle. Во-первых, она прове ряет адресное пространство только того процесса, который ее вызвал. Если этот про цесс не использует никаких функций, связанных со стандартными диалоговыми ок нами, то, вызвав GetModuleHandle и передав ей аргумент "ComDlg32", Вы получите NULL - пусть даже модуль ComDlg32.dll и загружен в адресное пространство какого нибудь другого процесса. Во-вторых, вызов этой функции и передача ей NULL дает в результате базовый адрес ЕХЕ-фяйла в адресном пространстве процесса. Так что, вы зывая функцию в виде GetModuleHandle(NULL — даже из кода в DLL, — Вы получаете базовый адрес EXE-, а не DLL-файла.
3.3K
06 октября 2006 года
ShadyMan
191 / / 15.07.2006
[QUOTE=PitxBull]Как оказалось, HMODULE и HINSTANCE — это идно и то же. [/QUOTE]
Неправда. Если я что-то написал, значит я уверен в своих словах, тем более, если говорю, что проверил это. hModule - это действительно базовый адрес и всё такое. hInstance же хранит совершенно другое значение. Для первого запущенного экземпляра приложения он равен нулю. Для второго, казалось бы, он должен быть равен единице и т. д., но таких значений лично мне получить не удалось: если даже было запущено несколько экземпляров одной и той же программы одновременно, хэндл экземпляра всегда был равен нулю (Windows 98, возможно, в других версиях это и не так). Но в любом случае хэндл модуля и хэндл экземпляра не совпадают. В этом легко убедиться.
351
07 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=ShadyMan]Неправда..[/QUOTE]
млин.... это цитата из рихтера .....
63
05 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
[QUOTE=PitxBull] из рихтера .....[/QUOTE]
Да, конечно, Рихтер ас, никто не спорит, но некоторые говорят что и у него есть ошибки http://www.citforum.ru/book/cook/dll1.shtml
я сам это не проверял, но тем не менее, может интересно будет:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог