Я пытаюсь загрузить строку из моей таблицы Strin в DLL файле, над которым я работаю. Вот функция, которая должна загружать строку в std::wstring
(поскольку в моем проекте используется кодировка Unicode).
void ErrorHandler::load_error_string()
{
m_hInst = AfxGetInstanceHandle();
wchar_t buffer[1024] = { '\0' };
std::size_t string_length = LoadStringW(this->m_hInst, this->m_error_id, buffer, 1024);
this->m_raw_content = std::wstring(buffer, string_length);
CStringW output;
output.Format(L"%d", m_raw_content.length());
AfxMessageBox(output);
}
Я создал последние три строки для диагностики метода. Выход AfxMessageBox()
равен 0
.
Где я ошибаюсь?
AfxGetInstanceHandle()
дает вам HINSTANCE
исполняемого исполняемого файла. Это означает, что ваш вызов LoadStringW
будет искать в таблице ресурсов exe для вашей строки, что приведет к сбою, поскольку строки находятся в вашей DLL.
Вместо этого вам нужно будет захватить HINSTANCE
самой DLL - это предоставляется в качестве первого параметра DllMain()
в вашей DLL.
См. Этот ответ для примера: qaru.site/questions/1735786/...
EDIT: если вы используете MFC DLL, то вам может понадобиться добавить вызов AFX_MANAGE_STATE(AfxGetStaticModuleState());
в верхней части любых точек входа в вашу DLL (до AfxGetInstanceHandle()
.)
Взгляните на этот вопрос, который покажет вам, как получить HINSTANCE
вашей DLL, если это MFC DLL.
string_length
может представлять размерstd::wstring
, аstd::wstring
имеетwchar_t
, который может быть, для экземпляра 2 байта. Так что есть вероятность, что вы должны выполнитьbyte conversion
... что-то вроде m_raw_content.length () * sizeof (wchar_t), конечно, в зависимости от вашей реализации.output.Format
.output
переменная предназначена только для диагностики. Я написал это, потому что этот метод не работает.