2017-09-26 11 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

문제는 코드를 컴파일하고 실행하려고하면 문자열을 읽지 않습니다. 컴파일 된 리소스 파일 .RC 내 소스 파일 주를 연결하는 (마지막 단계) I가 제공하는 첫 번째 URL의 끝에서

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. 

: debuging 때 , LoadStringW으로 라인() 함수는 어설 션 오류가 발생합니다 .cpp. 이 작업을 수행하는 방법을 잘 모르겠습니다. 아마도 이것이 내 프로그램이 예상대로 작동하지 않는 이유 일 수 있습니다.

제발, 추천 해 주시겠습니까?

나는 MSVS 2015/2017을 시험 중이다.

고마워.

+1

리소스 파일의 모양은 무엇입니까? 주장을 일으키는 줄은 무엇입니까? 상단에'_AFXDLL'이 정의 된 이유는 무엇입니까? – VTT

+0

어설 션은'sentence.LoadStringW (IDS_STRING101);'행에 의해 발생합니다. MFC와 런타임 라이브러리 옵션/MDd를 사용하기 때문에'_AFXDLL'을 사용합니다. 난 그냥 컴파일러 오류 sutisfied. 그러나이 정의를 제거하고/MT를 사용한다고해서 문제가 바뀌지는 않습니다. 나는 리소스 파일을 단순화하고 짧은 시간에 여기에 제공 할 것이다 ... –

+0

어설 션은 실제로 LoadStringW 내부의 일부 코드에 의해 트리거된다. 어쩌면 진짜 assertion spot (즉 assert (...))을 가진 적절한 스택 트레이스를 보여 주어 실패한 assertion condition을 결정할 수 있습니까?또한'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