Как определить lParam для COPYDATASTRUCT?

Итак, я как бы следовал этому:

https://msdn.microsoft.com/en-us/library/ms649009(v=vs.85).aspx

и это:

Используйте WM_COPYDATA для отправки данных между процессами

Для отправки данных между приложением openframeworks и нереальным движком 4. Теперь все в порядке, за исключением того, что я не могу понять, почему я получаю сообщение об ошибке, что lParam не определено. Наверное, это что-то простое, но я не могу найти, как это сделать.

Итак, в нереальном движке 4 у меня есть актер, который отправляет сообщение каждые 10 секунд (в целях тестирования):

void ACOMActor::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

    timer += DeltaTime;

    if (timer > sendtime) {
        timer = 0.f;
        std::string string  = "a message";
        const wchar_t* wstring = new wchar_t[string.length() +1];
        std::copy(string.begin(), string.end(), wstring);
        SendWMCOPYDATA(wstring);
    }
}

void ACOMActor::SendWMCOPYDATA(const wchar_t* string)
{
    HWND WINAPI GetActiveWindow(void);
    LPCTSTR lpszString = string;
    COPYDATASTRUCT cds;
    cds.dwData = 1;
    cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1);
    cds.lpData = &lpszString;

    SendMessage(GetActiveWindow(), WM_COPYDATA, (WPARAM)GetActiveWindow(), (LPARAM)(LPVOID)&cds);

    GEngine->AddOnScreenDebugMessage(-1, 5.F, FColor::Green, FString::Printf(TEXT("Sending a message")));
}

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

Я также создал код для получения сообщения в openframeworks. Я не был точно уверен, как это сделать, поэтому я добавил это в функцию обновления моего ofApp.cpp.

void ofApp::update() {
    GM->update();

    PCOPYDATASTRUCT pMyCDS;
    void WINAPI MyDisplay(LPSTR, LPSTR, DWORD);

    pMyCDS = (PCOPYDATASTRUCT)lParam;
    if (pMyCDS->dwData == 1)
    {
        LPCTSTR lpszString = (LPCTSTR)(pMyCDS->lpData);
        cout << "receiving a message" << endl;
    }
}

Так что это не работает, потому что lParam не определен. Я также пытался что-то сделать с LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

Но я не знаком с этим и не знаю, как его использовать. Моя ошибка исчезла, но сообщение не было получено... Я использовал это так, возможно, неправильно:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PCOPYDATASTRUCT pMyCDS;
    void WINAPI MyDisplay(LPSTR, LPSTR, DWORD);
    pMyCDS = (PCOPYDATASTRUCT)lParam;
    if (pMyCDS->dwData == 1)
    {
        LPCTSTR lpszString = (LPCTSTR)(pMyCDS->lpData);
        cout << "receiving a message" << endl;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

Любые советы, как этого добиться? Это, вероятно, очень просто, но я не могу найти никакой четкой информации. Спасибо!


person Alexander S.    schedule 01.03.2016    source источник
comment
Слишком много ошибок, начиная с GetActiveWindow(). Это всегда работает только случайно, это никогда не работает между процессами. Просто не используйте вместо этого именованный канал.   -  person Hans Passant    schedule 01.03.2016
comment
Что вы имеете в виду под именованным каналом?: msdn.microsoft.com/en-us/library/   -  person Alexander S.    schedule 01.03.2016