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

已添加什么来使其成为必需,因为我在文档中看不到任何内容。

最佳答案

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

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

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

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

using ScopedHandle = std::unique_ptr<void, handle_closer>;

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



为了阅读,我使用:
#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



对于写入文件:
#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!



有关更多信息,请参见Dual-use Coding Techniques for Games

10-08 00:41