トップWindows-Tips >  アプリケーション間のデータ送受信

アプリケーション間のデータ送受信

Windowsアプリケーション間のデータ送受信を行う簡単なプログラム例を下に示す。 最初に receiver.exe を起動し、次に、sender.exe を起動する。 次に、receiver.exe のウインドウをクリックして制御を移すとメッセージボックスに "Hello World!" と表示される。

// receiver.c
#include <string.h>
#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_COPYDATA:
        {
            COPYDATASTRUCT *pCDS = (COPYDATASTRUCT *)lParam;
            MessageBox(hwnd, (char*)pCDS->lpData, "受信データ", MB_OK);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPI, LPSTR lpCmdLine, int nCmdShow){
    HWND hWnd;
    WNDCLASS wcl;
    MSG msg;
     
    memset(&wcl, 0, sizeof(wcl));
    wcl.hInstance = hInst;
    wcl.lpszClassName = "Receiver";
    wcl.lpfnWndProc = WindowProc;
    wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
     
    if (!RegisterClass(&wcl)) return FALSE;
     
    hWnd = CreateWindowEx(0,
        "Receiver",   // 登録されているクラス名
        "Receiver",   // ウィンドウ名
        WS_OVERLAPPEDWINDOW|WS_VISIBLE,    // ウィンドウスタイル
        20, 20, 500, 200,   // ウィンドウの横,縦,幅,高さ
        NULL,         // 親ウィンドウのハンドル
        NULL,         // メニューハンドルまたは子識別子
        hInst,        // アプリケーションインスタンスのハンドル
        NULL);        // ウィンドウ作成データ
        if(!hWnd) return FALSE;

    while (GetMessage(&msg,NULL,0,0) > 0){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
// sender.c 
// Windowsアプリケーション receiver.exe にメッセージを送る

#include <windows.h>

void main() {
    COPYDATASTRUCT cd;
    HWND hWnd;
    char *msg = "Hello World!";

    cd.dwData = 0;
    cd.cbData = lstrlen(msg)+1;
    cd.lpData = msg;
    hWnd = FindWindow("Receiver", "Receiver");
    SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cd);
}

いずれ、receiver.exe のウィンドウをクリックしなくとも、 メッセージが表示されるようにしたい。

MCC や GCC では問題ないが、TCC で sender.c をコンパイルするには、-luser32 オプションが必要となる。

c:\MH\www\windows\tips>tcc sender.c
tcc: undefined symbol '_FindWindowA@8'
tcc: undefined symbol '_SendMessageA@16'

c:\MH\www\windows\tips>tcc sender.c -luser32