2

Windows (7) 上の C++ で A と B の 2 つのサードパーティ プログラム用のプラグインを開発しており、2 つのプログラム間で通信するための堅牢で比較的単純な (そして高速な) 方法が必要です。

通信は一方向です。プログラム内のユーザー インタラクションに基づいて、AI はプログラム A 内のプラグインに信号を送信させ、最終的にプログラム B 内のプラグイン内の関数を呼び出します。

プロトコルは簡単です。これは、B のプラグイン内の受信関数の署名です。

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

これをどのように行うことをお勧めしますか?

4

1 に答える 1

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);
于 2013-09-17T18:08:04.870 に答える