win32 CreateFile2 api调用的目的是什么?

时间:2012-11-08 11:45:21

标签: winapi windows-8

他们在Windows 8中添加了一个名为CreateFile2的新API调用,据我所知,它与现有的CreateFile函数完全相同,只是它的参数打包方式有所不同。

为了实现这一点,已经添加了什么,因为我在文档中看不到任何内容。

1 个答案:

答案 0 :(得分:2)

CreateFile实际上可以做的不仅仅是打开一个文件。创建CreateFile2是为了将函数的“表面区域”限制为UWP应用程序允许的功能,并且因为WACK工具无法真正区分“好”使用和“坏”使用导入功能,只是它正在被使用。

我在C ++库中使用的典型模式如下。我使用RAII pattern作为文件句柄来支持使用C ++异常处理时(除了好的modern C++ coding practice)之外:

#include <assert.h>
#include <memory>

struct handle_closer
    { void operator()(HANDLE h) { assert(h != INVALID_HANDLE_VALUE); if (h) CloseHandle(h); } };

typedef std::unique_ptr<void, handle_closer> ScopedHandle;

inline HANDLE safe_handle(HANDLE h) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; }
  

safe_handle的原因是因为CreateFileCreateFile2被定义为返回INVALID_HANDLE_VALUE( - 1)而不是为失败返回0。返回句柄的大多数其他Win32函数返回0表示失败,我已经确认没有'0'是有效的Win32句柄的情况。

为了阅读我使用:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(
    CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr)));
#else
ScopedHandle hFile(safe_handle(
    CreateFileW(szFile, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN, nullptr)));
#endif
if (!hFile)
   // Error
  

对于FILE_SHARE_READ参数,使用dwShareMode而不是0来进行阅读非常重要。 UWP应用程序没有对现有文件的独占读取权限,因此如果您使用“独占”共享模式(即0),则调用将失败。

写文件:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(
    CreateFile2(szFile, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr)));
#else
ScopedHandle hFile(safe_handle(
    CreateFileW(szFile, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr)));
#endif
if (!hFile)
    // Error!
  

对于写入,我请求DELETE权限,因为我使用SetFileInformationByHandleFILE_DISPOSITION_INFO来清理文件输出过程是否失败。请参阅scoped.h

有关详细信息,请参阅Dual-use Coding Techniques for Games