C++ ファイル名からリソースのIDを取得したい

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

C++ ファイル名からリソースのIDを取得したい

#1

投稿記事 by bonbo » 7年前

早速ですが質問させていただきます。
タイトルの通りなのですが、ファイル名たとえば"test0.png"をリソースとして読み込んで、
その後、文字列"test0.png"から、割り当てられたIDを取得する方法はないでしょうか。

調べてみたところ、C#&javaに関しては割と関数が備わっているのですが、C++に関しては
出てきませんでした。

コードなしの質問で申し訳ありませんが、よろしくお願いします。
環境は
VS2010
windows7(64bit)
です。
よろしくお願いします。

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

Re: C++ ファイル名からリソースのIDを取得したい

#2

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

やった事ないですが、そういう機能が必要な理由が分かりません。
わざわざリソースIDに抽象化しているのが無意味に成るような?

bonboさんは、リソースを何のために使われているんでしょうか?

【補足】リソースコンパイルした時に、元のファイル名の情報はロストしている気もします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: C++ ファイル名からリソースのIDを取得したい

#3

投稿記事 by YuO » 7年前

リソースのキー自体を,IDではなく"test.png"にしてしまえばよいのでは?
リソースのキーは,65535以下の正整数か文字列,どちらも使えます。

リソースのキーを文字列にするには,
.rcファイル上ではIDのかわりに"test.png"と書けばよいです。
IDE上でプロパティからIDを同様に二重引用符つきで記述すれば,文字列キーになります。

bonbo

Re: C++ ファイル名からリソースのIDを取得したい

#4

投稿記事 by bonbo » 7年前

>soft屋さん
ありがとうございます。
>やった事ないですが、そういう機能が必要な理由が分かりません。
わざわざリソースIDに抽象化しているのが無意味に成るような?
目的は、関数の書き換えです。
今テクスチャを作る関数として、引数にファイル名が必要な関数を使っているのですが(D3DXCreateTextureFromFileExです)
それを引数にIDが必要な関数に書き換えようと思っているのです。

コード:

#if 0
D3DXCreateTextureFromFileEx(,
#else
D3DXCreateTextureFrom(,
#endif
そして、今のコードのファイル名が入っているところをすべてIDに書き換えるというのは
あまりやりたくないので、ファイル名→リソースのIDと書き換えたいと思ったのです。
そうですね…もっといい方法があるかもしれません…
>YuOさん
ありがとうございます。
>リソースのキー自体を,IDではなく"test.png"にしてしまえばよいのでは?
つまり、

コード:

IDB_PNG1                PNG                     "test0.png"
IDB_PNG1 RCDATA DISCARDABLE "test0.png"

コード:

"test0.png"                PNG                     "test0.png"
"test0.png" RCDATA DISCARDABLE "test0.png"
とする、ということでしょうか。
一応やってみましたがだめでした…どこがおかしいのでしょうか

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

Re: C++ ファイル名からリソースのIDを取得したい

#5

投稿記事 by YuO » 7年前

リソースはファイルではありません。
ファイルを対象とするAPIにリソースの名前を渡しても,扱うことはできません。

素直にLoadResourceしてD3DXCreateTextureFromFileInMemoryExを使う,というのではだめなのですか。

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

Re: C++ ファイル名からリソースのIDを取得したい

#6

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

>とする、ということでしょうか。
>一応やってみましたがだめでした…どこがおかしいのでしょうか

肝心の情報がないですが、どうダメだったのでしょうか?

あとリソースはexeファイルに埋め込まれるのでファイル名が無くなる & exeと実行時メモリが肥大する って事自体を理解されているか心配になりました。

【補足】それと簡単に取り出せるのでファイルを隠している事には、これっポチもならない。って事も書いておきます。
便利なのはexeだけで動くという点だけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: C++ ファイル名からリソースのIDを取得したい

#7

投稿記事 by YuO » 7年前

勘違い。
D3DXCreateTextureFromResourceExがありますね。
戻り値のHRESULTは調べていますか。

bonbo

Re: C++ ファイル名からリソースのIDを取得したい

#8

投稿記事 by bonbo » 7年前

返信が遅れてしまい申し訳ありません。
>YuOさん、soft屋さん
ありがとうございます。
>肝心の情報がないですが、どうダメだったのでしょうか?
>戻り値のHRESULTは調べていますか。
すみませんでした。
戻り値は-2005529767
で失敗です。
>【補足】それと簡単に取り出せるのでファイルを隠している事には、これっポチもならない。って事も書いておきます。
便利なのはexeだけで動くという点だけです。
そうなんですか…ちょっと残念です…
でも、とりあえずできるまではやってみたいと思います。

bonbo

Re: C++ ファイル名からリソースのIDを取得したい

#9

投稿記事 by bonbo » 7年前

返却値-2005529767が
D3DERR_NOTAVAILABLE このデバイスは、照会されたテクニックをサポートしていない。
D3DERR_OUTOFVIDEOMEMORY Microsoft® Direct3D® が処理を行うのに十分なディスプレイ メモリがない。
D3DERR_INVALIDCALL メソッドの呼び出しが無効である。たとえば、メソッドのパラメータに無効な値が設定されている場合などである。
D3DXERR_INVALIDDATA データが無効である。
E_OUTOFMEMORY Direct3D が呼び出しを完了するための十分なメモリを割り当てることができなかった。
のどれにあたるかの調べ方ってどうやるのでしょうか…

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

Re: C++ ファイル名からリソースのIDを取得したい

#10

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

DirectX Error Lookupと言うツールがSDKに入っていますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: C++ ファイル名からリソースのIDを取得したい

#11

投稿記事 by bonbo » 7年前

結局ファイル名からIDを取得する関数はなかったので
新たにリソースID用の読み込み関数とリソースID用の描画関数を作ることにしました。
(あとはプリプロセッサで場合分け)

ソフト設計の時点で気づけなかったのが問題なのだとおもいます。
これを教訓に以降失敗しないように心がけていこうと思います。

無理な質問をしてしまい申し訳ありませんでした。

閉鎖

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