Wie übergebe ich einen String in eine DLL?
-
Moin
In meinem Programm hab ich bis jetzt nur die "schlechte" Variante das ich die Stings in einer Ini Speicher und dann in der DLL wieder auslese. Da diese Variante nicht nur langsam ist sondern auch noch irgendwie umständlich ist, wollte ich halt Fragen ob jemand ne Idee hat ob und wie das geht.
Ich hab schon mal nach Themen gesucht bin aber nicht wirklich schlau draus geworden.
-
char-Zeiger sind da wohl die portabelste Methode....
-junix
-
Kannst du mir sagen was genau ich machen muss oder ein stück Quelltext zeigen?
-
Godspeed schrieb:
Kannst du mir sagen was genau ich machen muss oder ein stück Quelltext zeigen?
Äh du wirst doch wohl noch nen Funktionskopf zusammenkriegen der nen Char-Zeiger erwartet?!?
-junix
-
Hi,
für mich ist jetzt erstmal interessant, wie du die DLL lädst.
Wenn du sie implizit bindest, dann kannst du das so machen, wie du es auch bei "ganz normalen" Funktionen machst.
Wenn du explizit bindest, dann besteht der einzige Unterschied darin, dass du dir vorher ein Handle auf die Funktion holen musst. Dann kannst du allerdings es wieder genauso tun, wie beim impliziten Binden.//int myFunc (char *) int Res = myFunc ("Ein Spruch");
Maffe
@junix: Nur nochmal ein bisschen genauer erklärt.
-
Ich hab mich bei meiner Programm erstellung an das Tutorial http://bcb-tutorial.c-plusplus.net gehalten und lade die Dll Dynamisch, wenn du das meinst mit explizit. Hab mich gerade erst an das Thema Dll rangewagt und weiss nicht was ich alles ändern muss bei meinem Quelltext.
-
Ok, ich mal kurz reingeschaut. Du bindest explizit. Allerdings glaube ich nicht, dass das Problem jetzt bei deinen Kenntnissen über DLLs liegt, kleiner Tip setz dich nochmal mit C++ in Sachen Strings auseinander. (Ist nicht böse gemeint.)
Wenn du's so machst, wie im Tut, dann kannst du nach dem Abarbeiten von "GetProcAddress" mit dem Pointer genauso arbeiten, wie mit einem normalen Funktionsaufruf.
Ich hab mir angewöhnt zu jeder DLL, die ich schreibe, eine Funktion "Init" zu schreiben, in der ich dann alles übergebe, was ich aus der Anwendung brauche.
Hier ein kleines Beispiel.//DLL.cpp char DLLPipe_Name[100]; //globale Variablen char DLLEvent_Name[100]; int Init (char *Pipe_Name, char *Event_Name, int Modus) { sprintf (DLLPipe_Name, Pipe_Name); //Kopieren der Strings sprintf (DLLEvent_Name, Event_Name); .. .. }
//App.cpp int myFunc () { HINSTANCE hDLL = LoadLibrary ("DLL"); .. typedef int (*TInit) (char *, char*, int); TInit pInit = (TInit) GetProcAddress (hDLL, "_Init"); int Res = pInit ("\\\\.\\pipe\\myPipe", "DLLEvent", 1); .. .. }
Ich hoffe, das erklärt es jetzt ein bisschen. (Nicht ärgern, nobody is perfect! :))
Maffe
-
Danke für die Hilfe, werde es mal ausprobieren und nochmal ein bisschen mein wissen über Strings erweitern(hab wohl in der Schule nicht genug aufgepasst
)
-
hallo,
mach dir keine sorgen, bei diesem thema (strings an dll übergeben und andersrum) sind schon ganz andere leute wahnsinnig geworden, und die
idee mit der ini ist so stümperhaft auch wieder nicht. denn wenn du
mit ansistrings arbeiten willst musst du ja den ganzen müll (die borland-
zusatz-dlls wie im header beschrieben) einbinden. und das mit den char-
zeigern funktioniert schon, kann aber wieder andere probleme nach sich ziehen,
du musst einfach etwas herum experimentieren und die für dich (dein
prog) beste lösung herausfinden. wenn manchmal ganz sonderbare
dinge geschehen, scheue dich nicht, den pc mal neuzustarten, oder wenigstens
"xy abmelden", denn aus eigener erfahrung weiss ich, das code, der am
späten abend überhaupt nicht funktionierte, am näxten morgen wie von
geisterhand auf einmal perfekt ausgeführt wurde...mfg
murphy