FindResourceの使い方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
滝の上のマスカット

FindResourceの使い方について

#1

投稿記事 by 滝の上のマスカット » 13年前

こんにちは、滝の上のマスカットです。
早速ですが、
FindResource(hmodule, MAKEINTRESOURCE(test), RT_STRING);
のhmoduleのところには、どんな型の変数を指定すればいいのでしょうか。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: FindResourceの使い方について

#2

投稿記事 by bitter_fox » 13年前

HMODULE型のようです。

以下、 http://msdn.microsoft.com/ja-jp/library/cc410845.aspx より
>>hModule
>>[入力]リソースが入った実行可能ファイルを持つモジュールのハンドルを指定します。
>>NULL を指定すると、現在のプロセスを作成するときに使われたイメージファイルに関連付けられたモジュールが使われます

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

Re: FindResourceの使い方について

#3

投稿記事 by naohiro19 » 13年前

パラメータ
hModule
[入力]リソースが入った実行可能ファイルを持つモジュールのハンドルを指定します。
NULL を指定すると、現在のプロセスを作成するときに使われたイメージファイルに関連付けられたモジュールが使われます
とのことなのでNULLでもいいと思われます

滝の上のマスカット

Re: FindResourceの使い方について

#4

投稿記事 by 滝の上のマスカット » 13年前

教えていただいたことと、それをもとに自分で調べたことを使って、コードを組んでみたんですが、エラーが発生しました。

コード:

 
#include "DxLib.h"
#include "test.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	HRSRC a;
        HANDLE b;
	LPBITMAPINFO c;←ここに関してはよくわからないで入れてしまいました。
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	a = FindResource( NULL, MAKEINTRESOURCE(test), RT_STRING);
	b = LoadResource( NULL, a);
	c = (LPBITMAPINFO)LockResource(b);←いろいろやってみて、このあたりでエラーが発生しているようです。LPBITMAPINFOこれは、テキストファイルを読み込むことに適応していないってことなのでしょうか。

	printf((char *)c); 
	DxLib_End();
    return 0;
}

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: FindResourceの使い方について

#5

投稿記事 by bitter_fox » 13年前

滝の上のマスカット さんが書きました:

コード:

 
    HANDLE b;
LPBITMAPINFO c;←ここに関してはよくわからないで入れてしまいました。

a = FindResource( NULL, MAKEINTRESOURCE(test), RT_STRING);
b = LoadResource( NULL, a);
c = (LPBITMAPINFO)LockResource(b);←いろいろやってみて、このあたりでエラーが発生しているようです。LPBITMAPINFOこれは、テキストファイルを読み込むことに適応していないってことなのでしょうか。

printf((char *)c); 
まず、LoadResourceの戻り値の型は、HGLOBAL型のようですがHANDLE型でも良いのでしょうか?
次に、LoadResourceは、NULLを返す可能性がありLockResourceには、
<呼び出しに成功した LoadResource 関数の戻り値だけを指定>するそうなので
if (b == NULL)のようにしてNULLチェックしてみてください。
LPBITMAPINFOはBITMAPINFOのポインタなので、それをchar*にキャストする意味が良くわからないのですが
printf((char*)c);
では何が表示されたいのでしょうか??

また、エラーとは具体的にどのようなものなのでしょうか??

以下参考
http://msdn.microsoft.com/ja-jp/library/cc410882.aspx
http://msdn.microsoft.com/ja-jp/library/cc410874.aspx <>内はここから引用

滝の上のマスカット

Re: FindResourceの使い方について

#6

投稿記事 by 滝の上のマスカット » 13年前

うーんと、まだ、型とかがよくわかっていないので、なんともいえないのですが。
ちょっと確認してみます。

滝の上のマスカット

Re: FindResourceの使い方について

#7

投稿記事 by 滝の上のマスカット » 13年前

コード:

#include "DxLib.h"
#include "test.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	HRSRC a;
        HANDLE b;
	LPBITMAPINFO c;
	char Key[256];

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
	
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
	a = FindResource( NULL, MAKEINTRESOURCE(test), RT_STRING);
	if (a == NULL){
		printf("aでエラーが発生しています。");
	}

	b = LoadResource( NULL, a);
	if (b == NULL){
		printf("bでエラーが発生しています。");
	}

	c = (LPBITMAPINFO)LockResource(b);
	if (c == NULL){
		printf("cでエラーが発生しています。");
	}

	printf( (const char*) c);

        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

上のコードを実行してみました。a,b,cは、のエラーは発生しませんでした。
printfはcに読み込まれた、データを画面上に出力するという意味で書きました。
エラー内容は
Debug Assertion Failed!

Program: C:\User\name\Desktop\test\Debug\test.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\printf.c
Line: 54

Expression: (format != NULL)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

