FindResourceの使い方について
FindResourceの使い方について
こんにちは、滝の上のマスカットです。
早速ですが、
FindResource(hmodule, MAKEINTRESOURCE(test), RT_STRING);
のhmoduleのところには、どんな型の変数を指定すればいいのでしょうか。
早速ですが、
FindResource(hmodule, MAKEINTRESOURCE(test), RT_STRING);
のhmoduleのところには、どんな型の変数を指定すればいいのでしょうか。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: FindResourceの使い方について
HMODULE型のようです。
以下、 http://msdn.microsoft.com/ja-jp/library/cc410845.aspx より
>>hModule
>>[入力]リソースが入った実行可能ファイルを持つモジュールのハンドルを指定します。
>>NULL を指定すると、現在のプロセスを作成するときに使われたイメージファイルに関連付けられたモジュールが使われます
以下、 http://msdn.microsoft.com/ja-jp/library/cc410845.aspx より
>>hModule
>>[入力]リソースが入った実行可能ファイルを持つモジュールのハンドルを指定します。
>>NULL を指定すると、現在のプロセスを作成するときに使われたイメージファイルに関連付けられたモジュールが使われます
Re: FindResourceの使い方について
とのことなのでNULLでもいいと思われますパラメータ
hModule
[入力]リソースが入った実行可能ファイルを持つモジュールのハンドルを指定します。
NULL を指定すると、現在のプロセスを作成するときに使われたイメージファイルに関連付けられたモジュールが使われます
Re: FindResourceの使い方について
教えていただいたことと、それをもとに自分で調べたことを使って、コードを組んでみたんですが、エラーが発生しました。
#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の使い方について
まず、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の使い方について
#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の使い方について
前回も書きましたが、LPBITMAPINFOはBITMAPINFO構造体のポインタ版で、滝の上のマスカット さんが書きました:
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)
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の使い方について
ビットマップのほうでしたか・・・・きずきませんでした。
文字列を読むというよりも、
リソースから、テキストファイルを読み込んでそれを、本当なら配列に読み込みたいんです。
ですが、まだそこまで追いつかないので、とりあえず、リソースを選択し、読み込み、それを、
変数に書き出して、それを表示するという感じにしたいのです。
それで、以前関数を教えていた出したので、それを使ってみようかなと思ったのです。
文字列を読むというよりも、
リソースから、テキストファイルを読み込んでそれを、本当なら配列に読み込みたいんです。
ですが、まだそこまで追いつかないので、とりあえず、リソースを選択し、読み込み、それを、
変数に書き出して、それを表示するという感じにしたいのです。
それで、以前関数を教えていた出したので、それを使ってみようかなと思ったのです。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: FindResourceの使い方について
そうでしたか。RT_STRINGとしていたので変だと思ったのですが(笑)滝の上のマスカット さんが書きました:ビットマップのほうでしたか・・・・きずきませんでした。
文字列を読むというよりも、
リソースから、テキストファイルを読み込んでそれを、本当なら配列に読み込みたいんです。
ですが、まだそこまで追いつかないので、とりあえず、リソースを選択し、読み込み、それを、
変数に書き出して、それを表示するという感じにしたいのです。
それで、以前関数を教えていた出したので、それを使ってみようかなと思ったのです。
LPSTR c;
としてみてください。
[hr]
[編集]
ストゥリングテーブルから文字列を読み込むのであれば、LoadResourceではなくLoadStringを使ったほうが早いようです。 これだと、FindResourceもLockResourceも必要ありませんが、FindResourceを使って書かなければならないのであれば本末転倒ですね。。。
Re: FindResourceの使い方について
それでもいいのですが、自分的には将来VC++を利用してラノベゲームを作りたいなー。
と思っているのです、なので、ファイルから読みだして配列に保存するというのを、知っておきたいな程度のことなのです。
確かに専用の開発ソフトを使ってもいいのですが・・・・。
と思っているのです、なので、ファイルから読みだして配列に保存するというのを、知っておきたいな程度のことなのです。
確かに専用の開発ソフトを使ってもいいのですが・・・・。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: FindResourceの使い方について
返信先が間違ってませんか?滝の上のマスカット さんが書きました:それでもいいのですが、自分的には将来VC++を利用してラノベゲームを作りたいなー。
と思っているのです、なので、ファイルから読みだして配列に保存するというのを、知っておきたいな程度のことなのです。
確かに専用の開発ソフトを使ってもいいのですが・・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: FindResourceの使い方について
本当にやりたい事は、こう言う事では?
#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の使い方について
すいません、まだ新しい掲示板の使い方がよくわかっていないので。
コピーさせていただきましたが、IDR_TEXT1は、このままでいいのでしょうか。
まだ、詳しく読んでいないので、自分の確認が足らないのかもしれませんが。
コピーさせていただきましたが、IDR_TEXT1は、このままでいいのでしょうか。
まだ、詳しく読んでいないので、自分の確認が足らないのかもしれませんが。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: FindResourceの使い方について
もうひとつの質問に対する返答ですよね?滝の上のマスカット さんが書きました:すいません、まだ新しい掲示板の使い方がよくわかっていないので。
IDR_TEXT1はリソースIDですので、滝の上のマスカットさんのリソースの作り方次第です。滝の上のマスカット さんが書きました:コピーさせていただきましたが、IDR_TEXT1は、このままでいいのでしょうか。
まだ、詳しく読んでいないので、自分の確認が足らないのかもしれませんが。
私のはコメントにも書いてある通り、リソースにテキストファイルをインポートして種別として新しく"text"を追加した場合の方法となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: FindResourceの使い方について
ということは、これは変数として利用する(型を自由に指定する)ということなのですか?softya(ソフト屋) さんが書きました: IDR_TEXT1はリソースIDですので、滝の上のマスカットさんのリソースの作り方次第です。
私のはコメントにも書いてある通り、リソースにテキストファイルをインポートして種別として新しく"text"を追加した場合の方法となります。
Re: FindResourceの使い方について
#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 ; // ソフトの終了
}
#include <windows.h>
#include "test.h"
test MYTEXT DISCARDABLE "test.txt"
[/code]
[codeh]
#define test 10
[/code]
教えていただいたコードを組み込んで、合うように変更してみたのですが(一か所)、プログラムを立ち上げるとWaitKeyを待たず、すぐ終了してしまいます。これは、まだまだ変更が足りていないということなのでしょうか。nIDResourceのところがやはりまずいのでしょうか。
丸投げのようになってしまってすみません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: FindResourceの使い方について
私のリソースファイル(xxxx.rc)は下記のように定義されてます。
なので合わせるとしたら
で大丈夫だと思うのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: FindResourceの使い方について
それとコードの部分が自分の手持ちコードをいじっただけの物だったので、もう少し一般的なコードに変えておきました。
使うなら、こちらをベースにしてください。
使うなら、こちらをベースにしてください。
#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の使い方について
ありがとうございます。実行されました。
では、これを参考にさせていただきながら、開発をしていきたいと思います。
本当にありがとうございました。
また、質問するかもしれませんが、お願いします。
では、これを参考にさせていただきながら、開発をしていきたいと思います。
本当にありがとうございました。
また、質問するかもしれませんが、お願いします。