Я немного понимаю, что такое HINSTANCE
и HMODULE
. Это не HANDLE
, а скорее адрес памяти (указатель). Вы можете понять это, если просто приведете hInstance
к (IMAGE_DOS_HEADER *)
и загляните внутрь загруженного модуля. Вы можете использовать VirtualQueryEx (GetCurrentProcess(),...)
для получения дополнительной информации (например, размера) с адреса памяти.
Посмотрите на http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx и http://www.apriorit.com/our-experience/articles/9-sd-articles/74-hmodule-hinstance-handle-from-static-library-in-c, и вы увидите, как можно получить HINSTANCE
с адреса памяти (__ImageBase).
Так, если вы, например, LoadLibrary
, вы получите HMODULE
(это то же самое, что и HINSTANCE
). Вы должны использовать FreeLibrary
не для «закрытия дескриптора», а для выгрузки модуля из памяти. Например, если вы используете GetModuleHandle
, вы также получаете тот же адрес (вы получаете адрес, переведенный как HMODULE
), но вам НЕ следует звонить FreeLibrary
, чтобы "закрыть дескриптор".
Если вы понимаете, что такое HINSTANCE
и HMODULE
и как их следует использовать, вы узнаете, как использовать HINSTANCE
, возвращенное с ShellExecute
.