【问题标题】:How do I convert a Win32 lParam to a C struct?如何将 Win32 lParam 转换为 C 结构?
【发布时间】:2009-01-19 16:07:35
【问题描述】:

假设我有一些 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
}

【问题讨论】:

  • 您是否正在使用特定的方法?我认为您的答案对大多数人都有效,但有些方法不同。
  • 您的 SomeMethod 可能应该是:SomeMethod(int a, WPARAM wParam, LPARAM lParam) ... 不记得 'int' 是否总是和 LPARAM(又名 LONG_PTR)一样宽,但即使它 是 i>,任何追随你的开发者都可能想知道同样的事情,所以最好使用 LPARAM 等。

标签: c winapi


【解决方案1】:

是的,假设 lParam 'really' 包含一个指向结构的指针,那么你可以通过 '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

【讨论】:

  • 请注意,确保它是你所说的那样是由你决定的。
  • 是的,它应该是指向该类型结构的指针。谢谢
  • 整数不小于指针,因为他将其标记为“Win32”,而不是“Win64”;无论如何,lParam 应该是 LONG,而不是 INT(也许他在他的 OP 中以某种方式过度简化了它)。
  • LParam 实际上是一个 LPARAM,即一个 LONG_PTR,因此对于 SomeStruct* 来说足够大
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    将整数转换为指针时要小心。在 x64 架构上,int 仍然是 32 位整数,但指针是 64 位的。

    【讨论】:

      【解决方案4】:

      请使用正确的类型,否则您的代码在 Win64 上失败。

      SomeMethod(int a, WPARAM wParam, LPARAM lParam)
      {
        SomeStruct *s = (SomeStruct *) lParam;
        printf("the value of s.foo is %d", s.foo);  //print result
      }
      

      【讨论】:

        【解决方案5】:

        抱歉,尝试将整数转换为指针是一个巨大的错误。要使用未定义的类型指针,只需使用 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

        【讨论】:

        • ...但在 Windows 编程的某些情况下,您需要使用 LPARAM。
        猜你喜欢
        • 2016-01-08
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        相关资源
        最近更新 更多