CString 與LPVOID轉換問題

來源:互聯網
上載者:User
  

網上找到很多結果,中文的,外文的。像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。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.