win32 dll / wie returne ich einen string ?



  • Hallo zusammen, ich bitte um Entschuldigung für meine Anfängerfrage,
    aber ich finde keine gute Erklärung und hoffe ihr könnt mir helfen.

    Ich habe eine Win32 Anwendung als dynamische DLL erstellt.
    Darin kann ich bereits folgende Funktion bereitstellen und auch extern
    nutzen:

    #define MEINTEST extern "C" __declspec(dllexport)
    
    MEINTEST double cube(double n)
    {
    
    	return n*n*n;
    
    }
    

    So sollte es doch eigentlich klappen oder? 😕

    Nun habe ich gehofft ich kann auch einen string ausgeben, scheiter aber
    immer daran, dass ich keinen Text zurück bekomme.

    MEINTEST char* myfunc()
    {
    char* ptr = "Eine kurze Zeichenkette" ;
    
       return ptr;
    }
    


  • Jakub schrieb:

    Hallo zusammen, ich bitte um Entschuldigung für meine Anfängerfrage,
    aber ich finde keine gute Erklärung und hoffe ihr könnt mir helfen.

    Du weißt ja nicht einmal, welche Sprache du benutzt. C? Oder doch C++? Wenn nur C, wieso dann das extern "C" ?

    Davon abhängig ist auch, was deine Funktionen als Parameter so erwarten. In C ist (void) kein Parameter, und () sind variabel viele. In C++ ist () keine Parameter, und (...) sind variabel viele.

    Zugegebenermaßen bekommen viele angebliche C-Programmierer das falsch auf die Kette, zumindest, wenn ich nach "C variable arguments" google - überall findest du int main() anstelle von int main(void) und solche Späße. Von daher kann ich deine Verwirrung verstehen.

    Zweitens - und das hat nichts mit C oder C++ zu tun, sondern mit der Art und Weise, wie Microsoft DLL-Linkage verlangt - muss sich dein MEINTEST ändern, je nachdem, ob du die Bibliothek jetzt baust, oder ob du sie kompilierst. Der Standardweg ist, in den Projekteinstellungen (ich gehe davon aus, dass du Visual Studio verwendest) einen Präprozessormarker zu definieren, welches nur dann verfügbar ist, wenn die Bibliothek kompiliert wird.

    Dann definierst du MEINTEST folgendermaßen:

    #if defined(PROJEKTEINSTELLUNGSMARKER)
    #   define MEINTEST extern "C" __declspec(dllexport)
    #else
    #   define MEINTEST extern "C" __declspec(dllimport)
    #endif
    

    Denn für den Code, der deine Bibliothek nutzen will, musst du sagen, dass das Symbol importiert und nicht exportiert werden soll.

    Und deine Funktion sollte auch besser tatsächlich in die DLL eingefügt worden sein. Sprich, dabei sollte es sich nicht um eine ganze Funktion in einem Header handeln. Sonst kommst du sehr schnell in das Territorium der doppelt definierten Symbole und der Linkerfehlermeldungen.

    Generell empfehle ich dir, noch mal nachzulesen, wie man DLLs unter Windows schreibt und baut. Das hat weder direkt was mit C/C++ zu tun, noch will hier irgendjemand nur das wiederholen, was MS bereits zu diesen Thema an Dokumentation veröffentlicht hat. Siehe auch.



  • Jakub schrieb:

    Nun habe ich gehofft ich kann auch einen string ausgeben, scheiter aber
    immer daran, dass ich keinen Text zurück bekomme.

    MEINTEST char* myfunc()
    {
    char* ptr = "Eine kurze Zeichenkette" ;
    
       return ptr;
    }
    

    gibt ne lokale variable zurück. sieht ziemlich falsch aus.
    probier dies:

    char* myfunc()
    {
       return "Eine kurze Zeichenkette";
    }
    

    [/quote]



  • c-guru schrieb:

    gibt ne lokale variable zurück. sieht ziemlich falsch aus.

    Schwachsinn. Es handelt sich hier lediglich um einen lokalen Zeiger auf einen String im statischen Segment, und der wird mit Funktionsrückkehr nicht ungültig. Schließlich wird die Adresse bei der Rückkehr eh kopiert - sonst könnte man überhaupt keine Rückgabe machen.

    Was anderes wäre es gewesen, wenn der OP den String in ein Array packt und dieses zurückgibt. Dann befinden sich die Daten auf dem Stack statt im statischen Segment, und dieser wird mit Funktionsrückkehr ungültig. Typischer Fall von "Hat den Unterschied zwischen Zeiger und Array nicht verstanden".

    Wenn du keine Ahnung hast, dann schreib doch bitte einfach gar nichts, OK? Sonst muss man dich korrigieren, und dann besteht noch die große Chance, dass du die Kritik persönlich nimmst und das ganze in unnötigem Drama endet.



  • dachschaden schrieb:

    c-guru schrieb:

    gibt ne lokale variable zurück. sieht ziemlich falsch aus.

    Wenn du keine Ahnung hast, dann schreib doch bitte einfach gar nichts, OK? Sonst muss man dich korrigieren, und dann besteht noch die große Chance, dass du die Kritik persönlich nimmst und das ganze in unnötigem Drama endet.

    Besonders peinlich wird es, wenn man sich c-guru nennt. Selten so gelacht.
    VG Martin



  • dachschaden schrieb:

    c-guru schrieb:

    gibt ne lokale variable zurück. sieht ziemlich falsch aus.

    Schwachsinn. Es handelt sich hier lediglich um einen lokalen Zeiger auf einen String im statischen Segment, und der wird mit Funktionsrückkehr nicht ungültig.

    sowas habe ich mir schon gedacht. folglich muss sein problem anderswo liegen.

    nebenbei: du schreibst zu viele worte um sachverhalte zu beschreiben. bitte optimieren.



  • c-guru schrieb:

    sowas habe ich mir schon gedacht. folglich muss sein problem anderswo liegen.

    Nein, hast du nicht. Leute schreiben in der Regel, was sie denken. Und du hast nur Blödsinn geschrieben.

    c-guru schrieb:

    nebenbei: du schreibst zu viele worte um sachverhalte zu beschreiben. bitte optimieren.

    Nebenbei: du verschwendest nur deine Zeit und die der anderen Leser. Bitte optimieren (Blacklisting der Domain, Kündigung des ISP-Vertrages oder Selbstentleibung, was, bleibt dir überlassen).

    @Moderation: ist das ein Fall von swapper/Andromeda? Der Nutzer füllt mein Bullshitmeter erstaunlich schnell.



  • [quote="dachschaden"]

    c-guru schrieb:

    ... Leute schreiben in der Regel, was sie denken.
    ...

    Ach, wäre das schön. In der Regel ist das, was Leute denken, was anderes, als das, was sie schreiben oder sagen ... ist zumindest meine Erfahrung.