ページ 11

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

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

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

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

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

Posted: 2013年5月10日(金) 11:34
by softya(ソフト屋)
やった事ないですが、そういう機能が必要な理由が分かりません。
わざわざリソースIDに抽象化しているのが無意味に成るような?

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

【補足】リソースコンパイルした時に、元のファイル名の情報はロストしている気もします。

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

Posted: 2013年5月10日(金) 12:41
by YuO
リソースのキー自体を,IDではなく"test.png"にしてしまえばよいのでは?
リソースのキーは,65535以下の正整数か文字列,どちらも使えます。

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

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

Posted: 2013年5月10日(金) 17:59
by bonbo
>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"
とする、ということでしょうか。
一応やってみましたがだめでした…どこがおかしいのでしょうか

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

Posted: 2013年5月10日(金) 18:09
by YuO
リソースはファイルではありません。
ファイルを対象とするAPIにリソースの名前を渡しても,扱うことはできません。

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

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

Posted: 2013年5月10日(金) 18:14
by softya(ソフト屋)
>とする、ということでしょうか。
>一応やってみましたがだめでした…どこがおかしいのでしょうか

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

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

【補足】それと簡単に取り出せるのでファイルを隠している事には、これっポチもならない。って事も書いておきます。
便利なのはexeだけで動くという点だけです。

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

Posted: 2013年5月10日(金) 18:31
by YuO
勘違い。
D3DXCreateTextureFromResourceExがありますね。
戻り値のHRESULTは調べていますか。

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

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

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

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

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

Posted: 2013年5月10日(金) 21:03
by softya(ソフト屋)
DirectX Error Lookupと言うツールがSDKに入っていますね。

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

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

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

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