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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬるぽ
記事: 3
登録日時: 11年前

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

#1

投稿記事 by ぬるぽ » 11年前

はじめまして、私ぬるぽと申します
よろしくお願い致します。

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

リソースとして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については無知でして何か不備があるのは承知のうえです。

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 11年前

私は詳しくないですが、
FindResource関数の第三引数は文字列を直接指定するのではなく、定数を使用するべきかもしれません。
http://msdn.microsoft.com/ja-jp/library/cc410845.aspx

ごめんなさい、多分嘘です。
とりあえず過去ログにサンプルがあったので貼っておきます。
http://dixq.net/forum/viewtopic.php?f=3&t=7102#p60163
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

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

#3

投稿記事 by YuO » 11年前

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の引数間違いを修正

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

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

#4

投稿記事 by naohiro19 » 11年前

コード:

#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関数の中でエラーが発生しています。

ぬるぽ
記事: 3
登録日時: 11年前

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

#5

投稿記事 by ぬるぽ » 11年前

返信有難うございます。

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

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

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

Bull
記事: 149
登録日時: 11年前

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

#6

投稿記事 by Bull » 11年前

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

ぬるぽ
記事: 3
登録日時: 11年前

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

#7

投稿記事 by ぬるぽ » 11年前

しばらく応答できず申し訳ありません。

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る