2011-01-27 32 views
1

クラスに投げ込む前にうまくいきました。この型キャストエラーを解決するための助け?構造体からLPVOIDへの型キャスト

エラー

error C2440: 'type cast' : cannot convert from 'IAT CInjector::* ' to 'LPVOID' 

コード参照さ

WriteProcessMemory(CInjector::_hProc, 
    CInjector::_iatBaseAddress, 
    (LPVOID) & CInjector::_iat, // typecasting error? 
    sizeof (IAT), 
    NULL); 

クラス

class CInjector 
{ 
private: 
    ... 
    IAT _iat; 
    ... 
} 

typedefの

typedef struct _IAT { 
    PLOADLIBRARYA pLoadLibraryA; 
    PGETPROCADDRESS pGetProcAddress; 
    FNMESSAGEBOX fnMessageBox; 
} IAT; 

答えて

3

問題は&CInjector::_iatポインタ・ツー・クラスメンバではなく、実際のポインタであることです。 _iatは静的ではないので、各クラスはそれ自身のコピーを持ちます。したがって、&CInjector::_iatはアドレスではなく、通常はクラスへのオフセットです。多くの場合、彼らはメモリに異なって見えるため、C++標準はポインタとクラスのメンバーと生のポインタとの間の変換を禁止

CInjector myCInjector; 
IAT CInjector::* ptr = &CInjector::_iat; 
myCInjector.*ptr = /* ... */ 

- ポインタを:あなたは「へのポインタメンバー選択」演算子.*でそれを使用することができますクラスメンバにはオフセット値が格納されることが多いため、複数の継承や仮想関数が存在する場合に正しく動作します。

これを修正するには、おそらく2つのうちのいずれかを実行することが必要です。まず、CInjector::_iatstaticというマークを付けることができます。つまり、そのコピーは1つのみです。その結果、&CInjector::_iatは実際には具体的なオブジェクトを参照します。これは実際には通常のポインタであり、上記のコードは機能します。次に、CInjectorの具体的なインスタンスを取得し、_iatフィールドのアドレスを取得します。これは特定のオブジェクトのフィールドを参照するため、未処理のポインタが返されます。

希望すると便利です。

+0

/facepalm;とにかくシングルトンだから、そこに静的なキーワードを投げるだけだ。しかし、 "ポインタへのメンバー選択"についての情報をありがとう。 –

+0

@Gio Borje-シングルトンの場合、シングルトンの '_iat'フィールドのアドレスを取ることができます。それは常に有効なオプションです。 – templatetypedef

0

メンバーへのポインタをオブジェクトへのポインタに変換することはできません。 Read more here

関連する問題