網上找到很多結果,中文的,外文的。像codeproject,stackoverflow等等,看到的結果都不能解決問題。
自己動手,豐衣足食。
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。
現在總結一下可行的調用方法:
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種情況均測試,可以正確解析。
}
希望這些方法在大家的電腦上一樣順利運行。good luck。