2010年1月31日 星期日

win32 LoadString Function...

LoadString這個function可以用來載入某個instance裡面內含的string resource.
MSDN中對於nBufferMax參數有提到:
"If this parameter is zero, then lpBuffer receives a read-only pointer to the resource itself."

所以基本上我只要nBufferMax傳0進去.. lpBuffer就可以拿到我們指定的ID對應的string囉...

心裡這樣想,寫了下面的程式
LPTSTR haha = NULL;
LoadString(hInstance, IDS_HAHA100, haha, 0);

結果haha回來的值還是NULL (倒

難道msdn也會拐人嗎XDD

msdn有對這個技巧說明: 這個方法只能用在LoadStringW... 很好... 我寫的是unicode程式阿XDD
(都什麼時代了還在寫ansi...)
所以我的程式當然是call LoaodStringW...

google半天也不知所以然

思考了很久很久
突然想到
因為傳進去的是LPTSTR... 所以LoadString內部一定是copy一份這個變數的"值"進去 (call by value嘛)
然後在LoadString內對自己function內宣告的變數改得很高興 但是外面的變數根本就沒動阿XDD
所以應該是要傳LPTSTR的pointer進去給LoadString才對

不過LoadString只吃LPTSTR說...
改寫一下變成:
LoadString(hInstance, IDS_HAHA100, (LPTSTR)(&haha), 0);

喔喔喔喔喔喔 成功了
不過是沒有\0 (null-terminated char)的字串
要自己切

不過我記得有google到只要加/n參數在resource compiler那邊
編譯出來的resource就會含\0
不然就要自己切字串, LoadString會回傳ID對應的String長度
看是要執行檔resource肥一點點點 但跑比較快
還是執行檔code肥一點 然後要自己切字串 跑比較慢

恩 這樣搞定一個問題 很高興 :D

沒有留言: