2013-09-17 4 views
2

Я разрабатываю плагин для двух сторонних программ: A и B на C++ в Windows (7) и нуждаюсь в надежной, относительно простой (и быстрой) способ общения между двумя программами.Надежная, простая (и быстрая) межпроцессная связь в C++ на Windows

сообщение является одним из способов: на основе взаимодействия с пользователем в программе AI хочу, чтобы мой плагин внутри программы А, чтобы послать сигнал, который заканчивается до вызова функции внутри моего плагина в программе В.

Протокол просто. Это подпись функции приема внутрь моего плагина в B:

struct XYZ { 
    double x, y, z; 
} 
void polyLineSelected(long id, std::vector<XYZ> & points); 

Как бы вы рекомендовать это сделать?

+1

повысить межпроцессную? Одно можно сказать о том, что легко использовать – emesx

+1

Сколько данных существует «за транзакцию»? (например, насколько велика «вектор»? –

+0

Очень мало. Скажите максимум 20 баллов, часто только 4. – Andy

ответ

0

На сегодняшний день самым простым способом реализации односторонней связи в Windows является отправка сообщения WM_COPYDATA. Для перемещения произвольных данных из одного приложения в другое требуется параметр COPYDATASTRUCT.

Для вашего конкретного примера реализация отправителя будет выглядеть следующим образом:

// Declare symbolic constants to identify data 
enum DataType { 
    DataType_Points 
}; 
// Declare struct to hold compound data 
struct IPCData { 
    long id; 
    XYZ pts[]; 
}; 

// Allocate buffer 
const size_t bufferSize = offsetof(IPCData, pts[points.size()]); 
vector<char> buffer(bufferSize); 
IPCData* pData = reinterpret_cast<IPCData*>(&buffer[0]); 

// Fill the buffer 
pData->id = 42; 
copy(points.begin(), points.end(), &pData->pts[0]); 

// Prepare COPYDDATASTRUCT 
COPYDATASTRUCT cds = { 0 }; 
cds.dwData = DataType_Points; // Can be used by the receiver to identify data 
cds.cbData = bufferSize; 
cds.lpData = pData; 

// Send the data 
SendMessage(hWndRecv, WM_COPYDATA, 
      (WPARAM)hWndSender, 
      (LPARAM)(LPVOID)&cds); 
+0

Я новичок в этом методе и просто просматриваю пример. Правильно ли я понимаю, что вызывающий (A) использует имя процесса B для отправки ему сообщения, и этот процесс B получает сообщение, как любое другое событие из ОС? – Andy

+1

@ Andy Вызывающий должен знать «HWND» получателя. Пример кода в [Использование копирования данных] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms649009.aspx) использует имя целевого окна для извлечения дескриптора. В любом случае ваш отправитель должен получить дескриптор окна получателя. На принимающей стороне вы обрабатываете 'WM_COPYDATA', как и любое другое сообщение. – IInspectable

+0

@Zac Нет, вы никогда не захотите использовать 'PostMessage'. Прочитайте [документацию] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011.aspx): * «Пока это сообщение отправляется, данные, на которые ссылаются, не должны быть изменены другим потоком процесса отправки ». * Вы хотите заблокировать отправителя (A), пока приемник (B) не закончит обработку сообщения. – IInspectable

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