2010-03-06 142 views
3

這是C4055警告消息。我們如何解決C4055警告?

「轉化」:從數據指針「類型1」爲一個函數指針「2型」
數據指針轉換(可能不正確地)到一個函數指針。
這是/ Za下的1級警告和/ Ze下的4級警告。

我們如何解決此警告(通過正確的方式,而不是一招)

編輯:

這是一個代碼段已警告。

typedef NTSTATUS (*t_ObRegisterCallbacks) 
(
    IN POB_CALLBACK_REGISTRATION CallBackRegistration, 
    OUT PVOID *RegistrationHandle 
); 

t_ObRegisterCallbacks g_ObRegisterCallbacks = NULL; 

void foo() 
{ 
    g_ObRegisterCallbacks = (t_ObRegisterCallbacks)MmGetSystemRoutineAddress(&regName); //C4055 
} 
//warning C4055: 'type cast' : from data pointer 'PVOID' to function pointer 't_ObRegisterCallbacks' 
+1

僅供參考,'MmGetSystemRoutineAddress()'對X​​P SP2的問題:http://www.osronline.com/article.cfm ?article = 494 – bk1e 2010-03-06 16:17:12

回答

10

WDK頭文件不是那麼幹淨。 MmGetSystemRoutineAddress()的返回類型應該聲明爲FARPROC而不是PVOID。儘管如此,在任何使用WDK編寫設備驅動程序的機器上,這並不重要,void *可以毫無問題地轉換爲函數地址,數據和代碼指針在32位和64位平臺上具有相同的大小。當我們得到分段存儲器模型的苦難時,它將在地獄中變得寒冷的一天。

我建議你乾脆關掉使用#pragma警告警告(禁用:4055)

+0

感謝您的明確答覆。 – Benjamin 2010-03-06 15:18:32

7

不允許在數據和函數指針之間進行轉換。您可以使用union hack進行類型轉換:包含兩個指針的union類型,然後寫入一個類型並讀取爲另一個類型。不用說,就標準而言,這是不可移植的,但它使編譯器感到高興,並且經常在實踐中工作。

將函數指針作爲數據指針返回的函數(dlsym是一種流行的函數)被設計破壞,你只能通過諸如union hack等技巧來解決這個問題。