Как я могу загрузить строку на основе идентификатора ресурса? - PullRequest
3 голосов
/ 11 октября 2010

Я читаю запись из реестра, которая выходит что-то вроде:

@%SystemRoot%\\System32\\wscsvc.dll,-200

Мне нужно загрузить строку из файла.

Я нашел статью , в которой описывается, как ведет себя число на конце (отрицательный == идентификатор конкретного ресурса, положительный == n-й ресурс в файле), но я не совсем понимаю, как это сделать. может загрузить ресурс. Кажется, функция ExtractIcon выполняет загрузку ресурсов, которая мне нужна, но возвращает HICON, а не строку.

Как мне загрузить строку из файла?

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

Загрузите DLL с помощью LoadLibrary, загрузите строку с помощью LoadString, а затем выгрузите DLL (при условии, что вам больше ничего не нужно) с помощью FreeLibrary:

HMODULE hDll = LoadLibrary("C:\\WINDOWS\\System32\\wscsvc.dll");
if(hDll != NULL)
{
    wchar_t *str;
    if(LoadStringW(hDll, +200, (LPWSTR)&str, 0) > 0)
        ;  // success!  str now contains a (read-only) pointer to the desired string
    else
        ;  // handle error
    FreeLibrary(hDll);
}
else
    ;  // handle error

Обратите внимание, что LoadLibrary (и почти любая другая функция, которая принимает имя файла) не понимает переменные окружения, такие как %SystemRoot%.Вам нужно будет использовать такую ​​функцию, как ExpandEnvironmentStrings, чтобы развернуть переменные среды в имени файла DLL, прежде чем передать его в LoadLibrary.

0 голосов
/ 06 февраля 2019

Этот тип строки называется «косвенной строкой».Самый простой способ получить один из них - вызвать функцию SHLoadIndirectString , которая предназначена именно для этого.

Извлекает указанный текстовый ресурс, когда ему передается этот ресурс в виде косвенной строкистрока, которая начинается с символа '@').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...