-1

“无法在动态链接库 KERNAL32.dll 中找到过程入口点 CreateFile2”

我们一直在使用一个新系统,由 waf 构建的 C++ 到 Visual Studio 2013 构建(vcxproj),已经转换了几个项目,但它们都构建为 dll。尝试构建外部 exe 文件项目有点困难。起初它甚至没有将其视为一个 win32 应用程序(尽管我是在 x64 中构建的),但我补充说:

<IsLauncher>true</IsLauncher>

这似乎解决了这个问题。现在我得到了上述错误。

我正在使用一个旧的 3rd 方插件,它有一个使用 CreateFile2 的逻辑路径。我的机器上已经安装了 windows 8.1 套件(出于某种原因),它正在尝试使用其中的 windows.h。我尝试将 Windows SDK\7.1A 包含在内,它的 windows.h 正确定义了它,但 sal_supp.h 定义了 VS 2013 的 sal.h 也定义的宏,这是一个不起作用的解决方案。

我查看了其他问题,但它们似乎都是 Win XP 的问题,在 Windows 7 上没有完全适合的问题。由于这涉及 Kernel32,因此大多数其他问题似乎并不涉及系统 dll 或创建您自己的 vcxproj。当我在 waf 中构建它时,这一切都奏效了,所以我知道安装的任何东西实际上都没有任何问题。

我试过的东西:

<ClCompile><PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile>

<PropertyGroup Label="Configuration"><UseOfMfc>Dynamic</UseOfMfc></PropertyGroup>

<PropertyGroup><LinkIncremental>true</LinkIncremental></PropertyGroup>

<Link><AdditionalDependencies>kernel32.lib;Ws2_32.lib;psapi.lib;zlib.lib;shlwapi.lib;...</AdditionalDependencies></Link>

我知道,不是链接器错误,但值得一试。

4

2 回答 2

0

CreateFile2在 Windows 8 中引入。使用它的主要原因是,当在通用 Windows 平台 (UWP) 应用程序中使用不允许CreateFile. 为 C++ 编写代码的一个好方法是:

struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } };

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

inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : 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
        if (!hFile)
        {
            return HRESULT_FROM_WIN32(GetLastError());
        }
        ...

这里的问题是,如果您尝试使用较旧的 Windows 7.1 SDK 或更早版本构建此代码,因为_WIN32_WINNT_WIN8未定义因此即使您不想这样做,您最终也会采用第一种情况。如果您要支持在 Windows 8.x SDK 或 Windows 10 SDK 以外的上下文中构建此代码,则应改为:

#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
于 2017-01-18T06:40:59.850 回答
0

在Windows 8 中添加了CreateFile2 功能,因此如果您仍然需要 Windows 7 兼容性,则无法使用它。

支持的最低客户端Windows 8 [桌面应用程序 | Windows 应用商店应用]

于 2017-01-18T05:44:53.743 回答