каким образом мы не должны закрывать дескриптор, возвращенный ShellExecute?

На успехе ShellExecute возвращает дескриптор.

Мы должны закрыть этот дескриптор, и если так, как?

Согласно примерам опубликовал мою Microsoft, мы не должны закрывать этот дескриптор. Но документ самого ShellExecute является бесшумным на предмете. Можно ли подтвердить, что мы действительно не должны закрывать этот дескриптор?

Но затем, как дескриптор может быть допустимым и ни в какой потребности того, чтобы быть закрытым??? Какое из следующих утверждений верно:

  1. дескриптор недопустим, и мы ничего не можем сделать с ним;
  2. дескриптор никогда не освобождается и существует (спонсируемая Microsoft) утечка памяти (пока программа вызывающей стороны не заканчивается);
  3. дескриптор автоматически освобожден системой в некоторое время и никогда не снова используется впоследствии (-> другой вид утечки ресурсов). Только при попытке использовать его может мы знать ли он неподвижные точки к чему-то.
  4. что еще?
5
задан user192472 6 May 2010 в 10:41
поделиться

3 ответа

Эта подсказка представляет собой 16-битную вещь , в win32 это просто число> 32 в случае успеха и не может использоваться ни для чего, кроме как код ошибки при сбое функции. С другой стороны, если вы передадите SEE_MASK_NOCLOSEPROCESS в версию Ex, у вас будет дескриптор, который нужно закрыть.

5
ответ дан 14 December 2019 в 01:03
поделиться

Взято из: http://msdn.microsoft.com/en-us/library/bb762153%28VS.85%29.aspx

Если функция завершается успешно, она возвращает значение больше 32. Если функция терпит неудачу, она возвращает значение ошибки, которое указывает причину сбоя. {{ 1}} Возвращаемое значение приводится как HINSTANCE для обратной совместимости с 16-битными приложениями Windows. Однако это не истинный ХИНСТАНС . Его можно привести только к типу int и по сравнению с 32 или следующими кодами ошибок , приведенными ниже.

4
ответ дан 14 December 2019 в 01:03
поделиться

Я немного проясняю, что такое 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 .

0
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: