DirectXTK - 无法在kernel32.dll中找到过程入口点CreateFile2

时间:2015-07-09 19:10:55

标签: c++ dll windows-7 directx kernel32

所以我想尝试使用DirectXTK的spritefont类,在包含所有需要的文件后,我最终会在程序即将启动时弹出一个错误,告诉我程序入口点CreateFile2无法在kernel32中找到.dll文件。现在我已经搜索了这个问题,从我可以看出来,似乎directxtk试图在我使用Windows 7时尝试使用Windows 8特定的东西(或者我猜可能是8.1)。人们似乎建议的一般修复是通过定义

来更改使用的版本
#define WINVER 0x0601
#define _WIN32_WINNT 0x601

使其使用Windows 7版本。我将那些定义放在头文件中,如msdn所说,但我仍然得到同样的错误。如果重要的是我在Visual Studio 2013中用c ++编写它。

2 个答案:

答案 0 :(得分:1)

DirectX Tool Kit支持广泛的Microsoft平台和操作系统配置,因此第一步是确保为您的目标项目和Visual C ++编译器版本选择正确的VCXPROJ和/或NuGet包。

对于使用VS 2013的Windows桌面应用程序,您应该使用:  DirectXTK_Desktop_2013.vcxproj   - 或 - NuGet包directxtk_desktop_2013

本文Dual-use Coding Techniques for Games中详细介绍了库中使用的编码技术。

整个代码库中使用的主要控件是Windows操作系统目标版本,该版本由_WIN32_WINNTMSDN设置。使用Windows 8.1 SDK(VS 2013附带),SDK将默认使用_WIN32_WINNT=0x0603 / _WIN32_WINNT=_WIN32_WINNT_WINBLUE,这意味着要为Windows 8.1或更高版本的操作系统构建。这就是代码使用CreateFile2的原因,代码可用于Windows 8.x Store,Windows phone 8.x或Windows 10 UWP。

但是,如果您使用Windows桌面项目,则使用_WIN32_WINNT=0x0600 / _WIN32_WINNT=_WIN32_WINNT_VISTA进行构建,并且库将使用适用于Windows Vista SP2 + KB971644的API({{ 3}}和Windows 7。

Direct3D 11中,我在pch.h中设置了此值,然后再包含其他标题。

#include <WinSDKVer.h>
#define _WIN32_WINNT 0x0600
#include <SDKDDKVer.h>

答案 1 :(得分:0)

CreateFile2引用来自https://github.com/microsoft/DirectXTK/blob/master/Src/LoaderHelpers.h,这里:

    #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
        ScopedHandle hFile(safe_handle(CreateFile2(fileName,
                           GENERIC_READ,
                           FILE_SHARE_READ,
                           OPEN_EXISTING,
                           nullptr)));
    #else
        ScopedHandle hFile(safe_handle(CreateFileW(fileName,
                           GENERIC_READ,
                           FILE_SHARE_READ,
                           nullptr,
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           nullptr)));
    #endif

因此,如果标头是使用_WIN32_WINNT <= 0x0601编译的,则不应使用CreateFile2。您如何尝试覆盖它?我使用了VS“预处理程序定义”字段,并能够强制执行else路径。我建议您仔细检查自己的覆盖。

相关问题