«Не удалось найти точку входа в процедуру CreateFile2 в библиотеке динамических ссылок KERNAL32.dll»
Мы собирались перейти на новую систему: C ++, созданную waf, для сборки Visual Studio 2013 (vcxproj), которая уже преобразовала несколько проектов, но все они были собраны в dll. Попытка создать внешний exe-файл проекта была немного сложнее. Сначала он даже не рассматривал его как приложение win32 (хотя я собираюсь в x64), но я добавил:
<IsLauncher>true</IsLauncher>
Что, казалось, исправило это. Теперь я получаю эту ошибку выше.
Я использую старый сторонний плагин, который имеет логический путь, который использует CreateFile2. У меня на компьютере уже установлен комплект Windows 8.1 (по какой-то причине), и он пытается использовать с него windows.h. Я попытался включить Windows SDK \ 7.1A для его windows.h, который определяет его правильно, но sal_supp.h определил макросы, которые также определил в VS 2013 sal.h, неработающее решение.
Я рассмотрел другие вопросы, но все они, похоже, проблемы с Win XP, но в Windows 7 это не совсем подходит. А поскольку это касается Kernel32, большинство других вопросов, похоже, не касаются системных библиотек или создания собственного 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>
Я знаю, не ошибка компоновщика, но это стоило попробовать.
Функция CreateFile2 был добавлен в Windows 8, поэтому вы не можете использовать его, если вам все еще нужна совместимость с Windows 7.
Минимально поддерживаемый клиент Windows 8 [настольные приложения | Приложения для Магазина Windows]
CreateFile2
был введен в Windows 8. Основная причина его использования заключается в том, что библиотека или DLL будут проходить WACK при использовании в приложении универсальной платформы 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*/)