码迷,mamicode.com
首页 > 编程语言 > 详细

CString和LPVOID的转换(线程参数传递)

时间:2015-04-02 15:05:37      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

msdn上说,CString可以用来随意替换const char* and LPCTSTR 类型的函数形参。随意转换就是了。具体不深究,解决问题先。

声明一下使用目的:给新开线程传入CString类型字符串值,但AfxBeginThread函数需要传入LPVOID类型参数。于是,矛盾开始了。

static  CString s=_T("640x480_3.jpg");//如果函数内,一定要声明是static,否则在别的函数调用本函数声明的自动变量,除非你想开玩笑。或者全局(静态)变量。总之要保证另一个函数可以访问这个地址。

先看几个相关的地址(位于当前线程,当时调试环境):

s的地址:       

 m_pszData = 0x0184e0a0 "640x480_3.jpg"
s.GetBuffer()(真正数据的地址):
m_pszData = 0x0184e0e0 "640x480_3.jpg"

CString *p=&s:
p = 0x2d6bd764 {0x0184e0a0}
m_pszData = 0x0184e0a0 "640x480_3.jpg"

传递p肯定不对。可以传递(LPVOID)p->GetBuffer()=(LPVOID)s.GetBuffer():0x0184e0e0 ,但实际lpParam获得的地址依然是0x0184e0a0 。

先提示一句,要想调用函数能够准确获得CString数据,必须且只能传递s对象的地址“0x0184e0a0”,并不是&s。
现在总结一下可行的调用方法:

CString ---> LPVOID :          LPVOID = (LPVOID)(LPCTSTR)CString;
1.        AfxBeginThread(ThreadFunction,(LPVOID)(LPCTSTR)s);//这个必须是s的地址了。
即,(LPVOID)(LPCTSTR)s=s的地址=lpParam = 0x0184e0a0 {void*}
其他的传入参数均不正确。如(LPVOID)((LPCTSTR))s.GetBuffer()=0x0184e0e0 获取到的数据为空。

至于其他的CString*什么的转换,我这里没有尝试,切记,传入s对象的地址。

2.       AfxBeginThread(ThreadFunction,(LPVOID)s.GetBuffer());

s.GetBuffer()的地址肯定不等于s对象的地址,但ThreadFunction中的 lpParam获得的依然是正确的s对象的地址。

这种调用竟然也可以,暂未研究。

还有一种情况,如果传入的是字符串常量值,可以这样调用:
3.       AfxBeginThread(ThreadFunction,(LPVOID)_T("640x480_3.jpg"));

其实这也很好理解,此时传入的是保存字符串字面常量_T("640x480_3.jpg")的位置的地址,相当于上面的s。

接收函数:
UINT ThreadFunction(LPVOID lpParam)
{
 CString fileName=(LPCTSTR)lpParam;//上面3种情况均测试,可以正确解析。
}

LPVOID ---> CString:          CString fileName=(LPCTSTR)lpParam;

CString和LPVOID的转换(线程参数传递)

标签:

原文地址:http://blog.csdn.net/ghevinn/article/details/44832303

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!