SendMessage & WM_COPYDATA



  • Hallo zusammen,

    ich versuche hier gerade eine Konsolenanwendung zu "basteln", bei der ich einen String an das Anwendungsprogramm XYplorer schicken will.

    ClassName eines solchen Fensters ist: ThunderRT6FormDC

    Das gefundene window handle ist auch in Ordnung. Leider kommt bei XYplorer nichts an 😢

    Das hier ist mein Code:

    #include "stdafx.h"
    #include <atlstr.h>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main() {
    
        HWND hWnd = ::FindWindow(L"ThunderRT6FormDC", NULL);
    
        if (hWnd != NULL)
        {
    		LPCTSTR strDataToSend = _T("::text 'test';");
    		COPYDATASTRUCT cpd;
    		cpd.dwData = 4194305;
    		cpd.cbData = sizeof(strDataToSend);
    		cpd.lpData = &strDataToSend;
    		::SendMessage(hWnd, WM_COPYDATA, (WPARAM)(HWND)hWnd, (LPARAM)(LPVOID)&cpd);
    	} else {
    		TCHAR szBuff[64];
    		_stprintf(szBuff, _T("%p"), hWnd);
    		MessageBox(NULL, szBuff, _T("Title"), MB_OK);
    	}
        return 0;
    }
    

    cpd.dwData benötigt exakt diesen Wert, da er für die Ausführung eines Scripts in XYplorer vorgesehen ist.

    Hat jemand eine Idee, was ich hier falsch mache (abgesehen von der Warnung, die ich beim compilieren bekomme (_stprintf), das Programm läuft aber normal durch)?

    Danke und Gruß!



  • LPCTSTR strDataToSend = _T("::text 'test';");
    // ...
    cpd.cbData = sizeof(strDataToSend);
    

    LPCTSTR ist ein Zeigertyp. Solange strDataToSend ein Zeiger ist, ist hier der sizeof -Operator höchstwahrscjeinlich falsch, denn die Größe in Bytes des Strings ist interessant und nicht die des Zeigers.

    Einfachste Lösung: strDataToSend ist ein Array.



  • Danke erstmal, EinGast!

    Wenn ich das richtig verstehe müsste ich also lediglich die folgende Änderung vornehmen (also das Eine durch das Andere ersetzen):

    LPCTSTR strDataToSend = _T("::text 'test';");
    

    durch

    char strDataToSend[] = "::text 'test';";
    

    Was ich ausprobiert habe. Beim XYplorer kommt allerdings trotzdem (noch) nichts an. Entweder ich habs falsch verstanden, falsch umgesetzt oder es steckt noch ein Logikfehler im Code?



  • Probiere mal

    TCHAR strDataToSend[] = _T("::text 'test';");
    

    (da du ja anscheinend UNICODE aktivierst hast).



  • Großartig!

    Ja, Unicode ist aktiviert und mit der Änderung empfängt XY die Daten 🙂

    Wobei ich noch eine kleine Änderung brauchte:

    cpd.cbData = sizeof(strDataToSend) - 1;
    

    Damit ich die Nullbyte Terminierung nicht mitschicke (mit der kann XY nichts anfangen).

    Noch eine (hoffentlich) kleine Sache: Der Prozess beendet sich nach dem Abschicken per SendMessage nicht von selbst, sondern wartet so lange, bis ich das aufpopende Fenster (durch "text 'test';) in XY schließe.

    Kann man das noch ändern?



  • Dann probiere mal PostMessage.



  • Alles klar, danke noch mal!



  • Laut MSDN darf man PostMessage nicht für WM_COPYDATA benutzen.
    Quelle, siehe Abschnitt Remarks.


Anmelden zum Antworten