2010-10-06 3 views
0

Привет У меня проблемы с моим SendMessage.Проблемы с IPC SendMessage

Это похоже на то, что сообщение никогда не достигает моей формы (я использую Winspector Spy, чтобы видеть, какие сообщения зарегистрированы в моей форме), что странно, потому что я shure. Я посылаю правильную Ручку для текущая форма.

SendMessage находится внутри dll, но это не должно иметь никакого отношения к этому.

//sStr is just an input where i type in the Handler address; 
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct)); 

SendMessage возвращает 0 каждый раз.

На приемном конце:

procedure WMCopyData(var Msg: TWMCopyData); message WM_CopyData; 

procedure TMainForm.WMCopyData(var Msg: TWMCopyData); 
var 
s : string; 
begin 
    s := PChar(Msg.CopyDataStruct.lpData); 
    showmessage(s); 
//Send something back 
    msg.Result := 2006; 
end; 

Я также пробовал другие подобные сообщения WM_CLOSE. Кто-нибудь знает, почему это не удается? Я использую Delphi 5.

+0

Вы уверены, что вы передаете правую ручку окна для SendMessage? Сначала проверьте это. И я полагаю, что это обычное приложение. – Runner

ответ

1

Проблема заключается в том, что вы не можете написать

Integer(sStr) 

преобразовать строку, представляющую собой целое число (например, «12345») в целое число (12345).

Использование

StrToInt(sStr) 

вместо этого.

Действительно, технически строка является только указателем на заголовок строки + данные. Я думаю, что Integer(sStr) просто возвращает этот указатель. (Или, фактически, просто рассматривает sStr как целое число).

То есть, вы должны сделать

SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct)); 
+0

Не помогло, но спасибо за предложение – Roise

+0

Ну, это больше, чем предложение. Это будет * определенно * не работать, если вы напишете 'Integer (sStr)'. Когда я сделал тест, 'Integer ('12345') = 4605000'. –

+0

Да, хорошо, используя его, извините, если я прозвучал остро или не принял то, что вы сказали, я просто сказал, что это не решило мою проблему, это был долгий день программирования :) – Roise

1

Определение SendMessage является

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall; 

Обновлено

Для Msg = WM_COPYDATA:

  • Первый аргумент является дескриптор окно, получающее данные
  • третий аргумент является дескриптор окна передавая данные

Если назвать первый аргумент SStR я предполагаю, что это не ручка, а строка.

+0

Неправильно, как?my fist parm sStr - это дескриптор окна приема, WM_CopyData - это сообщение, Handle - это дескриптор dll, а @copyDataStruct - это данные, которые должны быть отправлены. Я здесь не виноват. – Roise

+0

@Rosie: Какой тип данных является 'sStr'? –

+0

sStr - это строка. Что я вручную набираю в Handel для формы таргетинга. – Roise

0

Я думаю, что проблема в том, что вы пытаетесь использовать имя или что-то для вашего окна, и это не будет работать.

Попробуйте вместо этого:

var 
    Wnd: HWnd; 
begin 
    Wnd := GetForegroundWindow(); // Assumes your target window is up front 
    // Fill in CopyData structure here. 
    SendMessage(Wnd, WM_COPYDATA, SomeWParamValue, Cardinal(@CopyDataStruct)); 
end; 
Смежные вопросы