Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C (alle ISO-Standards) ::  win32 dll / wie returne ich einen string ?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Jakub
Unregistrierter




Beitrag Jakub Unregistrierter 00:13:26 21.04.2017   Titel:   win32 dll / wie returne ich einen string ?            Zitieren

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:

C:
1
2
3
4
5
6
7
8
9
10
#define MEINTEST extern "C" __declspec(dllexport)
 
 
MEINTEST double cube(double n)
{
 
 
    return n*n*n;
 
}


So sollte es doch eigentlich klappen oder? :confused:

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

C++:
MEINTEST char* myfunc()
{
char* ptr = "Eine kurze Zeichenkette" ;
 
   return ptr;
}
dachschaden
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2014
Beiträge: 1267
Beitrag dachschaden Mitglied 01:30:28 21.04.2017   Titel:              Zitieren

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:

C:
#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.

_________________
"'Das habe ich getan' sagt mein Gedächtnis. Das kann ich nicht getan haben - sagt mein Stolz und bleibt unerbittlich. Endlich - gibt das Gedächtnis nach." - Friedrich Nietzsche
The only valid measurement of code quality: WTFs/minute
c-guru
Unregistrierter




Beitrag c-guru Unregistrierter 21:57:56 22.04.2017   Titel:   Re: win32 dll / wie returne ich einen string ?            Zitieren

Jakub schrieb:

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

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


gibt ne lokale variable zurück. sieht ziemlich falsch aus.
probier dies:
C++:
char* myfunc()
{
   return "Eine kurze Zeichenkette";
}
[/quote]
dachschaden
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2014
Beiträge: 1267
Beitrag dachschaden Mitglied 22:18:28 22.04.2017   Titel:   Re: win32 dll / wie returne ich einen string ?            Zitieren

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.

_________________
"'Das habe ich getan' sagt mein Gedächtnis. Das kann ich nicht getan haben - sagt mein Stolz und bleibt unerbittlich. Endlich - gibt das Gedächtnis nach." - Friedrich Nietzsche
The only valid measurement of code quality: WTFs/minute


Zuletzt bearbeitet von dachschaden am 22:19:40 22.04.2017, insgesamt 1-mal bearbeitet
mgaeckler
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.07.2010
Beiträge: 849
Beitrag mgaeckler Mitglied 01:30:01 23.04.2017   Titel:   Re: win32 dll / wie returne ich einen string ?            Zitieren

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

_________________
Borland C++ 5.02, C++ Builder 5 Enterprise, g++ (Linux/Mac OS X), XCode
c-guru
Unregistrierter




Beitrag c-guru Unregistrierter 06:44:04 23.04.2017   Titel:   Re: win32 dll / wie returne ich einen string ?            Zitieren

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.
dachschaden
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2014
Beiträge: 1267
Beitrag dachschaden Mitglied 08:56:16 23.04.2017   Titel:   Re: win32 dll / wie returne ich einen string ?            Zitieren

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.

_________________
"'Das habe ich getan' sagt mein Gedächtnis. Das kann ich nicht getan haben - sagt mein Stolz und bleibt unerbittlich. Endlich - gibt das Gedächtnis nach." - Friedrich Nietzsche
The only valid measurement of code quality: WTFs/minute
Belli
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 2634
Beitrag Belli Mitglied 10:31:46 24.04.2017   Titel:   Re: win32 dll / wie returne ich einen string ?            Zitieren

[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.
C++ Forum :: C (alle ISO-Standards) ::  win32 dll / wie returne ich einen string ?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.