2013-11-17 4 views
1

У меня есть консольное приложение для Windows, которое запускает дочерний процесс. Как отправить сообщение дочернему процессу? Я нашел такие функции, как PostMessage()/PeekMessage() - это то, что мне нужно, но, как я понимаю, оно используется внутри одного приложения и использует HWND для определения целевого окна (у меня нет окон в приложении). Также я читал материалы о ipc, например, названные каналы также требуют HWND. я хочу что-то вроде этого:как отправить сообщение из одного приложения консоли Windows в другое?

[program 1] 

int main() 
{ 
    CreateProcess(.., processInfo); 
    SendMessage(processId, message); 
} 

[program 2] 

int main() 
{ 
    while(1) 
    { 
//  do thw work 
     Sleep(5 * 1000); 
//  check message 
     if(PeekMessage(message,..)) 
     { 
     break; 
     } 
    } 
} 

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

+2

'PostThreadMessage'? – Paul

+0

Уже найден PostThreadMessage(), это помогло! Спасибо ;) –

ответ

1

Попробуйте создать Message-Only Window.

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

0

В программе 1 вы должны использовать функцию FindWindow, чтобы получить ручку программы 2

, а затем использовать SendMessage функция

[программа 1]

int main() 
    { 
    HWND hwnd=FindWindow(NULL,formText);//formText name of program 2 
     if(hwnd!=0) 
     { 
      COPYDATASTRUCT cd; 
     cd.dwData = 100; 
     cd.cbData = 100; 
     cd.lpData = msg;    //msg additional data 
     SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)(&cd)); 
     } 
    } 

[program 2] 

    void handlemessage(MSG *msg) 
    { 
     //handle 
    } 


    int main() 
    { 

     MSG msg; 
     while (GetMessage(&msg, NULL, 0, 0)) 
     { 
      handlemessage(&msg); 
     } 
    } 
0
[program 1] 
int main() 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    std::string path = "c:\\program2.exe"; 
    CreateProcess(path.c_str(), .. , &si, &pi)) 
    Sleep(12 * 1000); // let program2 do some work 
    PostThreadMessage(pi.dwThreadId, 100, 0, 0); 
} 

[program 2] 
int main(int argc, char * argv[]) 
{ 
    MSG message; 
    for(int i = 0; i < 1000; i++) 
    { 
     std::cout << "working" << std::endl; 
     Sleep(2 * 1000); 
     if(PeekMessage(&message, NULL, 0, 0, PM_NOREMOVE)) 
     { 
      break; 
     } 
    } 
} 
Смежные вопросы