DuplicateHandle, зачем дублировать, а не просто приобретать?

Зачем процессу вызывать DuplicateHandle из Win32API и получать его от другого процесса вместо того, чтобы просто получить дескриптор самого объекта?

Есть ли какое-то преимущество в вызове DuplicateHandle или что-то в этом роде?


person Tony The Lion    schedule 31.01.2010    source источник
comment
Зачем вам вызывать DuplicateHandle вместо того, чтобы просто получить дескриптор объекта, как это обычно делается?   -  person Tony The Lion    schedule 31.01.2010


Ответы (4)


Вы можете найти ответ в главе 6.8 «Программирование приложений для Microsoft Windows».

Gaining a Sense of One's Own Identity
Sometimes you might need to acquire a real handle to a thread instead of a pseudo-handle. By "real," I mean a handle that unambiguously identifies a unique thread. Examine the following code:
DWORD WINAPI ParentThread(PVOID pvParam) {
   HANDLE hThreadParent = GetCurrentThread();
   CreateThread(NULL, 0, ChildThread, (PVOID) hThreadParent, 0, NULL);
   // Function continues...
}

DWORD WINAPI ChildThread(PVOID pvParam) {
   HANDLE hThreadParent = (HANDLE) pvParam;
   FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime;
   GetThreadTimes(hThreadParent,
      &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime);
   // Function continues...
}
Can you see the problem with this code fragment? The idea is to have the parent thread pass to the child thread a thread handle that identifies the parent thread. However, the parent thread passes a pseudo-handle, not a real handle. When the child thread begins executing, it passes the pseudo-handle to the GetThreadTimes function, which causes the child thread to get its own CPU times, not the parent thread's CPU times. This happens because a thread pseudo-handle is a handle to the current thread— that is, a handle to whichever thread is making the function call.

To fix this code, we must turn the pseudo-handle into a real handle. The DuplicateHandle function (discussed in Chapter 3) can do this transformation
person OwnWaterloo    schedule 31.01.2010

Одним из возможных вариантов использования DuplicateHandle является дублирование дескриптора между 32-битным процессом и 64-битным процессом.

Примечание: нельзя использовать на портах завершения ввода-вывода или сокетах.

person Mitch Wheat    schedule 31.01.2010

Другое использование DuplicateHandle — открытие файла в нескольких процессах, когда файл использует FileOptions.DeleteOnClose. (такой файл не может быть открыт несколькими процессами, если для открытия файла используется путь к файлу)

См. мой ответ на странице https://stackoverflow.com/a/36606283/2221472.

person Nathan Schubkegel    schedule 13.04.2016

Посмотрите здесь, в MSDN, что там говорится об использовании 'Дублировать дескриптор". Лучший способ, который я могу придумать, это такой способ, аналогия, если хотите: предположим, вы открываете файл, используя процедуру CreateHandle только для записи, затем вы вызываете DuplicateHandle, чтобы передать дескриптор другому потоку, в котором поток будет читать из файл, дублируется только дескриптор, поэтому потоку не нужно снова вызывать CreateHandle...

person t0mm13b    schedule 31.01.2010