DLL verwenden?



  • Ah okay, verstehe. Habe nun aus taglib nochmal mit CMake ein neues Visual Studio Projekt erzeugt und das im Release-Modus kompiliert, wodurch ich die Dateien tag.dll, tag.lib und tag.exp erhalten habe. Beim Kompilieren traten ein paar Warnings auf, doch keine Errors.

    Die Warnings:

    1>C:/Users/martin/Desktop/taglib-1.6.3/taglib/toolkit\tfile.h(48): warning C4251: 'TagLib::FileName::m_name': class 'std::basic_string<_Elem,_Traits,_Ax>' erfordert eine DLL-Schnittstelle, die von Clients von class 'TagLib::FileName' verwendet wird
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>,
    1>              _Ax=std::allocator<char>
    1>          ]
    1>C:/Users/martin/Desktop/taglib-1.6.3/taglib/toolkit\tfile.h(49): warning C4251: 'TagLib::FileName::m_wname': class 'std::basic_string<_Elem,_Traits,_Ax>' erfordert eine DLL-Schnittstelle, die von Clients von class 'TagLib::FileName' verwendet wird
    1>          with
    1>          [
    1>              _Elem=wchar_t,
    1>              _Traits=std::char_traits<wchar_t>,
    1>              _Ax=std::allocator<wchar_t>
    1>          ]
    1>mpeg\mpegproperties.cpp(224): warning C4244: '=': Konvertierung von 'double' in 'int', möglicher Datenverlust
    1>ogg\vorbis\vorbisproperties.cpp(176): warning C4244: '=': Konvertierung von '__int64' in 'int', möglicher Datenverlust
    
    1>toolkit\unicode.cpp(158): warning C4244: '=': Konvertierung von 'Unicode::UTF32' in 'Unicode::UTF8', möglicher Datenverlust
    1>toolkit\unicode.cpp(256): warning C4244: '=': Konvertierung von 'Unicode::UTF32' in 'Unicode::UTF16', möglicher Datenverlust
    1>toolkit\unicode.cpp(273): warning C4244: '=': Konvertierung von 'unsigned long' in 'Unicode::UTF16', möglicher Datenverlust
    
    1>flac\flacfile.cpp(486): warning C4800: 'int': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)
    

    (die Warnings "...erfordert eine DLL-Schnittstelle..." sind über 20 mal für die zwei Stellen aufgetreten, ich hab sie hier aber mal rausgenommen, da es sonst zu viel Text wird.)

    Jedenfalls konnte ich die tag.lib-Datei nun beim Linker zu meinem Projekt hinzufügen. tag.lib und tag.dll liegen im Projektverzeichnis. Um das Projekt nun zu kompilieren, benötigte ich noch die includes:

    #include <tag.h>
    #include <fileref.h>
    

    sonst gibt es Errors ('TagLib': Keine Klasse oder Namespace, 'FileRef': nichtdeklarierter Bezeichner).

    So bekomme wird nun auch mein Projekt kompiliert - endlich! Die Warnings dabei lauteten jedoch ebenfalls:

    1>C:\Users\martin\Desktop\gen_WinampControlServer\gen_WinampControlServer\taglib\toolkit\tfile.h(48): warning C4251: 'TagLib::FileName::m_name': class 'std::basic_string<_Elem,_Traits,_Ax>' erfordert eine DLL-Schnittstelle, die von Clients von class 'TagLib::FileName' verwendet wird
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>,
    1>              _Ax=std::allocator<char>
    1>          ]
    1>C:\Users\martin\Desktop\gen_WinampControlServer\gen_WinampControlServer\taglib\toolkit\tfile.h(49): warning C4251: 'TagLib::FileName::m_wname': class 'std::basic_string<_Elem,_Traits,_Ax>' erfordert eine DLL-Schnittstelle, die von Clients von class 'TagLib::FileName' verwendet wird
    1>          with
    1>          [
    1>              _Elem=wchar_t,
    1>              _Traits=std::char_traits<wchar_t>,
    1>              _Ax=std::allocator<wchar_t>
    1>          ]
    

    Bei den Warnings habe ich mir nichts gedacht und wollte es so benutzen. Das Projekt wird ebenfalls als DLL-Datei ausgegeben, da es ein Winamp-Plugin sein soll. Die erzeugte dll habe ich nun zusammen mit der tag.dll in das Verzeichnis Winamp\Plugins kopiert - doch Winamp will das Plugin einfach nicht laden. Erst wenn ich die Zeile

    TagLib::FileRef f(file);
    

    auskommentiere, wird das Plugin geladen :|

    Nunja, ich vermute mal, das liegt an den ganzen Warnings...oder habe ich schon wieder etwas anderes falsch gemacht?



  • std::string in einem dll-Interface zu haben ist schonmal grundsätzlich eine ganz schlechte Idee weil wieder Compilerspezifisch. Auch wenn du sowieso schon wegen der Klassenexport Sache an einen bestimmten Compiler gebunden bist, in dem Fall gehts sogar so weit dass der selbe Compiler (MSVC) bei nur unterschiedlichen Flags (Welche Runtime Library verwendet wird) schon verschiedene Implementierungen von std::string verwendet. Wenn die dll und exe nicht mit exakt der selben Runtime gebuildet werden dann wird das Ding dazu neigen bei der leichtesten Brise zu crashen...



  • @dot: Irgendwie ist das ein wenig am Ziel vorbei. Du magst recht haben mit den DLL Interfaces etc. aber er versucht meiner Ansicht nach nur eine bestehende Library zu verwenden.

    @Fragesteller:
    Ich nehme an es handelt sich um die TagLib Library:
    http://developer.kde.org/~wheeler/taglib.html

    Sind da für Windows nicht Bsp. drin?

    Simon



  • theta schrieb:

    @dot: Irgendwie ist das ein wenig am Ziel vorbei. Du magst recht haben mit den DLL Interfaces etc. aber er versucht meiner Ansicht nach nur eine bestehende Library zu verwenden.

    Das ist mir klar, ich hab ihm ja nur erklärt wo es dabei Probleme gibt und wie sie zu Lösen sind und ihm davon abgeraten sowas mal selbst zu machen...



  • vielen Dank euch beiden! Also, ich kann mit der tag.lib und tag.dll die Beispieldateien von taglib einwandfrei kompilieren und ausführen 🙂 Nur ein Problem habe ich noch...undzwar will Winamp mein Plugin einfach nicht laden...

    Wenn ich mein Projekt nicht als DLL, sondern als EXE (mit einer standart main-Funktion) ausgeben lasse und diese ausführe, läuft alles wunderbar, der Tag einer Testdatei wird gelesen und ich kann ihn ausgeben lassen.

    Nur wenn ich das Projekt als DLL ausgeben lasse und diese (zusammen mit der tag.dll und zlib1.dll) in das Plugins-Verzeichnis von Winamp kopiere, läd Winamp es einfach nicht. Es gibt keine Fehlermeldung o. Ä., das Plugin wird auch nicht in den Einstellungen angezeigt. Kommentiere ich die Zeile

    TagLib::FileRef f(file);
    

    aus, wird das Plugin wieder geladen...

    Hängt das jetzt auch mit std::string zusammen? Als EXE läuft es, als DLL nicht? oO

    Frohe Weihnachten!
    Martin

    EDIT: wieso wird hier das Wort "standard" mit t hinten zensiert? oO



  • okay, ich habe die Lösung gefunden. tag.dll und zlib1.dll müssen im Winamp-Verzeichnis sein, nicht in Winamp\Plugins. Nunja ich habe dem Linker jedoch nur mitgeteilt, dass er tag.lib und zlib.lib benutzen soll...keine Rede von den dll-Dateien. Kann man dieses Verhalten mit einer Linker-Option ändern, die ich nicht gefunden habe?

    Martin



  • Lädt er es wirklich nicht oder startet er es nur nicht weil es irgendwo abstürzt? Probier mal in der DllMain eine MessageBox() zu machen oder so...

    inspire schrieb:

    EDIT: wieso wird hier das Wort "standard" mit t hinten zensiert? oO

    Weil es Standard heißt und der Fehler so oft gemacht wird dass es manche Leute stört 😉



  • Was für ein Verhalten genau willst du ändern? Die .lib Dateien sind in dem Fall Importlibs und die tun genau das: Einen Verweis auf die jeweilige dll in deiner exe machen.



  • Die MessageBox in der DllMain wird nur angezeigt, wenn tag.dll und zlib1.dll in \Winamp\ liegen, nicht in \Winamp\Plugins\...

    Ah, die Verbindung zwischen lib- und dll-Dateien hat mir gefehlt! Danke 🙂

    Ich meine folgendes Verhalten:
    Ich möchte die dll-Dateien in ein andere Verzeichnis legen, z.B. Winamp\Plugins\PluginABC\ und nicht einfach in das Winamp-Verzeichnis. Die libs einfach in einen Unterordner Plugins\PluginABC\ zu packen und dorthin zu linken hat geklappt, hatte jedoch nicht den gewünschten Erfolg - Winamp sucht die dlls immernoch im root-Verzeichnis.

    Morgen mache ich weiter, gute Nacht!



  • Wie gelinkt wird und wo die DLL sucht sind zwei verschiedene Themen.
    Lies doch einfach die Doku von Winamp wo der seine DLLs sucht.

    Simon

    Edit:
    BTW: Ich denke Du hast zwei Probleme (und mischt diese ev. noch). Einerseits gings um die verwendung der TagLib und andererseits um dein eigenes WinAmp Plugin in Form einer DLL. Jetzt sind wir beim zweiten Problem angelangt, wenn ich dich richtig verstehe. Also: Guck bei WinAMP in der Plugin SDK.



  • werde da mal schauen, vielen Dank für eure Hilfe!


Anmelden zum Antworten