Зачем процессу вызывать DuplicateHandle из Win32API и получать его от другого процесса вместо того, чтобы просто получить дескриптор самого объекта?
Есть ли какое-то преимущество в вызове DuplicateHandle или что-то в этом роде?
Зачем процессу вызывать DuplicateHandle из Win32API и получать его от другого процесса вместо того, чтобы просто получить дескриптор самого объекта?
Есть ли какое-то преимущество в вызове DuplicateHandle или что-то в этом роде?
Вы можете найти ответ в главе 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
Одним из возможных вариантов использования DuplicateHandle
является дублирование дескриптора между 32-битным процессом и 64-битным процессом.
Примечание: нельзя использовать на портах завершения ввода-вывода или сокетах.
Другое использование DuplicateHandle — открытие файла в нескольких процессах, когда файл использует FileOptions.DeleteOnClose
. (такой файл не может быть открыт несколькими процессами, если для открытия файла используется путь к файлу)
См. мой ответ на странице https://stackoverflow.com/a/36606283/2221472.
Посмотрите здесь, в MSDN, что там говорится об использовании 'Дублировать дескриптор". Лучший способ, который я могу придумать, это такой способ, аналогия, если хотите: предположим, вы открываете файл, используя процедуру CreateHandle только для записи, затем вы вызываете DuplicateHandle, чтобы передать дескриптор другому потоку, в котором поток будет читать из файл, дублируется только дескриптор, поэтому потоку не нужно снова вызывать CreateHandle...