というようなものが表示されるのですが。
 あと、継続をしようとすると、test.exeでブレークポイントが発生しましたと表示されます。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: FindResourceの使い方について

#8

投稿記事 by bitter_fox » 13年前

滝の上のマスカット さんが書きました:
printf( (const char*) c);

printfはcに読み込まれた、データを画面上に出力するという意味で書きました。
エラー内容は
Debug Assertion Failed!

Program: C:\User\name\Desktop\test\Debug\test.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\printf.c
Line: 54

Expression: (format != NULL)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
前回も書きましたが、LPBITMAPINFOはBITMAPINFO構造体のポインタ版で、
BITMAPINFOは以下のようになっています
<
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;

bmiHeader
デバイスに依存しないビットマップの寸法とカラー フォーマットに関する情報を保持する BITMAPINFOHEADER 構造体を指定します。
bmiColors
ビットマップの色を定義する RGBQUAD データ型または DWORD データ型の配列を指定します。
>

これを文字列にキャストするのは不可能だと思うのですが、、、

表示したいデータって具体的にどんなものなんでしょうか??

参考
http://msdn.microsoft.com/ja-jp/library ... S.80).aspx <>内はここから引用

滝の上のマスカット

Re: FindResourceの使い方について

#9

投稿記事 by 滝の上のマスカット » 13年前

ビットマップのほうでしたか・・・・きずきませんでした。
文字列を読むというよりも、
リソースから、テキストファイルを読み込んでそれを、本当なら配列に読み込みたいんです。
ですが、まだそこまで追いつかないので、とりあえず、リソースを選択し、読み込み、それを、
変数に書き出して、それを表示するという感じにしたいのです。
それで、以前関数を教えていた出したので、それを使ってみようかなと思ったのです。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: FindResourceの使い方について

#10

投稿記事 by bitter_fox » 13年前

滝の上のマスカット さんが書きました:ビットマップのほうでしたか・・・・きずきませんでした。
文字列を読むというよりも、
リソースから、テキストファイルを読み込んでそれを、本当なら配列に読み込みたいんです。
ですが、まだそこまで追いつかないので、とりあえず、リソースを選択し、読み込み、それを、
変数に書き出して、それを表示するという感じにしたいのです。
それで、以前関数を教えていた出したので、それを使ってみようかなと思ったのです。
そうでしたか。RT_STRINGとしていたので変だと思ったのですが(笑)

LPSTR c;
としてみてください。


[hr]
[編集]

ストゥリングテーブルから文字列を読み込むのであれば、LoadResourceではなくLoadStringを使ったほうが早いようです。

コード:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
//中略
	LPTSTR str = (LPTSTR)calloc(1025, sizeof(TCHAR));
//中略
//FindResourceは不要
	LoadString(hInstance, test, str, 1024);
//LocResourceも不要
//中略
}
これだと、FindResourceもLockResourceも必要ありませんが、FindResourceを使って書かなければならないのであれば本末転倒ですね。。。

滝の上のマスカット

Re: FindResourceの使い方について

#11

投稿記事 by 滝の上のマスカット » 13年前

それでもいいのですが、自分的には将来VC++を利用してラノベゲームを作りたいなー。
と思っているのです、なので、ファイルから読みだして配列に保存するというのを、知っておきたいな程度のことなのです。
確かに専用の開発ソフトを使ってもいいのですが・・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: FindResourceの使い方について

#12

投稿記事 by softya(ソフト屋) » 13年前

滝の上のマスカット さんが書きました:それでもいいのですが、自分的には将来VC++を利用してラノベゲームを作りたいなー。
と思っているのです、なので、ファイルから読みだして配列に保存するというのを、知っておきたいな程度のことなのです。
確かに専用の開発ソフトを使ってもいいのですが・・・・。
返信先が間違ってませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: FindResourceの使い方について

#13

投稿記事 by softya(ソフト屋) » 13年前

本当にやりたい事は、こう言う事では?

コード:

