VC2010 DLL debuggen



  • Hallo!

    Ich möchte gerne das Beispiel SampleTTSEngine.sln aus dem Windows SDK (C:\Programs\Microsoft SDKs\Windows\v7.0\Samples\winui\speech\engines\samplettsengine)
    auf meine Anwendung "übertragen".

    Meine Anwendung ist bisher eine .exe, und ich möchte sie jetzt mit dem selben Interface wie wie SampleTtsEngine ausstatten.

    Ich wollte gerne einfach mal das bestehende Beispiel debuggen, um zu schauen, was da überhaupt passiert.

    Ich habe die Kompileroptionen auf "Debuggen" gestellt, aber wenn ich dann das Debuggen starte, sagt er mir "Das Programm "m:\samplettsengine\Debug\SampleTtsEngine.dll" kann nicht gestartet werden werden.

    Wie ihr sehen könnt, habe ich das Projekt in einen anderen Ordner kopiert, weil ich dachte, es liegt vielleicht daran, dass ich im "Programme"-Ordner zu wenig Rechte habe.

    Im Moment bin ich grade nicht sicher, warum er die DLL nicht debuggen möchte.

    Über Hilfe würde ich mich sehr freuen.

    Vielen Dank!



  • Ja, Du brauchst irgendeine EXE, welche Deine DLL verwendet. Die kannst Du dann ein den Projekteinstellungen unter "Debuggen" eintragen. Diese Anwendung wird dann gestartet. Jetzt musst Du nur noch sicherstellen, dass diese Anwendung auch Deine DLL lädt! Das hängt natürlich von der jeweiligen Anwendung ab...



  • Vielen Dank. Ich dachte grade, ich steh im Wald, als es dann auf Anhieb auch noch funktioniert hat. Ich konnte es kaum glauben.

    Darf ich noch etwas fragen, bitte?

    Ich habe im Moment eine Feld-Wald und Wiesen-DLL.
    Die möchte/muss ich jetzt in eine COM-DLL umwandeln.

    Ich habe das noch nie gemacht. Reicht es, wenn ich die COM-Methode/das COM-Interface implementiere, oder muss ich auch noch in den Projekteigenschaften irgendetwas ändern?

    Ich habe jetzt einfach mal probiert, und er motzt jetzt z. B. in der Zeile

    CComModule _Module;

    Fehler 1 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner '_Module' SampleTtsEngine.cpp 19 1 voice

    Ich weiß nicht, was er da von mir will.

    Vielen Dank.



  • Hast Du schon eine MFC-DLL?
    Wenn nicht, dann wird das kompliziert...



  • Also ich denke mal, ich schaffe es nicht, zu vermitteln, dass ich ATL möchte (um mich mal so newbie-mäßig auszudrücken), aber ich habe in stdafx.h doch diese Zeilen hier drin:

    #include <atlbase.h>
    //You may derive a class from CComModule and use it if you want to override
    //something, but do not change the name of _Module
    extern CComModule _Module;
    #include <atlcom.h>

    Muss ich vielleicht im Projekteigenschaftenfenster oder so noch etwas umstellen?

    Danke für die Hilfe.



  • Ich weiß nicht... Wo sehe ich denn, ob ich eine MFC-DLL habe?



  • Ich habe auf dem einem Monitor das Windows-Beispiel geöffnet, und auf dem anderen Monitor meine DLL.

    Ich habe meines Wissens nach mein Projekt so angeglichen, dass es wie das Windows-Beispiel aussieht inklusive includes, etc.

    Wenn das gemacht ist, und er motzt trotzdem so rum, was würdet ihr denn dann tippen, was ich noch falsch gemacht habe?



  • Wenn Du ATL hast, dann sollte es auch gehen...

    Am einfachsten ist es, wenn Du ein Projeklt neu anlegst, so wie Du es mit Deinem gemacht hast und dann eines mit aktiviertem COM-Server; dann vergleichst Du die beiden und siehst, was Du in Deinem bestehenden Projekt noch eintragen musst...



  • Okay, ich hatte einen Teil des Codes vergessen übertragen...

    Ich habe bitte noch eine Frage:

    In dem Microsoft-Beispielprojekt gibt es eine .rc-Datei.
    In dieser .rc-Datei steht:

    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    1 TYPELIB "SampleTtsEngine.tlb"
    #include "version.rc2"

    Jetzt sagt er, dass die Datei SampleTtsEngine.tlb fehlt.
    Ich könnte sie aus dem anderen Projekt rüberkopieren, denke ich, aber ich wüsste gerne, wie man selbst so eine .tlb-Datei erstellt.

    Wenn da jemand die Antwort weiß, würde ich mich sehr freuen.

    Vielen Dank!

    Hermie



  • Eine TLB Datei wird aus einer IDL Datei erzeugt. Also diese IDL Datei wird kompiliert und zur TLB. Diese Datei wird dann als Ressource eingebunden.

    Und nein. Du kannst keine TLB aus einem anderen Projekt nehemn. Die TLB Datei muss genau zu Deinen Interfaces passen, die Du bauen möchtest.



  • Das Problem ist, dass in dem Microsoft-Beispiel-Projekt eine Ressourcen-Datei ist (SampleTtsEngine.rc, Code siehe unten).
    Darin wird die SampleTtsEngine.tlb angegeben ("1 TYPELIB "SampleTtsEngine.tbl")

    Wenn diese SampleTtsEngine.tlb fehlt bekomme ich Fehler beim Release-Kompilieren ("file not found: SampleTtsEngine.tlb").

    Muss ich zum Release-Kompilieren erst die .rc-Datei entfernen und sie dann, nachdem ich einmal ohne kompiliert habe und damit (hoffentlich) die .tlb-Datei erzeugt wurde, wieder einbinden?

    Das ist so kompliziert, dass ich mich frage, ob das der richtige Weg ist.

    Vielen Dank.

    SampleTtsEngine.rc:

    //Microsoft Developer Studio generated resource script.
    //
    #include "resource.h"
    
    #define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #define APSTUDIO_HIDDEN_SYMBOLS
    #include "windows.h"
    #undef APSTUDIO_HIDDEN_SYMBOLS
    #include "resource.h"
    
    /////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS
    
    /////////////////////////////////////////////////////////////////////////////
    // English (U.S.) resources
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    #ifdef _WIN32
    LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    #pragma code_page(1252)
    #endif //_WIN32
    
    #ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //
    
    1 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "resource.h\0"
    END
    
    2 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
        "#include ""windows.h""\r\n"
        "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
        "#include ""resource.h""\r\n"
        "\r\n"
        "\0"
    END
    
    3 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "1 TYPELIB ""SampleTtsEngine.tlb""\r\n"
        "#include ""version.rc2""\r\n"
        "\0"
    END
    
    #endif    // APSTUDIO_INVOKED
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // REGISTRY
    //
    
    IDR_SAMPLETTSENGINE     REGISTRY DISCARDABLE    "TtsEngObj.rgs"
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // String Table
    //
    
    STRINGTABLE DISCARDABLE 
    BEGIN
        IDS_PROJNAME            "SampleTtsEngine"
    END
    
    #endif    // English (U.S.) resources
    /////////////////////////////////////////////////////////////////////////////
    
    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    1 TYPELIB "SampleTtsEngine.tlb"
    #include "version.rc2"
    
    /////////////////////////////////////////////////////////////////////////////
    #endif    // not APSTUDIO_INVOKED
    


  • Es muss eine IDL Datei für das Projekt vorhanden sein.
    Was ist das für ein Projekt?
    Gib mir mal einen Link!



  • Hi Martin,

    das Projekt ist teilweise selbstgemacht.
    Du findest den wichtigen Teil aber in

    "Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1"
    Nach Installation der Samples findet man das Projekt in
    C:\Programs\Microsoft SDKs\Windows\v7.0\Samples\winui\speech\engines\samplettsengine

    Ich bin jetzt etwas weiter, das Problem besteht gerade nicht mehr. Ich weiß nicht mehr genau, was ich gemacht habe, aber jetzt geht es. Vielleicht lag es daran, dass ich den Namen meines Projektes geändert habe.

    Jetzt habe ich noch ein Problem.

    Ich will das Beispielprojektt debuggen.
    Das hat auch toll geklappt:

    Ich sage "Debuggen"->"An einen Prozess anhängen". Ich kann dann auch sehen, was gerade in der DLL passiert.

    Aber sobald ich aber eine andere Klasse zu ttsengobj.cpp hinzufüge...

    #include "app.h"
    
    CApp m_App;
    

    werden meine Haltepunkte für das Debuggen durchsichtig mit Achtung-Zeichen, und wenn ich drüberfahre, sagt er mir "Dieser Haltpunkt wird momentan nicht erreicht. Der Quellcode stimmt nicht mit der Originalversion überein.".

    Ich habe auch bereinigt und neu kompiliert und alles, aber das Problem bleibt bestehen.

    Ich weiß nicht, was er meint mit "Originalversion".

    Wäre toll, wenn mir da jemand sagen könnte, was ich falsch mache.

    Viele Grüße
    Hermann



  • Ich habe alle .PDB-Dateien, die ich in diesem Projekt-Ordner finden konnte, gelöscht und neugestartet, aber er beharrt darauf, dass der Quellcode von der Originalversion abweicht.

    Viele Grüße,
    Hermann



  • Mist, nach 6 Stunden Probieren zehrt es doch an den Nerven.

    Ich muss nur eine Zeile in der ttsengobj.cpp ändern (z. B. eine Zeile einfügen:

    //test
    

    ), schon tritt das Problem auf.



  • DLL und PDB Dateien müssen einfach zusammenpassen.
    Ichhabe keine Ahnung was Du da machst, dass es nicht passt.


Anmelden zum Antworten