2012-03-21 7 views
1

MFCリソースIDを渡すたびにMAKEINTRESOURCEマクロが常に不良ポインタを返すような問題があります。リソースIDはすべてResource.hにリストされ、リソースプロパティでIDの設定と一致します。MAKEINTRESOURCEがリソースIDの不正ポインタを返す

私はリソースが&のIDの仕事の仕組みを完全に理解していないので、私は完全にわかりませんが、悪いポインタが私のリソースが正しい場所に保存されていないことを示しているようですメモリに?これは私が何か新しいものを追加しようとしている古いプロジェクトです。古いリソースでMAKEINTRESOURCEを実行しようとするとanfをチェックしました(これは間違いなく動作しています。ポインタ。

この原因は何ですか?

編集:「悪いポインタ」によって、あなたは、「メモリー内のオブジェクトを資源に指していないポインタ」を意味する場合それはどんな違い

+1

「悪いポインタ」の意味を具体的に説明してください。 'MAKEINTRESOURCE'はポインタ内の整数をエンコードします。あなたが逆参照できるポインタではありません。あなたがそれを使って行うことができる唯一のことは、それをリソース関数に渡すことです。 –

+0

戻り値の上でデバッグとマウスでプログラムを実行すると、「 CXX0030Error:式が評価されません」と表示されます。 これは予期されていますか? MAKEINTRESOURCEから返された値を使用してリソースをロードしようとすると、リソースを見つけることができず、おそらくが原因だと考えました。 – Marzipan

+3

はい、それは何かへのポインタではなく、逆参照できないため、期待されています。 –

答えて

2

を行う場合、プロジェクトが、同様にUnicode文字セットを使用している、そしてMAKEINTRESOURCE()正しく動作しています。問題は、同じ関数パラメータを使用して文字列または整数IDを渡すために、Windows API関数は関数によって「ああ待って、これはポインタではなく、リソースIDです"

これは文書化された動作です。例えば、LoadBitmap()のドキュメントでは、それは言う:

lpBitmapName [in]:

A pointer to a null-terminated string that contains the name of the bitmap resource to be loaded. Alternatively, this parameter can consist of the resource identifier in the low-order word and zero in the high-order word. The MAKEINTRESOURCE macro can be used to create this value.

が再解釈任意の整数値で無効なポインタを作成することは法律上のC++構築ですが、無効なポインタを逆参照すると、未定義の動作です。

この場合、引数を受け取った関数は上位ワードが0かどうかをチェックし、そうであれば下位ワードを整数として使用し、ポインタを逆参照しません。

注:これは厄介なハックのように感じているならば、それは厄介なハックですので、それはです。

+0

したがって、MAKEINTRESOURCEの戻り値はになると予想されますか? リソース(つまりm_ToolBar.LoadToolBar)をロードしようとすると、失敗していると考えられ、が原因である可能性があります。私はコードにステップインし、MAKEINTRESOURCE変換されたリソースIDを使用してリソースを検索すると、それを見つけることができず、ロードが失敗します。 – Marzipan

+3

はい、 'MAKEINTRESOURCE'によって作成された値は、デバッガに「不良ポインタ」として表示されます。リソースの読み込みに失敗した場合は、ドキュメントに記載されているようにして、['GetLastError()'](http://msdn.microsoft.com/ja-jp/default.htm)を呼び出します。com/ja-jp/library/windows/desktop/ms679360(v = vs.85).aspx)関数を使用してエラーコードを取得し、このエラーコードを[システムエラーコード](http://msdn.microsoft .com/en-us/library/windows/desktop/ms681381(v = vs.85).aspx)ページで、その意味を知ることができます。 –

+0

さて、ありがとう – Marzipan

関連する問題