На успехе ShellExecute возвращает дескриптор.
Мы должны закрыть этот дескриптор, и если так, как?
Согласно примерам опубликовал мою Microsoft, мы не должны закрывать этот дескриптор. Но документ самого ShellExecute является бесшумным на предмете. Можно ли подтвердить, что мы действительно не должны закрывать этот дескриптор?
Но затем, как дескриптор может быть допустимым и ни в какой потребности того, чтобы быть закрытым??? Какое из следующих утверждений верно:
Эта подсказка представляет собой 16-битную вещь , в win32 это просто число> 32 в случае успеха и не может использоваться ни для чего, кроме как код ошибки при сбое функции. С другой стороны, если вы передадите SEE_MASK_NOCLOSEPROCESS в версию Ex, у вас будет дескриптор, который нужно закрыть.
Взято из: http://msdn.microsoft.com/en-us/library/bb762153%28VS.85%29.aspx
Если функция завершается успешно, она возвращает значение больше 32. Если функция терпит неудачу, она возвращает значение ошибки, которое указывает причину сбоя. {{ 1}} Возвращаемое значение приводится как HINSTANCE для обратной совместимости с 16-битными приложениями Windows. Однако это не истинный ХИНСТАНС . Его можно привести только к типу int и по сравнению с 32 или следующими кодами ошибок , приведенными ниже.
Я немного проясняю, что такое 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- опыт / статьи / 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
.