Послать сообщение другому приложению.

RRRКК 23.05.2004 - 16:02 | Нужно с делфи(программы) послать сообщение другому приложению(на VC), послать не проблема, а как его получить ?
RRRКК 1 - 23.05.2004 - 16:04 | Или подругому , нужно выполнить действие после того как программа отработала
archimag 2 - 23.05.2004 - 16:32 | А в чём проблема при получении сообщения. В VC обработать сообщение проще, чем в Delphi его отправить;)).Также можно использовать весь набор инструментов синхронизации и межпроцесного взаимодействия. Вариантов очень много.
archimag 3 - 23.05.2004 - 16:34 | Multiple processes can have handles to the same event, mutex, semaphore, or timer object, so these objects can be used to accomplish interprocess synchronization. The process that creates an object can use the handle returned by the creation function (CreateEvent, CreateMutex, CreateSemaphore, or CreateWaitableTimer). Other processes can open a handle to the object by using its name, or through inheritance or duplication.
RRRКК 4 - 23.05.2004 - 19:43 | Если не трудно можно маленький пример?
archimag 5 - 23.05.2004 - 20:12 | The first process uses the CreateMutex function to create the mutex object. Note that the function succeeds even if there is an existing object with the same name. // One process creates the mutex object. HANDLE hMutex; DWORD dwErr; hMutex = CreateMutex( NULL, // no security descriptor FALSE, // mutex not owned "NameOfMutexObject"); // object name if (hMutex == NULL) printf("CreateMutex error: %d\n", GetLastError() ); else if ( GetLastError() == ERROR_ALREADY_EXISTS ) printf("CreateMutex opened existing mutex\n"); else printf("CreateMutex created new mutex\n"); The second process uses the OpenMutex function to open a handle to the existing mutex. This function fails if a mutex object with the specified name does not exist. The access parameter requests full access to the mutex object, which is necessary for the handle to be used in any of the wait functions. // Another process opens a handle to the existing mutex. HANDLE hMutex; hMutex = OpenMutex( MUTEX_ALL_ACCESS, // request full access FALSE, // handle not inheritable "NameOfMutexObject"); // object name if (hMutex == NULL) printf("OpenMutex error: %d\n", GetLastError() );
RRRКК 6 - 23.05.2004 - 21:15 | NameOfMutexObject - а это какаое имя?
archimag 7 - 23.05.2004 - 22:51 | const char NameOfMutextObject[] = "Любое имя, которое я могу захотеть, но одиноковое для двух приложений"
RRRКК 8 - 24.05.2004 - 07:55 | Дык, непонял, а как приложение то запустить?
archimag 9 - 24.05.2004 - 11:20 | Какое приложение?.. В приложении на дельфи создаешь, например, объект-ядра event(событие)в занятом состоянии: HANDLE myEvent = CreateEvent( nil, TRUE, FALSE, EventName ). Сам знаешь когда, переводишь его в незанятое состояние SetEvent( myEvent ). В приложении на VC открываешь объект-ядра event: OpenEvent(EVENT_ALL_ACCESS, FALSE, EventName). В каком-нибудь из своих поток ждёшь освобождения события функцией WaitForSingleObject...
archimag 10 - 24.05.2004 - 12:15 | Если нужно дождаться завершения дочернего процесса, то пишем примерно следующее: PROCESS_INFORMATION pi; if( CreateProcess( ... , &pi ) ) { CloseHandle( pi.hThread ); //описатель потока нам не нужен WaitForSingleObject( pi.hProcess, INFINITE ); // ждём завершения процеса CloseHandle( pi.hProcess ); // описатель процесса нам больше не нужен }
RRRКК 11 - 26.05.2004 - 21:35 | ага, а вот WaitForSingleObject - ждет сигнал, и в это время программа ни чем не занимется , кроме того что ждет event. под win98 бывает зависает всё. можно сделать, что в это время программа продолжала работать, а как только поступило сообщение, обработала опр. код?
x77 12 - 26.05.2004 - 22:07 | запуская её в потоке
RRRКК 13 - 26.05.2004 - 22:38 | Ну я так, и понял что это можно. Не могли бы написать пример как? Спасибо.
archimag 14 - 27.05.2004 - 01:50 | Пример: функцией CreateThread создаём новый поток, в котором ждём завершения дочернего процесса, после чего, посылаем сообщение главному окну приложения, которое его обрабатывает как тебе нужно. Можно придумать и более хитрую схему... const unsigned long WM_DELPHI_PROC_END = WM_USER+100 DWORD MyThreadProc( void* param ) { PROCESS_INFORMATION pi; if( CreateProcess( ... , &pi ) ) { CloseHandle( pi.hThread ); WaitForSingleObject( pi.hProcess, INFINITE ); CloseHandle( pi.hProcess ); SendMessage( g_hMainWnd, WM_DELPHI_PROC_END, 0, 0 ); } }
techwriter 15 - 31.05.2004 - 12:39 | Регитсрируешь свое сообщение в системе:RegisterWindowMessage. Получаешь номер. Затем когда надо, с помощью send message, шлешь его всем (HWND_BROADCAST): send message (HWND_BROADCAST, "номер зарегистрированного ранее сообщения",wParam,lParam). lParam=0, а wParam=0 или можешь еще что-нибудь через него передать А в сишной проге лови это сообщение

>>