【问题标题】:LoadString() method doesn't work in C++LoadString() 方法在 C++ 中不起作用
【发布时间】:2014-01-27 13:44:25
【问题描述】:

我正在尝试从我正在处理的 DLL 文件中的 Strin 表中加载一个字符串。这是应该将字符串加载到 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

我哪里错了?

【问题讨论】:

  • 请记住,string_length 可能代表std::wstring 的大小,而std::wstring 具有wchar_t,可以是一个,对于instantece 2 个字节。因此,您有可能必须执行 byte conversion... 之类的 m_raw_content.length()*sizeof(wchar_t),当然这取决于您的 output.Format 实现。
  • output 变量仅用于诊断。我这样写是因为那个方法不起作用。
  • DLL中是否嵌入了字符串资源?
  • 是的,它们嵌入在 DLL 中
  • 那么,您检查string_length 的值了吗?价值是多少?

标签: c++ dll mfc resources string-table


【解决方案1】:

AfxGetInstanceHandle() 为您提供正在运行的可执行文件HINSTANCE。这意味着您的 LoadStringW 调用将在 exe 的资源表中查找您的字符串,这将失败,因为字符串在您的 DLL 中。

相反,您需要获取 DLL 本身的HINSTANCE - 这是在您的 DLL 中作为DllMain() 的第一个参数提供的。

请参阅此答案以获取示例: https://stackoverflow.com/a/2396380/1073843

编辑: 如果您使用的是 MFC DLL,那么您可能只需要在 DLL 的任何入口点的顶部添加对 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 的调用(在调用 AfxGetInstanceHandle() 之前。)

【讨论】:

  • 我的项目中没有任何 DLLMain :))
  • 你应该可以只添加一个 - 请参阅我链接到的帖子
  • 您可以尝试我链接到的帖子中给出的第二种方法 - 否则,MSDN 提供了有关在您自己的 dll 中覆盖 dllmain 所需执行的操作的详细信息:support.microsoft.com/kb/148791
  • 或查看我对答案的编辑 - 将 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 添加到您的 DLL 入口点
  • AfxGetResourceHandle() ?
【解决方案2】:

看看this question,如果它是一个MFC DLL,它将告诉你如何获取你的DLL的HINSTANCE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多