2011-12-17 27 views
2

我正在努力使我的應用程序成爲國際化的。經過兩天對msdn的挖掘,我想出了一個測試,它加載了包含資源的特定於語言的庫。這也是我第一次嘗試將庫加載爲資源,從中加載字符串等等。帶nBufferMax的LoadString等於0

接下來,根據msdn例如http://msdn.microsoft.com/en-us/library/windows/desktop/dd319071%28v=VS.85%29.aspx,我試着LoadString。

由於整個應用程序的字符串加載等於大量的文本複製,我以爲我會用 - 我認爲是 - LoadString的內存高效功能,它將nBufferMax參數設置爲零。根據LoadString文檔,它應該返回一個指向字符串資源的指針。我想我會做一個結構或類的字符串指針,做這些方針的東西(我只提取了重要的位):

wchar_t textBuf[SOMEVALUE]; // <-- this is how id DOES work 
wchar_t *myString; // <-- this is how i would like it 
HMODULE resContainer=LoadLibraryEx(L"MUILibENU.dll",NULL, LOAD_LIBRARY_AS_DATAFILE); 
if(0!=resContainer){ 
    // this works OK 
    int copied=LoadStringW(resContainer,IDS_APP_TITLE,textBuf,SOMEVALUE); 
    // this fails, also gives a warning at compile time about uninitialized variable used. 
    int copied=LoadStringW(resContainer,IDS_APP_TITLE,myString,0); 
} 

正如你能看到我的努力得到了mystring成爲指針加載資源庫的字符串,而不實際複製任何內容。 我的問題是:我誤解了msdn文檔?我能否或者不能直接在加載的庫中獲得指向字符串的指針,並在稍後使用它,例如顯示一個消息框,而不實際複製任何東西?直到我卸載所說的庫?

回答

3

MSDN說:

[...]如果這個參數爲0,則lpBuffer接收只讀指針資源本身。

這意味着一)必須將鼠標指針const wchar_t*類型:

const wchar_t *myString; 

和b)你必須通過一個指針的指針,並使用一個醜陋的轉換:

int copied=LoadStringW(resContainer,IDS_APP_TITLE,(LPWSTR)&myString,0); 
+0

你發現了一個不尋常的MSDN頁面,[需要的引證] – 2011-12-17 21:57:46

+0

我看,一個類型轉換,我實際上已經嘗試過const wchar_t *但我以某種方式沒有想到如圖所示。也許是因爲我討厭演員。儘管它很「醜」,但它仍然有效:-) – Kitet 2011-12-17 22:07:53

+0

@Kitet:不幸的是,Windows API有很多地方在同一個函數中擠壓不同的功能。這導致參數具有取決於其他參數的多個角色。所以他們實際上更像是'工會',但他們不是工會,所以你必須做演員。除了邏輯上說'LoadStringW'不能初始化你的局部變量,除非你給它一個指針......(這是C接口,記得嗎?) – ybungalobill 2011-12-17 22:20:25