ページ 1 / 1
テキストファイルをリソースとして読み出せない
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の値と異なっていました。
これにて解決とさせていただきます。
ありがとうございました。