COM: Assertion failed bei Drag&Drop Beispiel aus dem Buch "GoTo COM" (Peter Loos)



  • Hallo zusammen!

    Seit Stunden versuche ich schon das Drag&Drop-Beispiel aus dem Buch von Peter Loos zum Laufen zu bringen. Weder mein aus dem Buch abgetippter Quelltext, noch der direkt von der CD funktionieren.

    Die Zeile

    hr = RegisterDragDrop (hWndConsole, pIDropTarget);
    

    aus dem unten aufgeführten Quelltext liefert für hr IMMER 0x8007000E, d.h. E_OUTOFMEMORY, was natürlich in der nächsten Zeile die Zusicherung verletzt.

    Speicher ist eigentlich genug da. Habe es jetzt auf verschiedenen Rechnern (alle mit Windows XP) und mit Hilfe von verschiedenen Versionen des Visual Studio (VC6, 2008 Express und 2008 Prof.) versucht und stets dasselbe Ergebnis erhalten.

    Gibt es noch etwas zu beachten, oder muss ich an der Umgebung etwas konfigurieren?

    Das ist das Hauptprogramm mit der entsprechenden Zeile:

    int
    main (void)
    {
        ODS0 ("[COM File Viewer]\tentering main\n");
    
        // set title bar for the current console window
        SetConsoleTitle ("COM File Viewer");
    
        // initialize COM libraries
        HRESULT hr = OleInitialize ((LPVOID) 0);
    
        // find console window
        HWND hWndConsole = FindWindow ("ConsoleWindowClass", 0);
    
        // create one COM object on the stack
        CDropTargetImpl * p_CDropTargetImpl = new CDropTargetImpl;
    
        // force a reference count with the help of QueryInterface
        IDropTarget * pIDropTarget;
        hr = p_CDropTargetImpl -> QueryInterface (
            IID_IDropTarget,
            (void **) & pIDropTarget
        );
        assert (hr == S_OK);
    
        // register the console window as target for
        // drag-and-drop operations, specify an IDropTarget
        // instance to use for drop operations
        hr = RegisterDragDrop (hWndConsole, pIDropTarget);
        assert (hr == S_OK);
    
        // keep application alive with a message pump
        MSG msg;
        while (GetMessage (& msg, (HWND) 0, 0, 0))
            DispatchMessage (& msg);
    
        // revoke the registration of this application window
        // as a potential target for drag-and-drop operations
        hr = RevokeDragDrop (hWndConsole);
        assert (hr == S_OK);
    
        // release COM object
        pIDropTarget -> Release ();
    
        // release COM libraries
        OleUninitialize ();
    
        MessageBox (
            (HWND) 0, "Good bye", "COM File Viewer", MB_OK
        );
        ODS0 ("[COM File Viewer]\tleaving main\n");
        return 0;
    }
    

    Vielen Dank fürs Lesen und für jeden Tipp.



  • Hoppla! Hab mich im Forum vertan. Das gehört wohl nach WinAPI. Wäre ein Mod so nett und verschiebt den Beitrag.



  • Ich kann das Rätsel aufklären, wenn gleich leider
    auch nicht mit der erwarteten Zufriedenheit:

    Auf meinem Entwicklungsrechner, den ich während der Erstellung
    meines Buches verwendet habe, lief das Beispiel
    (sonst hätte ich es nicht in das Buch aufgenommen),
    aber in nachfolgenden Betriebssystemversionen nicht mehr.

    Ich habe nie richtig eruieren können, worauf dies zurückzuführen ist.

    Letzten Endes habe ich den Eindruck gewonnen, dass Microsoft explizit
    (also durch eine Änderung in ihrem Betriebssystem) verhindern wollte,
    dass D&D-Targets in einer Konsole ablegbar sind.

    Alle anderen Beispiele sollten aber ohne Probleme funktionieren,

    alles Gute und trotzdem viel Spaß bei der Lektüre von Go to COM,
    Peter Loos



  • PeLoSTA schrieb:

    Letzten Endes habe ich den Eindruck gewonnen, dass Microsoft explizit
    (also durch eine Änderung in ihrem Betriebssystem) verhindern wollte,
    dass D&D-Targets in einer Konsole ablegbar sind.

    Mhm, aaaalso ...
    wenn ich mich in meiner Konsole in ein Verzeichnis bewegen möchte, das einen langen, aus mehreren Verzeichnisebenen zusammengesetzten Namen hat, dann tippe ich cd ein, öffne das gewünschte Verzeichnis im Windows-Explorer (das ist ja mit ein paar Mausklicks leichter erreichbar), 'packe' das OrdnerIcon aus der Adressleiste des Explorers und ziehe das in mein Konsolenfenster. Dort erscheint dann hinter meinem eingetippten 'cd' der vollständige Pfad, so daß ich nun einfach durch Betätigen der Eingabetaste in das gewünschte Verzeichnis gelange.

    Spricht das nicht dafür, daß die Konsole durchaus als D&D - Target fungieren kann?


Log in to reply