CString和LPVOID的轉換(執行緒引數傳遞)

2021-06-06 01:26:20 字數 1568 閱讀 8413

網上找到很多結果,中文的,外文的。像codeproject,stackoverflow等等,看到的結果都不能解決問題。

自己動手,豐衣足食。

msdn上說,cstring可以用來隨意替換const char* and lpctstr 型別的函式形參。隨意轉換就是了。具體不深究,解決問題先。

宣告一下使用目的:給新開執行緒傳入cstring型別字串值,但afxbeginthread函式需要傳入lpvoid型別引數。於是,矛盾開始了。

static  cstring s=_t("640x480_3.jpg");//如果函式內,一定要宣告是static,否則在別的函式呼叫本函式宣告的自動變數,除非你想開玩笑。或者全域性(靜態)變數。總之要保證另乙個函式可以訪問這個位址。

s.getbuffer()(真正資料的位址):

傳遞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

其他的傳入引數均不正確。如(lpvoid)((lpctstr))s.getbuffer()=0x0184e0e0 獲取到的資料為空。

至於其他的cstring*什麼的轉換,我這裡沒有嘗試,切記,傳入s物件的位址。

2.       afxbeginthread(threadfunction,(lpvoid)s.getbuffer());

s.getbuffer()的位址肯定不等於s物件的位址,但threadfunction中的 lpparam獲得的依然是正確的s物件的位址。

這種呼叫竟然也可以,暫未研究。

還有一種情況,如果傳入的是字串常量值,可以這樣呼叫:

其實這也很好理解,此時傳入的是儲存字串字面常量_t("640x480_3.jpg")的位置的位址,相當於上面的s。

接收函式:

uint threadfunction(lpvoid lpparam)

C string報未引入和CString互轉

c 在使用string類的時候報錯 string undeclared identifier 解決方法 include 引入string.而不是,using namespace std 引入命明空間.如果要輸出內容就要用 include include using namespace std cst...

string和CString 的比較

一 概述 string和cstring均是字串模板類,string為標準模板類 stl 定義的字串類,已經納入c 標準之中 cstring typedef cstringt cstring 為visual c 中最常用的字串類,繼承自c stringt類,主要應用在mfc和atl程式設計中,主要資料...

CString 和 char 的轉換

cstring 是一種很特殊的 c 物件,它裡面包含了三個值 乙個指向某個資料緩衝區的指標 乙個是該緩衝中有效的字元記數 它是不可訪問的,是位於 cstring 位址之下的乙個隱藏區域 以及乙個緩衝區長度。有效字元數的大小可以是從0到該緩衝最大長度值減1之間的任何數 因為字串結尾有乙個null字元 ...