Отправка текста из VB в приложения Delphi, используя SendMessage - PullRequest
1 голос
/ 05 апреля 2011

) Я пытаюсь отправить короткий текст из приложения VB в приложение Delphi .. вот код VB: Программа отправителя "Отправитель"

Public Class SendData

 Const WM_COPYDATA = &H4A
 Public Structure CopyDataStruct
    Public dwData As Integer
    Public cbData As Integer
    Public lpData As String
 End Structure

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
 (ByVal hWnd As Long,  ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As _
 CopyDataStruct) As Long

Private Sub SendData(ByVal cds)
    Dim iHwnd As Long
    Dim SS As String = "Test String less than 30 Char"
    Dim cds As CopyDataStruct
    cds.dwData = 0
    cds.cbData = Len(SS)
    cds.lpData = SS
    iHwnd = FindWindow(0&, "Receive")
    SendMessage(iHwnd, &H4A, Me.Handle, cds) 
End Sub

вот программа Delphi Code: Receiver "Получи "

 procedure TForm1.HandleCopyDataString(copyDataStruct: PCopyDataStruct);
 var
  s : string;
 begin
  s := PChar(CopyDataStruct.lpData);
  cdMemo.Lines.Add(Format('Received data "%s" at %s',[s, TimeToStr(Now)]));
 end;

 procedure TForm1.WMCopyData(var Msg: TWMCopyData) ;
 var
  s : string;
  sText: array[0..255] of Char;
  copyDataType : TCopyDataType;
 begin
  copyDataType := TCopyDataType(Msg.CopyDataStruct.dwData);
  s := PChar(Msg.CopyDataStruct.dwData);
  Form1.cdMemo.Lines.Add(Format('Data from: %d',[msg.From]));
  HandleCopyDataString(Msg.CopyDataStruct);
  case Msg.CopyDataStruct.dwData of 0: //we are being sent a string
  begin
    StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
    Form1.Label1.Caption := sText;
  end;
end;
end;

Что я тут не так делаю?Можно отправить строки из VB в программы Delphi, используя команду WM_COPYDATA и функцию SendMessage?

, пожалуйста, помогите мне: -)

F

1 Ответ

5 голосов
/ 05 апреля 2011

В вашем Delphi-коде есть несколько ошибок:

  1. Поле dwData содержит целое число , но вы приводите его к PChar, указатель, а затем назначьте его вашей строке.Это не поле, в котором вы сохранили свои строковые данные.Это lpData.

  2. Передаваемая вами строка не заканчивается нулем.ОС обещает скопировать только столько байтов, сколько указано в поле cbData.Это не обязательно проблема, но вы должны знать об этом, когда будете читать строку позже.Чтобы назначить s для хранения строки, скопированной из другого процесса, используйте SetString следующим образом:

    SetString(s, PAnsiChar(Msg.CopyDataStruct.lpData), Msg.CopyDataStruct.cbData);
    
  3. Вы не показали, что такое TCopyDataType, но еслиэто что-то кроме целочисленного или целочисленного поддиапазона, вы используете его неправильно.Поле dwData уже является DWord, поэтому его можно использовать везде, где ожидается числовое значение.

  4. Вы неправильно набираете StrLCopy.Третий параметр должен быть размером буфера destination , а не источником.Он предназначен для предотвращения переполнения буфера, не копируя больше символов, чем уместится в месте назначения.Ожидается, что функция сможет определять размер исходного буфера, находя завершающий нулевой символ (но мы уже установили, что он не будет доступен).Вы можете исправить это так:

    StrLCopy(sText, Msg.CopyDataStruct.lpData,
      Min(Length(sText), Msg.CopyDataStruct.cbData));
    

    (Min входит в Math .)

...