#include "DxLib.h"
#include "../resource.h"	//リソースヘッダの場所は都合に応じて変更を。

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{
    int Cr ;
 
    ChangeWindowMode(TRUE);
    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1; // エラーが起きたら直ちに終了
    }
    
    //	テキストリソース。
    //	リソースにテキストファイルをインポートしてあります。
    //	リソースの種類はtextです。
	UINT nIDResource = IDR_TEXT1;
	LPCTSTR pResourceType = "text";
	
	//	リソース名を得る。
	LPCTSTR pResourceName = MAKEINTRESOURCE(nIDResource);
	
	//	リソースハンドルを得る。
	HRSRC hResource = FindResource( NULL, pResourceName, pResourceType );
	if( NULL == hResource) {	//	失敗?
		return FALSE;
	}
	//	リソースのサイズを得る。
	DWORD dwResourceSize = SizeofResource( NULL, hResource );
	if( 0 == dwResourceSize ) {	//	失敗?
		return FALSE;
	}
	//	リソースデータのポインタを得る。
	const void* pResourceData = LockResource( LoadResource( NULL, hResource ) );
	if( NULL == pResourceData) {	//	失敗?
		return FALSE;
	}
	//	リソースのバッファを作成する。
	HGLOBAL hResourceBuffer = GlobalAlloc( GMEM_MOVEABLE, dwResourceSize+1 );
	if( NULL == hResourceBuffer )  {	//	失敗?
		return FALSE;
	}
	//	メモリブロックをロックしてポインタを得る。
	char* pResourceBuffer = (char*)GlobalLock(hResourceBuffer);
	if( NULL == pResourceBuffer ) {	//	失敗?
		GlobalFree(hResourceBuffer);
		return FALSE;
	}
	//	リソースの内容をバッファにコピーする。
	CopyMemory(pResourceBuffer, pResourceData, dwResourceSize);
	pResourceBuffer[dwResourceSize] = '\0';
	
	//	リソースの内容を表示。ただし、このままだと改行コードも表示されるので本当は加工が必要。
    DrawString( 260 , 240 - 12 , pResourceBuffer , GetColor(255,255,255) );
    
	//	リソースを解放する。
	GlobalUnlock(pResourceBuffer);
	GlobalFree(hResourceBuffer);
 
    WaitKey() ;     // キーの入力待ち(『WaitKey』を使用)
 
    DxLib_End() ;       // DXライブラリ使用の終了処理
 
    return 0 ;      // ソフトの終了
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

滝の上のマスカット

Re: FindResourceの使い方について

#14

投稿記事 by 滝の上のマスカット » 13年前

すいません、まだ新しい掲示板の使い方がよくわかっていないので。
コピーさせていただきましたが、IDR_TEXT1は、このままでいいのでしょうか。
まだ、詳しく読んでいないので、自分の確認が足らないのかもしれませんが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: FindResourceの使い方について

#15

投稿記事 by softya(ソフト屋) » 13年前

滝の上のマスカット さんが書きました:すいません、まだ新しい掲示板の使い方がよくわかっていないので。
もうひとつの質問に対する返答ですよね?
滝の上のマスカット さんが書きました:コピーさせていただきましたが、IDR_TEXT1は、このままでいいのでしょうか。
まだ、詳しく読んでいないので、自分の確認が足らないのかもしれませんが。
IDR_TEXT1はリソースIDですので、滝の上のマスカットさんのリソースの作り方次第です。
私のはコメントにも書いてある通り、リソースにテキストファイルをインポートして種別として新しく"text"を追加した場合の方法となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

滝の上のマスカット

Re: FindResourceの使い方について

#16

投稿記事 by 滝の上のマスカット » 13年前

softya(ソフト屋) さんが書きました: IDR_TEXT1はリソースIDですので、滝の上のマスカットさんのリソースの作り方次第です。
私のはコメントにも書いてある通り、リソースにテキストファイルをインポートして種別として新しく"text"を追加した場合の方法となります。
ということは、これは変数として利用する(型を自由に指定する)ということなのですか?

滝の上のマスカット

Re: FindResourceの使い方について

#17

投稿記事 by 滝の上のマスカット » 13年前

すいません、勘違いしていました。

滝の上のマスカット

Re: FindResourceの使い方について

#18

投稿記事 by 滝の上のマスカット » 13年前

