Как преобразовать Win32 lParam в структуру C? - PullRequest
0 голосов
/ 19 января 2009

Скажем, у меня есть метод 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
}

Ответы [ 5 ]

7 голосов
/ 19 января 2009

Да, если предположить, что 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
1 голос
/ 14 мая 2011

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-битные значения. В SDK (Software Developer Kit) в WinDef.h. WPARAM определяется как UINT в более ранних версиях SDK, а теперь как UINT_PTR. LPARAM остается определенным как LONG в более ранних версиях SDK, а теперь как LONG_PTR

0 голосов
/ 23 января 2009

Пожалуйста, используйте правильные типы, или ваш код выйдет из строя на Win64.

SomeMethod(int a, WPARAM wParam, LPARAM lParam)
{
  SomeStruct *s = (SomeStruct *) lParam;
  printf("the value of s.foo is %d", s.foo);  //print result
}
0 голосов
/ 19 января 2009

Просто будьте осторожны, когда вы приводите целые числа к указателям. В архитектурах x64 int остается 32-разрядным целым числом, но указатели являются 64-разрядными.

0 голосов
/ 19 января 2009

Извините, но пытаться конвертировать целые числа в указатели - огромная ошибка. Чтобы использовать неопределенный указатель типа, просто используйте 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...