Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取文件的重复句柄_C++_Winapi - Fatal编程技术网

C++ 读取文件的重复句柄

C++ 读取文件的重复句柄,c++,winapi,C++,Winapi,我有一个由进程a(第三方应用程序)独占打开的文件。显然,我无法在应用程序中打开该文件,因此我考虑使用DuplicateHandle API复制句柄 然而,我意识到文件句柄位置的变化也会反映在进程A中,这可能会导致不希望的行为。是否有一种方法可以复制文件句柄进行读取,而不影响进程a中的文件句柄(位置)?没有方法。文件的句柄实际上是指向的间接指针,如果文件以同步模式打开(FileObject->Flags&FO\u synchronous\u IO),则file\u OBJECT.CurrentBy

我有一个由进程a(第三方应用程序)独占打开的文件。显然,我无法在应用程序中打开该文件,因此我考虑使用DuplicateHandle API复制句柄


然而,我意识到文件句柄位置的变化也会反映在进程A中,这可能会导致不希望的行为。是否有一种方法可以复制文件句柄进行读取,而不影响进程a中的文件句柄(位置)?

没有方法。文件的
句柄实际上是指向的间接指针,如果文件以同步模式打开(
FileObject->Flags&FO\u synchronous\u IO
),则
file\u OBJECT.CurrentByteOffset
用作文件指针偏移量。复制句柄时,共享相同的
文件\u对象
。为了拥有一个独立的文件指针,您需要打开另一个独立的
文件对象
/
句柄

我终于找到了答案:

  • 首先,您需要使用和API创建一个重复的文件句柄

  • 现在使用复制句柄并后跟。MapViewOfFile将文件的某些部分映射到进程地址空间,并可用于读取文件,而不会干扰原始文件句柄的当前文件偏移量


  • 希望这对某人有所帮助。

    您试图绕过的基本问题是以非独占方式打开以独占方式打开的文件。文件以独占方式打开通常是有原因的。“我显然无法在我的应用程序中打开文件”-我不明白,这是多么明显。您可以打开任意数量的文件句柄,只要它们同意兼容的访问和共享模式。您甚至从未解释过进程A使用什么访问和共享模式,也从未解释过您需要哪些访问和共享模式。@IInspectable OP清楚地说明进程A已打开文件以进行独占访问。这意味着不使用共享模式,因此无论请求的访问权限如何,没有其他人可以打开该文件。@RemyLebeau:这样的语句常常是一种误解(将请求的访问与共享模式混淆)。到目前为止,OP还没有回应,也没有提供缺失的信息。此外,不设置共享模式不会阻止打开文件句柄(例如,使用
    同步
    访问权限)。进程a是第三方应用程序(不是我开发的),它不允许我以编程方式读取或手动复制\粘贴相关文件。我希望如果我能做到这一点,可能是使用一些IO驱动程序API或其他什么。但我想我无法以独占方式(无共享读/写访问)读取打开的文件。谢谢你的帮助。如果我的问题不太清楚,请道歉