簡體   English   中英

如何將Win32 lParam轉換為C結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM