繁体   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