Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];

Вниз

Объясните в чём ошибка (надеюсь не в ДНК ;)   Найти похожие ветки 

 
paul_shmakov   (2002-01-22 02:52) [17]

хотелось бы разъяснить, что такое HANDLE и HINSTANCE (он же HMODULE), а то чувствуется некоторое непонимание их различий.

HINSTANCE
------------------
главное отличие в том, что HINSTANCE - это адрес модуля в адресном пространстве нашего процесса. это может быть адрес самого нашего exe-шника (возвращается функцией GetModuleHandle(nil)), адреса загруженных dll (возвращаются, например, вызовами LoadLibrary("kernel32.dll") или GetModuleHandle("kernel32.dll")). в любом случае это именно адрес.
по значению HINSTANCE (HMODULE) можно одназначно идентифицировать некий, загруженный а адресное пространство процесса, модуль.
значение HINSTANCE имеет смысл только в пределах одного процесса - в другом процессе по этому адресу может быть загружено что-то другое.

кстати, тип HINSTANCE в windows.pas назван HINST, т.к. имя HINSTANCE уже занято под глобальную переменную.

HANDLE
-------------
HANDLE (дескриптор) - тоже предназначен для идентификации. но только не модулей, а объектов ядра системы. у каждого процесса есть таблица дескрипторов, а HANDLE - это индекс в таблице дескрипторов процесса. т.е. это всего лишь какое-либо простое значение (в англоязычной литературе говорят opaque) вроде 1, 2, 10, 15; а не адрес.
так как у каждого процесса таблица дескрипторов своя, то и значение HANDLE имеет смысл только в пределах одного процесса - если передать это значение другому процессу, то для него оно будет бесполезно (если такая функциональность все же нужна, то см. DuplicateHandle).

Заключение
------------------
таким образом, HANDLE и HINSTANCE предназначены совершенно для разных целей и идентифицируют абсолютно разные объекты. так уж получилось, что представляются они 4-х байтовым целым (DWORD), и поэтому их легко спутать или сконвертировать одно в другое. хотя, это абсолютно неверно. масло в огонь еще подливает функция GetModuleHandle, которая возвращает HINSTANCE, но содержит подстроку "Handle" в своем названии. ее следовало бы назвать GetModuleInstance.

так и Вы, Fellomena, ошибочно пишете:

var
hDLL2 : THandle; // должно быть HMODULE, а не THandle
begin
...
hDll2 := LoadLibraryEx(...);
...


надеюсь немного помог



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.005 c
3-18782
Realy_Grey
2002-01-14 13:53
2002.02.07
где Oracle хранит список таблиц?


1-18814
f0rm
2002-01-24 22:14
2002.02.07
Скопировать файл из локалки


6-18944
volodya
2001-11-14 16:33
2002.02.07
Как получить доступ по локальной сети к реестру и редактировать его


3-18730
Ghost!
2002-01-10 11:40
2002.02.07
Поиск ячейки и аналогичныйх ей


1-18906
Alexfdfdfd
2002-01-24 00:47
2002.02.07
Народ , всё бы хорошо , но экзешники слишком велики.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский