Создание exe vcxproj в Win 7 SP 1: точка входа в процедуру & lt; function & gt; не может быть расположен в библиотеке динамических ссылок KERNAL32.dll

«Не удалось найти точку входа в процедуру 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>

Я знаю, не ошибка компоновщика, но это стоило попробовать.

-1

Решение

Функция CreateFile2 был добавлен в Windows 8, поэтому вы не можете использовать его, если вам все еще нужна совместимость с Windows 7.

Минимально поддерживаемый клиент Windows 8 [настольные приложения | Приложения для Магазина Windows]

0

Другие решения

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*/)
0

По вопросам рекламы [email protected]