ページ 11

テキストファイルをリソースとして読み出せない

Posted: 2014年7月06日(日) 21:25
by ぬるぽ
はじめまして、私ぬるぽと申します
よろしくお願い致します。

早速表題についてなのですが、

リソースとしてtxtファイルを追加し、FindResource、LoadResourceしようとすると
HRSRCの変数にはNULLが入ってきてテキスト内のデータを使った処理ができない状態です。

【現状】
  ・FindResourceから返ってくる値がNULL
  ・リソースであるtxtファイルは読めている様子
Creating Debug\Resource.res

Using codepage 932 as default

Resource\Resource.rc.
Writing TEXT:TEXT_DATA, lang:0x409, size 1525
【動作環境】
  Windows7 64bit + VC++2010 Express

【ディレクトリ構造】
プロジェクトフォルダ
├Source
│ └Core.cpp
├Resource
│ ├Resource.h
│ ├Resource.rc
│ └textData.txt

【Core.cpp】

コード:

HINSTANCE hInstance = GetModuleHandle(NULL);
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(TEXT_DATA), TEXT("TEXT"));
HGLOBAL hGlobal = LoadResource(hInstance, hResource);
LPVOID resourceBuffer = LockResource(hGlobal);
【resource.h】

コード:

#pragma once

#define TEXT_DATA 100
【resource.rc】

コード:

TEXT_DATA TEXT "../Resource/textData.txt"
この問題について詳しい方からの意見を伺いたいです。
当方WinAPIについては無知でして何か不備があるのは承知のうえです。

以上、よろしくお願い致します。

Re: テキストファイルをリソースとして読み出せない

Posted: 2014年7月06日(日) 21:35
by みけCAT
私は詳しくないですが、
FindResource関数の第三引数は文字列を直接指定するのではなく、定数を使用するべきかもしれません。
http://msdn.microsoft.com/ja-jp/library/cc410845.aspx

ごめんなさい、多分嘘です。
とりあえず過去ログにサンプルがあったので貼っておきます。
http://dixq.net/forum/viewtopic.php?f=3&t=7102#p60163

Re: テキストファイルをリソースとして読み出せない

Posted: 2014年7月07日(月) 10:20
by YuO
User-Defined Resourceについて試していないのですが,Win32でのエラー処理一般の話として。
MSDNによると,FindResource APIは失敗するとNULLを返し,詳しい情報はGetLastError APIで取得できるとあります。
FindResourceしたあとに,

コード:

if (hRresource == NULL) {
    ::DWORD errorCode = ::GetLastError();
    ::TCHAR buf[64];
    ::wsprintf(buf, TEXT("FindResource error code : %u\n"), errorCode);
    ::OutputDebugString(buf);
    // returnなりthrowなりstd::exitなり
}
のようにして,エラーコードを出力させてみるとよいでしょう。
Retrieving the Last-Error Codeにあるコードを使って,文字列化したものを出力するとなおよいです。
オフトピック
私は面倒なので,エラーコード出力してそのコードをNET HELPMSGに渡して表示させることが多いです。
----
2014-07-07T10:21+09:00頃 : wsprintfの引数間違いを修正

Re: テキストファイルをリソースとして読み出せない

Posted: 2014年7月07日(月) 16:07
by naohiro19

コード:

#include <windows.h>
#include <tchar.h>

BOOL ShowAPIErrorMessage(
			HWND hWnd)		//ウィンドウハンドル(NULL可能)
{
	const int len = 512;
	DWORD result;	//FormatMessage関数の戻り値
	static TCHAR errmsg[len + 1];	//GetLastError関数のエラー文字列
	
	result = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
		errmsg, len + 1, NULL);
	//関数が成功したときはメッセージボックスに情報を表示してTRUEを返す
	if (result > 0) {
		MessageBox(hWnd, errmsg, TEXT("GetLastErrorの内容"), MB_ICONINFORMATION | MB_OK);
		return TRUE;
	} else {
		//関数が失敗したときはFALSEを返す
		return FALSE;
	}
}
この関数を使えばMessageBoxでエラーが発生している原因を調べることができます
たとえば「この操作を正しく終了しました。」以外が表示されればAPI関数の中でエラーが発生しています。

Re: テキストファイルをリソースとして読み出せない

Posted: 2014年7月07日(月) 20:34
by ぬるぽ
返信有難うございます。

ご教授頂いた方法でエラー内容を確認したところ下記のようなエラー内容となっていました。
指定されたリソースの種類がイメージファイルに見つかりません
どうやらテキストファイルがイメージファイルとして解釈されているようです。

もしかしたらなのですがVC++2010 Expressで下の2つのファイルを手動で作成したのが良くないのでしょうか?
Resource.h
Resource.rc

引き続きよろしくお願い致します。

Re: テキストファイルをリソースとして読み出せない

Posted: 2014年7月07日(月) 21:04
by Bull
Resource.rc で Resource.h をインクルードしていますか?
リソースコンパイラのメッセージを見ると"TEXT_DATA"が文字列のまま使われているようです。
Core.cppでは"MAKEINTRESOURCE"が使われているので、Resource.h をインクルードしていると思います。
そうするとプログラム(数値)とリソース(文字列)で不整合が起こって読み込めないのでしょう

Re: テキストファイルをリソースとして読み出せない

Posted: 2014年7月15日(火) 23:15
by ぬるぽ
しばらく応答できず申し訳ありません。

自己解決しました。
hInstanceの値が不正なようでリソースがNULLを返していたようです。

GetModuleHandle(NULL)によって取得していたhInstanceが正しいを考えていたのですが
中の値がエントリポイントから得られるhInstanceの値と異なっていました。

これにて解決とさせていただきます。
ありがとうございました。