У меня есть код, написанный на C ++ на Windows.
Мой код компилируется и связывается, когда я компилирую его как x64, но не когда я изменяю конфигурацию сборки на x86.
Ошибка — ошибка связи.
Я использую функцию RtlIsNameInExpression из ntdll.
Когда я компилирую его в 32-битном режиме, я получаю ошибку связи (LNK2019) неразрешенного внешнего.
Есть идеи, почему это может произойти?
10x
Прежде всего — как вы объявляете функцию и какой символ не можете найти компоновщик?
декларация должна быть
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, я думаю.
Ответ в онлайн документация для этой функции:
Эта функция не имеет связанного заголовочного файла. Связанная библиотека импорта, Ntdll.lib, доступна в наборе драйверов Microsoft Windows (WDK). Вы также можете вызвать эту функцию, используя функции LoadLibrary и GetProcAddress, чтобы динамически связываться с Ntdll.dll.
Если вы не можете добавить файл ntdll.lib из WDK в команду ссылки, то вам нужно использовать подход LoadLibrary-GetProcAddress.
Также из того же раздела документации:
Функции и структуры в Winternl.h являются внутренними для операционной системы и могут меняться от одного выпуска Windows к другому, и, возможно, даже между пакетами обновлений для каждого выпуска. Чтобы поддерживать совместимость вашего приложения, вы должны использовать эквивалентные публичные функции. Дополнительная информация доступна в заголовочном файле Winternl.h и документации по каждой функции.