Разыменование указателя C ++ - PullRequest
0 голосов
/ 18 января 2011

Мне только что удалось написать глобальный хук CBT на c ++, который можно использовать с c #.Это может звучать глупо, но мои знания указателей и разыменование их очень плохи из-за моей работы с c #.

Я не могу разыменовать указатель внутри структуры, на которую указывает lParam.

Это выглядит так: lParam - это длинный указатель на структуру CBT_CREATEWND, которая, в свою очередь, содержит член "lpcs" и указатель на CREATESTRUCT.Эта структура содержит член "х", который я хочу прочитать.Я попробовал следующее, но я получаю недопустимые значения для x:

CREATESTRUCT str = *(LPCREATESTRUCT)(((LPCBT_CREATEWND)lParam)->lpcs);
int normal = str.x;
PostMessage(FindWindow(NULL, L"Process Watcher Window"), RegisterWindowMessage(L"ALEXX_SEINE_WNDMESSAGE_C"), wParam, normal);

Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Ну, я не могу точно сказать, почему вы получаете недопустимые значения x, но я, скорее всего, написал бы этот код по-другому:

// the way you had it, it was making a copy of the CREATESTRUCT and storing it in str
// this just uses a pointer
LPCREATESTRUCT str = ((LPCBT_CREATEWND)lParam)->lpcs;
// when you have a pointer, use -> to use a member
int normal = str->x;

Поскольку вы сказали, что вы новичок в указателях, я немного объясню ->. Когда вы пишете x->y, это действительно то же самое, что и (*x).y, но с более приятным синтаксисом.

Также примечание совета, хотя приведение в этом коде кажется разумным. В общем, если вы обнаружите, что вы много разыгрываете, вы, вероятно, делаете это либо трудным, либо неправильным образом. Поэтому убедитесь, что вы нашли время, чтобы понять, что вы делаете.

1 голос
/ 18 января 2011

Ваш синтаксис, кажется, проверен, хотя, возможно, он немного нечитабелен, и приведение LPCREATESTRUCT явно не нужно.

Вы упомянули, что вы получаете недопустимые значения для x, возможно lParam на самом деле не является указателем на структуру CBT_CREATEWND? Вы проверяете, что nCode функции обратного вызова равен HCBT_CREATEWND перед приведением lParam?

...