在副线程中LoadString失败解决办法

原创 2013年12月02日 10:46:33

         今天在项目中遇到一个问题:CString对象调用字符串资源ID老是返回失败,调试发现LoadString函数找不到资源ID对应的字符

资源,但是工程中其他地方调用Loadstring是正常的,所有一系列的对比调试,还是没有解决问题。

后来网上查询和咨询同事,得到线索:可能是线程调用问题;找到问题索引后再到网上查询,果然有前辈解答:

在COM组件中的调用函数的开始应该要加上AFX_MANAGE_STATE(AfxGetStaticModuleState()),来切换Module State。当前的resource handle是在Module State中保存的,LoadString需要这个Resource Handle来知道应该在那个Module中Load resource,不切换就会出现找不到资源的错误。正确的代码如下:
void MyDllExportedFunc()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // ...
}

我的工程是COM组件类型,在开启副线程中调用Loadstring失败,以上方法可以解决此类问题,

在主线程中调用AfxGetResourceHandle()函数,保存资源句柄。在工作者线程中调用AfxSetResourceHandle函数设置主线程保存的资源句柄也可以解决此问题。

希望可以帮助和我遇到类似问题的朋友。


CString的两种LoadString

CString aa; 1.bool aaa = aa.LoadString(IDS_STATUS_DATA); 如果不能成功的话,就试一下: 2.bool aaa = aa.LoadStr...
  • whysnlc
  • whysnlc
  • 2012年12月25日 09:37
  • 1525

CString对象的一种错误的使用方式

我现在做的系统有的时候会出现这样的断言失败: Debug Error! DAMAGE: after Normal block (#328Array) at 0x182C30F0. 跟踪一下,发...

VS2008安装失败解决办法

  • 2014年01月13日 22:28
  • 27KB
  • 下载

【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)

今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别。所以花了点时间研究了下。   据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的。 ...

关于handler在子线程中无法给activity传递信息的问题及解决办法

遇到一个问题,我在与服务器交互信息时,开启了另一个线程,并未这个线程(子线程)传入了handler,得到服务器返回的结果后,我开启了Looper,然后调用handler.sendMessage()想把...

PS卸载器及安装PS失败解决办法

  • 2017年12月13日 20:53
  • 6.97MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在副线程中LoadString失败解决办法
举报原因:
原因补充:

(最多只允许输入30个字)