winapi — C ++ ссылки на код Windows в 64-битной, но не в 32-битной

У меня есть код, написанный на C ++ на Windows.
Мой код компилируется и связывается, когда я компилирую его как x64, но не когда я изменяю конфигурацию сборки на x86.

Ошибка — ошибка связи.

Я использую функцию RtlIsNameInExpression из ntdll.

Когда я компилирую его в 32-битном режиме, я получаю ошибку связи (LNK2019) неразрешенного внешнего.

Есть идеи, почему это может произойти?

10x

-1

Решение

Прежде всего — как вы объявляете функцию и какой символ не можете найти компоновщик?

декларация должна быть

extern "C" NTSYSAPI BOOLEAN NTAPI RtlIsNameInExpression(
_In_     PCUNICODE_STRING Expression,
_In_     PCUNICODE_STRING Name,
_In_     BOOLEAN         IgnoreCase,
_In_opt_ PWCH            UpcaseTable
);

я могу догадаться, что ты скучаешь NTAPI т.е. __stdacall Ключевое слово, если вы копировать-вставить из Вот. для x64 существует только одно соглашение о вызовах, но для x86 существуют разные __stdcall а также __cdecl например. это может объяснить, почему это найдено в x64 но не найден в x86

какую ошибку даст вам компоновщик (не компилятор!)? неразрешенный внешний символ __imp__RtlIsNameInExpression ? (если да, вы действительно забыли __stdcall установить) или __imp__RtlIsNameInExpression@16 ? в этом случае вы объявляете функцию правильной, но ваш ntdll.lib не содержащий этот символ (может быть, вы используете старый ntdll.lib
для хр? ) просто ищи __imp__RtlIsNameInExpression@16 строка как есть в ntdll[p].lib — это найдено? если нет, у вас есть старая (XP) версия ntdll, я думаю.

3

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

Ответ в онлайн документация для этой функции:

Эта функция не имеет связанного заголовочного файла. Связанная библиотека импорта, Ntdll.lib, доступна в наборе драйверов Microsoft Windows (WDK). Вы также можете вызвать эту функцию, используя функции LoadLibrary и GetProcAddress, чтобы динамически связываться с Ntdll.dll.

Если вы не можете добавить файл ntdll.lib из WDK в команду ссылки, то вам нужно использовать подход LoadLibrary-GetProcAddress.

Также из того же раздела документации:

Функции и структуры в Winternl.h являются внутренними для операционной системы и могут меняться от одного выпуска Windows к другому, и, возможно, даже между пакетами обновлений для каждого выпуска. Чтобы поддерживать совместимость вашего приложения, вы должны использовать эквивалентные публичные функции. Дополнительная информация доступна в заголовочном файле Winternl.h и документации по каждой функции.

0

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