Инстансы приложения и DLL
уничтожением и т.п. перенёс в DLL - в связи с этим вопрос -
при создании класса окна указывать hInstnace приложения или DLL-ки?
(WNDCLASS wc; wc.hInstance = ?? - hDLLInstance или hAppInstance??)
Чей инстанс нужен классу окна вот в чём вопрос :)
Приложения. Скорее всего. :)
Конечно, нужен экземпляр (instance) приложения. Но вообще-то в MSDN'е по этому поводу бывает большая неразбериха. Почему-то сами авторы иногда путают понятия хэндла экземпляра и хэндла модуля. В описании функции CreateWindow сначала написано, что "hInstance - handle to application instance", а потом "hInstance - Identifies the instance of the module to be associated with the window". Между тем, в данном случае это принципиально, потому что хэндлы экземпляров приложения и подключённой к нему библиотеки разные, а вот хэндл модуля (возвращаемый по GetModuleHandle(NULL)) - один и тот же (специально проверено).
hInstance
Handle to the instance that contains the window procedure for the class.
Т.е. модуля, в котором находится оконная процедура.
PS А вообще, топик не в том разделе - в WinAPI надо бы.
-------------------------------------------------------------------
Цитата:
хэндл модуля (возвращаемый по 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, а получал для приложения... - соответствено ресурсы и не грузились. Не знал что и думать... :)
Граждане, что же это делается?! Почему все вокруг краснеют? У меня что - паранойя или 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-файла.
Неправда. Если я что-то написал, значит я уверен в своих словах, тем более, если говорю, что проверил это. hModule - это действительно базовый адрес и всё такое. hInstance же хранит совершенно другое значение. Для первого запущенного экземпляра приложения он равен нулю. Для второго, казалось бы, он должен быть равен единице и т. д., но таких значений лично мне получить не удалось: если даже было запущено несколько экземпляров одной и той же программы одновременно, хэндл экземпляра всегда был равен нулю (Windows 98, возможно, в других версиях это и не так). Но в любом случае хэндл модуля и хэндл экземпляра не совпадают. В этом легко убедиться.
млин.... это цитата из рихтера .....
Да, конечно, Рихтер ас, никто не спорит, но некоторые говорят что и у него есть ошибки http://www.citforum.ru/book/cook/dll1.shtml
я сам это не проверял, но тем не менее, может интересно будет:)