2012-04-12 4 views
0

Я искал отправку сообщения от Microsoft Visual C++ в другое приложение, созданное в Delphi в течение 2 часов.VC++ отправка сообщения между двумя приложениями

В delphi Я знаю, как читать данные. Но я точно не знаю, как отправить сообщение в MVC++

Надеюсь, вы можете получить мне код.

Итак, для следующего кода мне нужен перевод в Microsoft Visual Studio C++ 2010, мой проект - это консольный проект.

const 
    MY_MESSAGE = WM_USER + 4242; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 

procedure Button1Click(Sender: TObject); 

    end; 
var 
    Form1: TForm1; 
implementation 
{$R *.DFM} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    txt: string; 
begin 
    txt := 'Hello World'; 
    SendMessage(Form1.Handle, MY_MESSAGE, 0, DWORD(PChar(txt))); 
end; 


end. 

И с этим кодом я должен прочитать данные. Также я хочу быть совместимым.

const 
    MY_MESSAGE = WM_USER + 4242; 

type 
    TForm1 = class(TForm) 

    // Handler that receive the Message 

procedure MessageReceiver(var msg: TMessage); message MY_MESSAGE; 
    end; 
var 
    Form1: TForm1; 
implementation 
{$R *.DFM} 


procedure TForm1.MessageReceiver(var msg: TMessage); 
var 
    txt: PChar; 
begin 
    txt := PChar(msg.lParam); 
    msg.Result := 1; 
    ShowMessage(txt); 
end; 
end. 

Так что мое приложение содержит две части: одна в Microsoft Visual Studio, я использую OpenCV и я хочу, чтобы отправить сообщение на второе приложение, которое создается в Delphi.

+1

Вы имеете в виду отправку сообщения с помощью SendMessage? – GolezTrol

+0

Да, используя конвейер окон – user558126

+1

Я не уверен, но я думаю, что это либо тот, и другой. Так как вы знаете, как читать в Delphi, можете ли вы опубликовать этот код, чтобы кто-нибудь знал, что вам нужно для записи? Кроме того, поскольку вам нужен код VC++, это не вопрос Delphi. – GolezTrol

ответ

1

Я не знаю, как использовать трубопровод, но я использовал до следующей схеме:

Используйте WM_COPYDATA сообщение с помощью SendMessage(). Вот это ссылка

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx

и пример

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649009(v=vs.85).aspx

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

+0

Я не знаю, как использовать этот код. Я не программист в MVC++. Спасибо, я переписал свой вопрос, чтобы быть проще для понимания. – user558126

1

Вы можете использовать сообщение WM_GETTEXT или WM_COPYDATA для отправки буферов данных взад и вперед между приложениями. Я однажды искал способ отправки буфера, например WM_GETTEXT, только с другим сообщением. Исходный код можно найти здесь:

http://www.nldelphi.com/forum/showthread.php?p=275167#post275167

Я не знаю, если все еще работает (не использовал его с тех пор), но это было тогда.

// The order (first Buffer, then BufferLength) seems more sensible, although with 
// WM_SETTEXT they are actually the other way around. 
function SendTextMessage(Handle: THandle; Msg: Integer; Buffer: Pointer; BufferLength: Integer): Cardinal; 
var 
    ProcessHandle: THandle; 
    ProcessId: Cardinal; 
    VirtualBuffer: Pointer; 
begin 
    // Get the id of process to which the handle belongs. 
    GetWindowThreadProcessID(Handle, @ProcessId); 
    ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); 

    if ProcessHandle = 0 then 
    RaiseLastWin32Error; 

    // Allocate a virtual buffer in the process 
    VirtualBuffer := VirtualAllocEx(ProcessHandle, nil, BufferLength, 
          MEM_COMMIT, PAGE_READWRITE); 
    if VirtualBuffer = nil then 
    RaiseLastWin32Error; 

    try 
    // Send a message to the handle, passing the virtual pointer as a buffer 
    Result := SendMessage(Handle, Msg, BufferLength, Integer(VirtualBuffer)); 

    // Read the resulting value from the virtual buffer into the given buffer 
    if not ReadProcessMemory(ProcessHandle, VirtualBuffer, Buffer, Result, Result) then 
     RaiseLastWin32Error; 

    finally 
    VirtualFreeEx(ProcessHandle, VirtualBuffer, BufferLength, MEM_RELEASE); 
    end; 

end; 

И называть это так:

var 
    h: THandle; 
    b: array[0..1024] of Char; 
begin 
    h := Cardinal(StrToInt(Edit1.Text)); 
    // Not like this 
    //SendMessage(h, WM_GETTEXT, 1024, Integer(@b)); 

    // But like this 
    SendTextMessage(h, WM_USER+1, @b, 1024 * SizeOf(Char)); 
    ShowMessage(b); 

Прочитайте сообщение, как это:

procedure WM_USERPLUS1(var Msg: TWMGetText); message WM_USER+1; 


procedure TForm2.WM_USERPLUS1(var Msg: TWMGetText); 
begin 
    with Msg do 
    Result := StrLen(StrLCopy(PChar(Text), PChar('Hallo wereld'), TextMax - 1)) * SizeOf(Char); 
end; 

Это, вероятно, так же, как легко использовать WM_COPYDATA, хотя. : D

+0

Спасибо, я переписал свой вопрос, чтобы быть проще для понимания. – user558126

+2

Почему бы вам не хотеть этого, вместо использования 'WM_COPYDATA' как природа предназначена ?! –

+0

Как я уже сказал, это, вероятно, так же просто использовать WM_COPYDATA, но, с другой стороны, это интересное упражнение, и оно позволяет вам использовать любое сообщение, которое вы хотите. Не стесняйтесь использовать его. :) – GolezTrol

Смежные вопросы