1

皆さん、こんにちは。私たちが使用している Win32 API のデータ型とマクロについて、いくつか混乱があります。

まず-: WM_NOTIFYメッセージ について。lparamには、 NMHDR構造体へのポインターが含まれています。したがって、ポインターの場合、次のように NMHDR 構造にアクセスするのはなぜ違法なのですか?

(*lparam)->idFrom

つまり、ポインターの場合は、間接演算子を使用して構造体にアクセスできます。LPARAM 自体は、LONG_PTR から型定義されています。なぜ私はこのようなコードを書かなければならないのですか?

((LPNMHDR)lparam)->idFrom

LPNMHDRとは何ですか? LPNMHDR は、次の方法で型定義されます。

typedef NMHDR FAR * LPNMHDR;

FAR*は、次のように定義されます。

#define FAR _far

_far とは何ですか? LPNMHDR キャストを使用して LPARAM から NMHDR 構造体にアクセスする必要があるのはなぜですか?

次に-: MAKEINTRESOURCEマクロは 何をしますか? 関数にリソースを指定するときに、多くの作成者がプレーンな文字列を使用しているのを見てきました。例えば-:

CreateDialog(hInst,"Dialog Box",
                hwnd,(DLGPROC)DialogFunc);

しかし、最新のコンパイラでは次のように使用します。

CreateDialog(hInst,MAKEINTRESOURCE(DIALOG_BOX),
                hwnd,(DLGPROC)DialogFunc);

リソース ファイルで数値の代わりに文字列識別子を使用する場合、このマクロを省略できるので、このマクロは数値を文字列に変換します。たとえば、23 を "23" に変換しますか?? もしそうなら、私は使用できるからです -:

CreateDialog(hInst,"23",
                hwnd,(DLGPROC)DialogFunc);

私のダイアログ ボックス リソースが 23 で定義されている場合。しかし、これは機能しません。

このマクロが識別子を処理した後の結果を知りたいですか? それはどのように機能しますか?sprintf 関数を使用して値を文字列にコピーするときに問題に直面しているため、MAKEINTRESOURCE の値をメッセージ ボックスに出力するにはどうすればよいでしょうか。しかし、次のように定義されているため、MAKEINTRESOURCE が LPSTR を出力することはわかっています。

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))

このマクロがどのように機能するかについてのドキュメントはまだ見つかりません。msdn は、MAKEINTRESOURCE は '整数値をリソース管理関数と互換性のあるリソース タイプに変換するマクロである ' と述べています。ありがとうございました。

4

1 に答える 1

4

lParamはポインターではなく、整数型パラメーターであるため、使用する前に適切なポインター型にキャストする必要があります。

LPNMHDR歴史的な理由から使用される単なる typedef です。も同様に使用できますNMHDR*。FAR および _far 修飾子は 16 ビット Windows で使用されていたもので、当時のノイズに過ぎません。

これMAKEINTRESOURCEは、オーバーロードされた関数が C++ で何をするかをシミュレートするために、Windows C 言語インターフェイスで使用されるトリックです。このようにCreateDialogして、ポインター (文字列への) パラメーターまたは整数パラメーターのいずれかを使用して を呼び出すことができます。これは、文字列が非常に低いアドレスに割り当てられることは決してないという知識を使用するため、これらはリソース ID のエイリアスとして予約できます。かなり醜いハック!

于 2012-06-25T08:34:34.540 に答える