[英]Dereferencing pointer C++
我只是設法用c ++編寫了一個可用於c#的全局CBT鈎子。 聽起來可能很愚蠢,但是由於我使用c#的工作,所以我對指針的了解和對它們的取消引用非常糟糕。
我無法在lParam指向的結構內取消引用指針。
看起來像這樣:lParam是CBT_CREATEWND結構的長指針,該結構又持有成員“ lpcs”和CREATESTRUCT的指針。 該結構包含一個成員“ x”,我想閱讀該成員。 我嘗試了以下操作,但是x的值無效:
CREATESTRUCT str = *(LPCREATESTRUCT)(((LPCBT_CREATEWND)lParam)->lpcs);
int normal = str.x;
PostMessage(FindWindow(NULL, L"Process Watcher Window"), RegisterWindowMessage(L"ALEXX_SEINE_WNDMESSAGE_C"), wParam, normal);
有人可以幫我嗎?
好吧,我真的不能說出為什么您會得到無效的x值的細節,但是我可能會以不同的方式編寫這段代碼:
// the way you had it, it was making a copy of the CREATESTRUCT and storing it in str
// this just uses a pointer
LPCREATESTRUCT str = ((LPCBT_CREATEWND)lParam)->lpcs;
// when you have a pointer, use -> to use a member
int normal = str->x;
因為您說過您是指針的新手,所以我會解釋->
一點。 當您編寫x->y
,它實際上與(*x).y
相同,但是語法更好。
還要注意一些建議,而這段代碼中的強制轉換似乎很合理。 通常,如果您發現自己投放過多,則可能是困難的方法還是錯誤的方法。 因此,請確保您花時間了解您執行的所有強制轉換。
您的語法似乎已簽出,盡管可能有點LPCREATESTRUCT
,並且LPCREATESTRUCT
顯然是不必要的。
您提到x
值無效,也許lParam
實際上不是指向CBT_CREATEWND
結構的指針? 您是否在強制轉換lParam
之前檢查了回調函數的nCode
是否等於HCBT_CREATEWND
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.