コード:

 
#include "DxLib.h"
#include "test.h"    //リソースヘッダの場所は都合に応じて変更を。
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{
    int Cr ;

    ChangeWindowMode(TRUE);
    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1; // エラーが起きたら直ちに終了
    }
    
    //  テキストリソース。
    //  リソースにテキストファイルをインポートしてあります。
    //  リソースの種類はtextです。
	UINT nIDResource = test;
    LPCTSTR pResourceType = "text";
    
    //  リソース名を得る。
    LPCTSTR pResourceName = MAKEINTRESOURCE(nIDResource);
    
    //  リソースハンドルを得る。
    HRSRC hResource = FindResource( NULL, pResourceName, pResourceType );
    if( NULL == hResource) {    //  失敗?
        return FALSE;
    }
    //  リソースのサイズを得る。
    DWORD dwResourceSize = SizeofResource( NULL, hResource );
    if( 0 == dwResourceSize ) { //  失敗?
        return FALSE;
    }
    //  リソースデータのポインタを得る。
    const void* pResourceData = LockResource( LoadResource( NULL, hResource ) );
    if( NULL == pResourceData) {    //  失敗?
        return FALSE;
    }
    //  リソースのバッファを作成する。
    HGLOBAL hResourceBuffer = GlobalAlloc( GMEM_MOVEABLE, dwResourceSize+1 );
    if( NULL == hResourceBuffer )  {    //  失敗?
        return FALSE;
    }
    //  メモリブロックをロックしてポインタを得る。
    char* pResourceBuffer = (char*)GlobalLock(hResourceBuffer);
    if( NULL == pResourceBuffer ) { //  失敗?
        GlobalFree(hResourceBuffer);
        return FALSE;
    }
    //  リソースの内容をバッファにコピーする。
    CopyMemory(pResourceBuffer, pResourceData, dwResourceSize);
    pResourceBuffer[dwResourceSize] = '\0';
    
    //  リソースの内容を表示。ただし、このままだと改行コードも表示されるので本当は加工が必要。
    DrawString( 260 , 240 - 12 , pResourceBuffer , GetColor(255,255,255) );
    
    //  リソースを解放する。
    GlobalUnlock(pResourceBuffer);
    GlobalFree(hResourceBuffer);
 
    DxLib_End() ;       // DXライブラリ使用の終了処理
 
    return 0 ;      // ソフトの終了
} 
[coderc]
#include <windows.h>
#include "test.h"

test MYTEXT DISCARDABLE "test.txt"
[/code]

[codeh]
#define test 10
[/code]

教えていただいたコードを組み込んで、合うように変更してみたのですが(一か所)、プログラムを立ち上げるとWaitKeyを待たず、すぐ終了してしまいます。これは、まだまだ変更が足りていないということなのでしょうか。nIDResourceのところがやはりまずいのでしょうか。
丸投げのようになってしまってすみません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: FindResourceの使い方について

#19

投稿記事 by softya(ソフト屋) » 13年前

私のリソースファイル(xxxx.rc)は下記のように定義されてます。

コード:

IDR_TEXT1               text                    "source\\test.txt"
なので合わせるとしたら

コード:

test               text                    "test.txt"
で大丈夫だと思うのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: FindResourceの使い方について

#20

投稿記事 by softya(ソフト屋) » 13年前

それとコードの部分が自分の手持ちコードをいじっただけの物だったので、もう少し一般的なコードに変えておきました。
使うなら、こちらをベースにしてください。

コード:

#include "DxLib.h"
#include "../resource.h"	//リソースヘッダの場所は都合に応じて変更を。

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{
    ChangeWindowMode(TRUE);
    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1; // エラーが起きたら直ちに終了
    }
    
    //	テキストリソース。
    //	リソースにテキストファイルをインポートしてあります。
    //	リソースの種類はtextです。
	UINT nIDResource = IDR_TEXT1;
	LPCTSTR pResourceType = "text";
	
	//	リソース名を得る。
	LPCTSTR pResourceName = MAKEINTRESOURCE(nIDResource);
	
	//	リソースハンドルを得る。
	HRSRC hResource = FindResource( NULL, pResourceName, pResourceType );
	if( NULL == hResource) {	//	失敗?
		return FALSE;
	}
	//	リソースのサイズを得る。
	DWORD dwResourceSize = SizeofResource( NULL, hResource );
	if( 0 == dwResourceSize ) {	//	失敗?
		return FALSE;
	}
	//	リソースデータのポインタを得る。
	const void* pResourceData = LockResource( LoadResource( NULL, hResource ) );
	if( NULL == pResourceData) {	//	失敗?
		return FALSE;
	}
	
	//	リソースを確保したバッファにコピーする。
	char* pResourceBuffer = (char*)malloc( dwResourceSize+1 );
	memcpy( pResourceBuffer, pResourceData, dwResourceSize );
	pResourceBuffer[dwResourceSize] = '\0';

	//	リソースの内容を表示。ただし、このままだと改行コードも表示されるので本当は加工が必要。
    DrawString( 260 , 240 - 12 , pResourceBuffer , GetColor(255,255,255) );
    
	//	リソースを解放する。
	GlobalUnlock(pResourceBuffer);
 
    WaitKey() ;    // キーの入力待ち(『WaitKey』を使用)

	//	バッファを解放する。
	free( pResourceBuffer );
 
    DxLib_End() ;       // DXライブラリ使用の終了処理
 
    return 0 ;      // ソフトの終了
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

滝の上のマスカット

Re: FindResourceの使い方について

#21

投稿記事 by 滝の上のマスカット » 13年前

ありがとうございます。実行されました。
では、これを参考にさせていただきながら、開発をしていきたいと思います。
本当にありがとうございました。
また、質問するかもしれませんが、お願いします。

滝の上のマスカット

Re: FindResourceの使い方について

#22

投稿記事 by 滝の上のマスカット » 13年前

解決入力ミスです。

閉鎖

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