[英]How do I convert a Win32 lParam to a C struct?
說我有一些Windows方法和一個結構:
struct SomeStruct{
int foo;
int bar;
int baz;
int bat;
}
SomeMethod(int a,int wParam, int lParam)
{
SomeStruct s;
// get lParam into SomeStruct
}
如何將lParam轉換為SomeStruct變量? 我以為我需要這樣的東西(但可以指出我的無知):
SomeMethod(int a, int wParam, int lParam)
{
SomeStruct *s; //declare struct variable
s = lParam; //assign integer value as pointer to struct
printf("the value of s.foo is %d", s.foo); //print result
}
是的,假設lParam“確實”包含指向該結構的指針,那么您可以通過“ casting”獲得它:
SomeStruct* s; //declare pointer-to-struct variable
s = (SomeStruct*) lParam; //assign integer value as pointer to struct
printf("the value of s->foo is %d", s->foo); //print result
通常,lParam和wParam分別是WPARAM和LPARAM類型的變量的名稱。 WPARAM和LPARAM類型的變量用於在SendMessage,PostMessage,WindowProc,DefWindowProc-MS Windows API以及消息處理程序(經常但不恰當地稱為事件處理程序)中聲明參數。 歷史上,在16位版本的Windows中,WPARAM被定義為WORD(16位)值,而LPARAM被定義為LONG。 解釋名字。 這兩個參數都用作未類型的cookie,它們在消息中攜帶一些信息,該值可以是包含消息處理程序處理的更多信息的實體的值或地址。 在16位環境中,WPARAM用於承載近地址,而LPARAM用於承載遠地址。 WPARAM和LPARAM是現在定義為32位值的類型。 在WinDef.h的SDK(軟件開發工具包)中。 WPARAM在早期版本的SDK中定義為UINT,現在定義為UINT_PTR。 LPARAM在早期版本的SDK中仍然定義為LONG,現在定義為LONG_PTR
將整數強制轉換為指針時要小心。 在x64體系結構上, int
仍然是32位整數,但指針是64位。
請使用正確的類型,否則您的代碼將在Win64上失敗。
SomeMethod(int a, WPARAM wParam, LPARAM lParam)
{
SomeStruct *s = (SomeStruct *) lParam;
printf("the value of s.foo is %d", s.foo); //print result
}
抱歉,但是嘗試將整數轉換為指針是一個巨大的錯誤。 要使用未定義的類型指針,只需使用void指針即可 。 代替:
struct SomeStruct {
int foo;
int bar;
int baz;
int bat;
}
SomeMethod(int a, int wParam, int lParam)
{
SomeStruct *s; //declare struct variable
s = lParam; //assign integer value as pointer to struct
printf("the value of s.foo is %d", s.foo); //print result
}
您可以使用:
struct SomeStruct {
int foo;
int bar;
int baz;
int bat;
}
SomeMethod(int a, int wParam, void *lParam)
{
struct SomeStruct *s; //declare struct variable
s = (struct SomeStruct *)lParam; //assign integer value as pointer to struct
printf("the value of s.foo is %d", s->foo); //print result
}
指向結構的具體指針也可能起作用的地方:
SomeMethod(int a, int wParam, struct SomeStruct *lParam)
{
printf("the value of s.foo is %d", lParam->foo); //print result
}
嘗試閱讀一些有關C的技巧,例如C-FAQ 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.