我正在嘗試爲另一個進程寫入的文件創建DuplicateHandle()。我成功了,但我得到了所有者流程的位置。在我尋求開始之後,它也會尋求所有者的過程。我能以某種方式尋求而不改變第一個過程的進展嗎?DuplicateHandle文件
編輯:
另一個應用程序打開該文件,而無需的CreateFile。這是一種從ReadFile開始讀取文件的方式,無需手動查找?再次
編輯:
沒有讀僅從一側重複處理的方式。感謝您的幫助。
我正在嘗試爲另一個進程寫入的文件創建DuplicateHandle()。我成功了,但我得到了所有者流程的位置。在我尋求開始之後,它也會尋求所有者的過程。我能以某種方式尋求而不改變第一個過程的進展嗎?DuplicateHandle文件
編輯:
另一個應用程序打開該文件,而無需的CreateFile。這是一種從ReadFile開始讀取文件的方式,無需手動查找?再次
編輯:
沒有讀僅從一側重複處理的方式。感謝您的幫助。
從MSDN:
重複的手柄是指相同的對象原裝手柄。因此,對象的任何更改都會反映在兩個句柄中。例如,如果複製文件句柄,則兩個句柄的當前文件位置始終相同。要使文件句柄具有不同的文件位置,請使用CreateFile
函數創建共享對同一文件的訪問權限的文件句柄。
而不是DuplicateHandle,您必須在兩個進程中調用CreateFile,並使用訪問模式和共享標誌的正確組合。 MSDN有full set of rules,這裏是一個可行的組合:
作家過程:
HANDLE file = CreateFile(..., GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, ...);
讀取器進程:
HANDLE file = CreateFile(..., GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, ...);
如果需要使用標誌玩,這裏是(原油)測試應用程序我寫回答你的問題:
// 2process1file.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#define NUMBER_OF_LINES 100
#define IO_PERIOD 250
static const char message[] = "The quick brown fox jumps over the lazy dog.\n";
HANDLE file = INVALID_HANDLE_VALUE;
BOOL CtrlHandler(DWORD ctltype)
{
if(file != INVALID_HANDLE_VALUE)
{
CloseHandle(file);
file = INVALID_HANDLE_VALUE;
}
return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
if(argc == 3)
{
DWORD access = GENERIC_READ;
DWORD share = FILE_SHARE_READ;
bool is_writer = false;
if((*argv[1]|' ') == 'w')
{
access |= GENERIC_WRITE;
is_writer = true;
}
else
{
share |= FILE_SHARE_WRITE;
}
file = CreateFile(argv[2], access, share, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(file != INVALID_HANDLE_VALUE)
{
DWORD nbytes = 1;
SetFilePointer(file, 0, 0, FILE_BEGIN); //Redundant when writing
for(int i=0; (i<NUMBER_OF_LINES) && nbytes; ++i) {
if(is_writer) {
if(WriteFile(file, message, sizeof(message)-1, &nbytes, 0) == 0)
{
//Write failed somehow
break;
}
//Sleep(INFINITE);
if(i%25 == 0) printf("%d\n", i);
} else {
char buffer[sizeof message] = "";
if(ReadFile(file, buffer, sizeof(buffer)-1, &nbytes, 0) && nbytes) {
buffer[sizeof(buffer)-1] = 0;
printf(buffer);
} else {
//Read failed somehow
break;
}
}
Sleep(IO_PERIOD);
}
CloseHandle(file);
file = INVALID_HANDLE_VALUE;
}
}
else
{
wprintf(L"Usage : %s [w|r] filename\n");
}
return 0;
}
這似乎是'Dup的預期行爲licateHandle()'。如果原始進程以「共享讀取」訪問權限打開文件,那麼您是否可以使用常規方式簡單地打開文件?你有具體的理由在這裏使用'DuplicateHandle()'嗎? – Chad
閱讀我的最新評論。 – blez