0

ポインターを long (SendMessage()) に変換する必要があり、反対側で変数が正しいかどうかを安全に確認したい。だから私はdynamic_castをやろうと思っていましたが、仮想ではないクラスではうまくいきません。次に、typeidを実行することを考えましたが、派生varをベースとして渡すまでは機能します。

ポインタが実行時に期待しているものであるかどうかを確認する方法はありますか? typeid を使用して、ポインターが特定のベースから派生した型であるかどうかを確認する方法はありますか?

4

7 に答える 7

3

への参照SendMessage()は、MS Windows がプラットフォームであるように聞こえます。次に、ポインターの使用に関する規則 (Windows)を読むことをお勧めします。このような状況で Microsoft が提供する機能やその他の機能PtrToLongについて詳しく説明します。PtrToUlong

于 2008-11-22T22:17:29.760 に答える
1

しか持っていlongない場合、できることはあまりありません。任意の数値が有効なメモリ アドレスを表しているかどうかを判断する一般的な方法はありません。また、有効なメモリ アドレスであることがわかっていても、ポインターが指すものの型を特定する方法はありません。アドレスが にキャストされる前に、モノの実際の型がわからない場合は、キャストlongしようとしている型に を安全にキャストできるかどうか確信が持てませんlong

メッセージの送信者が有効な値を送信したことを信頼する必要があります。できる最善のことは、プログラムが偽の値を受け取った場合に、プログラムへの影響を軽減するための予防策を講じることです。

于 2008-11-22T20:51:16.333 に答える
1

typeid は使用できません。有効なポインターの代わりにガベージを取得すると、アクセス違反が発生するため、チェックは無意味です。

あなたがすべきことは、SendMessage と、メッセージを処理するコードを単一の型安全なインターフェイスにラップすることです。これにより、予期しないものを SendMessage に渡すことができなくなり、受信側でチェックする必要がなくなります。

C++ 型システムはコンパイル時に機能します。ポインターを long にキャストすると、すべての型情報が失われます。long は、メモリ内の非常に多くのビットです。それがオブジェクトを指していたことを識別する方法はありません。

于 2008-11-22T22:00:57.690 に答える
0

Windowsでは、MFCは、指定されたポインタが有効なメモリ位置を指しているかどうかを確認する方法を提供します(これはsegfaultをトラップすることによって行われます)。関数名は覚えていませんが、あります。それでも、ポイントされたメモリの内容が有効であることを保証するものではありません。それでも無効なVMTがあり、コードがクラッシュする可能性があります。もちろん、セグメンテーションフォールトを自分でトラップすることもできます(MSナレッジベースを参照) 。

何かが型に属しているかどうかを確認することに関しては、最初に基本クラスが必要です。基本クラスのデストラクタを「仮想」にすると、すべての派生クラスにVMTが含まれます。

どうしてもVMTを回避する必要がある場合は、MS Windowsイベントのイベントタイプなど、処理している内容を示す何らかの判別子が必要です。

于 2008-11-24T18:53:33.510 に答える
0

PTLib ( http://sourceforge.net/projects/opalvoip/ ) は、PCLASSINFO マクロを使用してクラス間の関係を定義します。これにより、IsDescendant や GetClass などの関数が提供されます。

おそらく似たようなものを実装できます。

于 2008-11-22T20:37:03.117 に答える
0

dynamic_cast は、仮想メソッド テーブルの署名をチェックすることによって機能します。仮想メソッドがない場合、VMT がないため、dynamic_cast は機能しません。ただし、VMT がない場合は、指しているオブジェクトについてまったく知識がありません。

あなたの最善の策は、たとえそれがダミーであっても、少なくとも 1 つの仮想メソッドを持つクラスへのポインターであることを要求することです。その場合、動的キャストが機能します。

于 2008-11-22T20:37:33.350 に答える
0

あなたの質問が何についてなのか、私はまだ理解していません。

  • long と back へのキャストで同じ値が得られると確信できるかどうかについては、変数の型を安全にチェックする
    を参照してください。キャストする型はUINT_PTR. したがってUINT_PTR v = reinterpret_cast<UINT_PTR>(ptr);、整数型にキャストし、逆の操作を行って再度ポインターにキャストします。C++ 標準は、元の値が復元されることを保証します。(その説明については、上記のリンクを参照してください)。ところで、そのマイクロソフトのサイトには、WPARAM と LPARAM はプラットフォームによってサイズが変わるとも書かれています。vしたがって、その変数とそれを使用できますSendMessage
  • ポインター (ポインター型に変換されたもの) がオブジェクトを指しているかどうかを反対側で確認する方法である場合、答えはyou can'tです。送信に使用されたポインターの型が明らかにわからないため、ポインターが指す動的な型が何であるかを受信側で確認することはできません。送信者側でポインターの型がわかっている場合は、そもそもチェックは必要ありません。
于 2008-11-22T20:46:09.243 に答える