2017-09-26 205 views
1

我想在資源文件.rc中實現一個字符串表,然後使用函數CString :: LoadStringW()加載特定的字符串。 這是代碼的main.cpp:C++ visual studio資源

#ifndef _AFXDLL 
#define _AFXDLL 
#endif 
#include <afx.h> 
#include <stdio.h> 
#include "resource.h" 

int main() 
{ 
    printf("Code Example: Load resource file data\n"); 

    CString sentence; 
    sentence.LoadStringW(IDS_STRING101); 
    printf("Sentence: %s", sentence); 

    getchar(); 
    return 0; 
} 

現在已經有說明良好的聯繫,如何使用資源文件爲:

http://www.cplusplus.com/forum/windows/119338/

http://www.winprog.org/tutorial/resources.html

問題是,當我編譯代碼然後嘗試運行,它不會讀取字符串。 調試運行時,有LoadStringW行()函數拋出一個斷言錯誤:

Debug Assertion Failed! 

Program: C:\WINDOWS\SYSTEM32\mfc140ud.dll 
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl 
Line: 24 

For information on how your program can cause an assertion 
failure, see the Visual C++ documentation on asserts. 

在我提供的是第一個網址的結尾(如最後一步)鏈接編譯資源文件.RC和我的源文件主的.cpp。 我不知道如何做到這一點,也許這就是爲什麼我的程序無法按預期工作。

請問,你有什麼建議嗎?

我正在嘗試MSVS 2015/2017.

謝謝。

+1

你的資源文件是什麼樣的?哪條線導致斷言?爲什麼你在頂部定義了_AFXDLL? – VTT

+0

斷言是由行'sentence.LoadStringW(IDS_STRING101);'引起的。我使用'_AFXDLL',因爲我使用MFC和運行時庫選項/ MDd。我只是編譯錯誤。但刪除這個定義和使用/ MT不會改變所描述的問題。我將在短時間內簡化資源文件並在此處提供... –

+0

斷言實際上是由'LoadStringW'中的一些代碼觸發的。也許它顯示了一個真正的斷言點(即'assert(...)')的合適的堆棧跟蹤,因此可以確定失敗的斷言條件?另外'IDS_STRING101'的價值是什麼? 101? – VTT

回答

0

過了一段時間,我仍然無法解釋爲什麼發佈的代碼無法正常工作。然而,從字符串表讀取字符串資源時,我使用了不同的功能LoadString(),並最終使其工作,實際上它不是CString類的一部分。

與NULL資源句柄問題是由獲得一個句柄到包含這些資源的運行.exe文件解決(很好的工具,以驗證其資源包括例如是資源黑客) - 與GetModuleHandle(NULL)

下面是完成工作代碼片段。

main.cpp中:

#include <afx.h> 
#include <stdio.h> 
#include "resource.h" 
#define BUF_SIZE 50 

int main(void) 
{ 
    printf("Code Example: Load resource file data\n"); 

    wchar_t buffer[BUF_SIZE]; 

    if (!LoadString(GetModuleHandle(NULL), IDS_STRING104, buffer, BUF_SIZE)) 
    { 
     printf("Error Loading String: IDS_STRING104\n"); 
    } 
    else 
    { 
     printf("resource string: %ls\n", buffer); 
    } 

    getchar(); 
    return 0; 
} 

RESOURCE.H:

#define IDS_STRING103     103 
#define IDS_STRING104     104 

RESOURCE.RC:

#include "resource.h" 

STRINGTABLE 
BEGIN 
    IDS_STRING103   "Resource 103 sentence" 
    IDS_STRING104   "Resource 104 sentence" 
END 

這裏有一定的參考,這是對我很有用:

How to get my own code's module handle?

https://msdn.microsoft.com/en-gb/library/windows/desktop/ms647486.aspx