none
一個有關 LoadString() 使用方式的問題。 RRS feed

  • 問題

  • 大家好,第一次上來這裡發問,希望大家多多指教。

     

    在小弟負責維護的一個程式中,發現了類似下面的程式碼(經過我簡化的改寫):

     

    Code Snippet

    Str = (LPCTSTR)LoadString( ID, UID, NULL, 0) ;

    而其指向的 resource 是定義如下:

    Code Snippet

     

    UID   "abc"

    UID2 "123"

    UID3 "456"

     以下類推

     

     

    當然,理想中的 Str 是希望它指向 "abc" ,但輸出的結果卻是

    "abc123456....."

    小弟在 MSDN 中發現了以下的說明:

    • If lpBuffer is set to NULL, the return value is a pointer to the requested string. The caller should cast the return value to an LPCTSTR. This pointer points directly to the resource, so the string is read-only. The length of the string, not including any terminating null character, can be found in the word preceding the string.

    對它的配制有了基本的認識,也準備寫一段 code 來專門取出每一段 str,但又在下面看到一段說明:

    • String resources are not null-terminated by default. When lpBuffer is set to NULL, verify whether the string resource represented by the pointer returned by LoadString is null-terminated, and if necessary, append a terminating null character to the resource before using it in your application.

    對於這個說明小弟便感到一頭霧水了,完全不知道它想要表達的意思是什麼,而 MSDN 中又沒有 reference code 可以研究,所以來此請教各位前輩,不知有對這種 LoadString 的使用,沒有什麼比較 classic 的處理方式呢?

     

    另外則是上面這段文字他到底想表達什麼意思?

     

    還請各位多多指教,小弟先謝過。

     

    2008年7月30日 上午 12:29

解答

  • 首先謝謝您的回覆。

     

    再來,對於 LoadString 是有另一種用法的,詳情請看 MSDN 的 Windows Mobile 版本的 LoadString。

    而第一第二個參數只是為了表示問題,我簡單用一個表示式而以,在程式裡,它們是沒有問題的。

     

    在 MSDN 中有規範到,假如 第三個參數為 NULL,則 LoadString 會 return 一個 potiner,指向這筆資源,而下面的說明則有一些有關於結束字元的說明。

    • String resources are not null-terminated by default.

     

    另外,這個問題我今天已經解掉了,要使用這個功能有二個做法,一個就是如它所說,在 resouce compiler 裡加入 -n 這個 option,則 resouce compiler 就不會把 terminating null character 給過瀘掉。

     

    如此一來我上面的程式碼就可以正確執行。

     

    另一個方法則是利用它文中提到的另一個特性:

    • The length of the string, not including any terminating null character, can be found in the word preceding the string.

    以下是我測試用的 code :

    Code Snippet

        HINSTANCE hd ;
        LPCTSTR str1 ;
        TCHAR *str3 ;
        int len ;
       
        hd = AfxGetInstanceHandle() ;
        str1 = (LPCTSTR)LoadString(hd, IDS_STRING129, NULL, 0) ;
        len = (int)*(str1-1) ;
        str3 = new TCHAR[len+1] ;
        memcpy((void *)str3, str1, (len+1)*sizeof(TCHAR) ) ;
        *(str3+len)='\0' ;
        MessageBox(NULL, (TCHAR *)str3 , NULL, MB_OK) ; 

     

     

    有興趣的人可以拿去研究看看。

     

    另外感謝所有幫忙想過這個問題的人。

    2008年7月30日 上午 03:02

所有回覆

  • HI,

     

    您好像用錯了, 您必須在第二個參數填入欲載入的字串於String Table資源中的ID, 再於第三個參數準備一個存放載入字串的字元陣列, 呼叫後從第三個參數取結果即可

     

    tihs

    2008年7月30日 上午 02:34
  • 首先謝謝您的回覆。

     

    再來,對於 LoadString 是有另一種用法的,詳情請看 MSDN 的 Windows Mobile 版本的 LoadString。

    而第一第二個參數只是為了表示問題,我簡單用一個表示式而以,在程式裡,它們是沒有問題的。

     

    在 MSDN 中有規範到,假如 第三個參數為 NULL,則 LoadString 會 return 一個 potiner,指向這筆資源,而下面的說明則有一些有關於結束字元的說明。

    • String resources are not null-terminated by default.

     

    另外,這個問題我今天已經解掉了,要使用這個功能有二個做法,一個就是如它所說,在 resouce compiler 裡加入 -n 這個 option,則 resouce compiler 就不會把 terminating null character 給過瀘掉。

     

    如此一來我上面的程式碼就可以正確執行。

     

    另一個方法則是利用它文中提到的另一個特性:

    • The length of the string, not including any terminating null character, can be found in the word preceding the string.

    以下是我測試用的 code :

    Code Snippet

        HINSTANCE hd ;
        LPCTSTR str1 ;
        TCHAR *str3 ;
        int len ;
       
        hd = AfxGetInstanceHandle() ;
        str1 = (LPCTSTR)LoadString(hd, IDS_STRING129, NULL, 0) ;
        len = (int)*(str1-1) ;
        str3 = new TCHAR[len+1] ;
        memcpy((void *)str3, str1, (len+1)*sizeof(TCHAR) ) ;
        *(str3+len)='\0' ;
        MessageBox(NULL, (TCHAR *)str3 , NULL, MB_OK) ; 

     

     

    有興趣的人可以拿去研究看看。

     

    另外感謝所有幫忙想過這個問題的人。

    2008年7月30日 上午 03:02