LoadLibrary возвращает ноль - PullRequest
3 голосов
/ 22 декабря 2011

Я только что попробовал следующий код (windows xp sp3, vs2010) и LoadLibrary, похоже, возвращает Null.

#include "windows.h"
#include "stdio.h"

int main() {
    HMODULE hNtdll;
    hNtdll = LoadLibrary(LPCWSTR("ntdll.dll"));
    printf("%08x\n", hNtdll);
}

Я получаю вывод 00000000. В соответствии с docs , NULL возвращается при сбое функции. Я попытался использовать GetLastError, код ошибки - 126 ( 0x7e, ошибка мод не найдена ).

Как я могу исправить эту проблему?

Спасибо!

Ответы [ 3 ]

12 голосов
/ 22 декабря 2011

У вас есть строковый литерал, который состоит из узких символов. Ваш LoadLibrary звонок, очевидно, ожидает широких символов. Приведение типов не способ конвертировать из одного в другое. Используйте префикс L, чтобы получить широкий строковый литерал:

LoadLibrary(L"ntdll.dll")

Приведение типов говорит компилятору, что ваш char const* действительно wchar_t const*, что не соответствует действительности. Компилятор доверяет вам и передает указатель на LoadLibrary в любом случае, но когда интерпретируется как широкая строка, то, что вы передали, является бессмысленным. Он не представляет имя какого-либо файла в вашей системе, поэтому API правильно сообщает, что не может найти модуль.

2 голосов
/ 22 декабря 2011

Вы должны использовать LoadLibrary(_T("ntdll.dll")). LPCWSTR просто приводит строковый указатель на основе символов к указателю самой широкой строки.

0 голосов
/ 04 апреля 2019

В дополнение к необходимости преобразования пути string в wchar_t const* с использованием префикса L (который уже упоминается в принятом ответе).Согласно моему опыту за последние пару часов:
стоит упомянуть, что функция LoadLibrary не загружает зависимость (и) предполагаемой библиотеки (DLL) автоматически.Другими словами, если вы попытаетесь загрузить библиотеку X, которая зависит от библиотеки Y, вы должны сделать LoadLibrary(Y), затем LoadLibrary(X), в противном случае загрузка библиотеки X завершится неудачно, и вы получите ошибку 126.

...