2017-09-26 26 views
1

リソースファイル.rcに文字列テーブルを実装しようとしていて、関数CString :: LoadStringW()を使用して特定の文字列をロードしようとしています。 これはコードmain.cppにある:C++ビジュアルスタジオリソース

#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と私のソースファイルの主をリンクする(最後のステップとして)私が提供される最初の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. 

:デバッグのとき 、LoadStringWとのラインは()関数は、アサーションエラーがスローされます.cpp。 これを行う方法がわかりません。おそらくこれが私のプログラムが期待どおりに動作しない理由です。

お願い、お勧めはありますか?

私はMSVS 2015/2017年に

感謝をしようとしています。

+1

あなたのリソースファイルはどのように見えますか?アサーションを引き起こすのはどのラインですか?なぜあなたは '_AFXDLL'を上に定義していますか? – VTT

+0

アサーションは 'sentence.LoadStringW(IDS_STRING101);'行によって引き起こされます。 MFCとランタイムライブラリオプション/ MDdを使用しているので、私は '_AFXDLL'を使用します。私はちょうどコンパイラエラーsutisfied。しかし、この定義を削除して/ 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