2011-01-27 37 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不是地址,而是通常是類中的偏移量。你可以用「指針到成員選擇」運營商.*使用它:

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

的C++標準禁止指針到類的成員和原始指針之間的轉換,因爲他們經常在內存中看起來不同 - 指針例如,對於類成員通常存儲一些偏移值,以便它們在多重繼承或存在虛函數時正常工作。

要解決這個問題,你可能想做兩件事之一。首先,您可以標記CInjector::_iatstatic,這意味着它只有一個副本。因此,&CInjector::_iat現在引用了一個具體對象,它確實是一個常規指針,上面的代碼將起作用。其次,您可以獲得CInjector的具體實例,然後獲取其_iat字段的地址。由於這涉及特定對象的字段,因此您將返回一個原始指針。

希望這會有所幫助!

+0

/facepalm;好吧,無論如何,這是一個單身人士,所以我只會在那裏拋出靜態關鍵字。感謝有關「指向成員選擇」的信息。 – 2011-01-27 04:14:53

0

您不能將指針轉換爲指向對象的指針。 Read more here

相關問題