CString和LPVOID的轉(zhuǎn)換(線程參數(shù)傳遞) .標(biāo)簽:
測試2012-07-07 22:15 4364人閱讀
評論(0)
舉報網(wǎng)上找到很多結(jié)果,中文的,外文的。像codeproject,stackoverflow等等,看到的結(jié)果都不能解決問題。
自己動手,豐衣足食。
msdn上說,CString可以用來隨意替換const char* and LPCTSTR 類型的函數(shù)形參。隨意轉(zhuǎn)換就是了。具體不深究,解決問題先。
聲明一下使用目的:給新開線程傳入CString類型字符串值,但AfxBeginThread函數(shù)需要傳入LPVOID類型參數(shù)。于是,矛盾開始了。
static CString s=_T("640x480_3.jpg");//如果函數(shù)內(nèi),一定要聲明是static,否則在別的函數(shù)調(diào)用本函數(shù)聲明的自動變量,除非你想開玩笑?;蛘呷郑o態(tài))變量。總之要保證另一個函數(shù)可以訪問這個地址。
先看幾個相關(guān)的地址(位于當(dāng)前線程,當(dāng)時調(diào)試環(huán)境):
s的地址:
m_pszData = 0x0184e0a0 "640x480_3.jpg"
s.GetBuffer()(真正數(shù)據(jù)的地址):
m_pszData = 0x0184e0e0 "640x480_3.jpg"
CString *p=&s:
p = 0x2d6bd764 {0x0184e0a0}
m_pszData = 0x0184e0a0 "640x480_3.jpg"
傳遞p肯定不對??梢詡鬟f(LPVOID)p->GetBuffer()=(LPVOID)s.GetBuffer():0x0184e0e0 ,但實際lpParam獲得的地址依然是0x0184e0a0 。
先提示一句,要想調(diào)用函數(shù)能夠準(zhǔn)確獲得CString數(shù)據(jù),必須且只能傳遞s對象的地址“0x0184e0a0”,并不是&s。
現(xiàn)在總結(jié)一下可行的調(diào)用方法:
1. AfxBeginThread(ThreadFunction,(LPVOID)(LPCTSTR)s);//這個必須是s的地址了。
即,(LPVOID)(LPCTSTR)s=s的地址=lpParam = 0x0184e0a0 {void*}
其他的傳入?yún)?shù)均不正確。如(LPVOID)((LPCTSTR))s.GetBuffer()=0x0184e0e0 獲取到的數(shù)據(jù)為空。
至于其他的CString*什么的轉(zhuǎn)換,我這里沒有嘗試,切記,傳入s對象的地址。
2. AfxBeginThread(ThreadFunction,(LPVOID)s.GetBuffer());
s.GetBuffer()的地址肯定不等于s對象的地址,但ThreadFunction中的 lpParam獲得的依然是正確的s對象的地址。
這種調(diào)用竟然也可以,暫未研究。
還有一種情況,如果傳入的是字符串常量值,可以這樣調(diào)用:
3. AfxBeginThread(ThreadFunction,(LPVOID)_T("640x480_3.jpg"));
其實這也很好理解,此時傳入的是保存字符串字面常量_T("640x480_3.jpg")的位置的地址,相當(dāng)于上面的s。
接收函數(shù):
UINT ThreadFunction(LPVOID lpParam)
{
CString fileName=(LPCTSTR)lpParam;//上面3種情況均
測試,可以正確解析。
}
希望這些方法在大家的電腦上一樣順利運(yùn)行。good luck。