bigpoint Geschrieben 14. Februar 2003 Geschrieben 14. Februar 2003 Ich habe eine funktion in eine Header die will ich abrufen so: CNameApp name name.init_benutzer(); kriege ich Fehler error LNK2001: Nichtaufgeloestes externes Symbol was muss ich machen damit es funk ???? Zitieren
Guybrush Threepwood Geschrieben 14. Februar 2003 Geschrieben 14. Februar 2003 Hi, ich gehe mal davon aus das die Funktion in der Headerdatei deklariert ist und sich die Definition in einer DLL Datei befindet. Wenn das so ist, dann bedeutet der Fehler das der Linker die Funktion in den Angegebenen .Lib Dateien nicht finden kann. Du mußt also einfach dem Linker noch die entsprechende Lib Datei angeben. EDIT: Die Boardsuche hätte dir übrigens auch geholfen;) Gruß Guybrush Zitieren
bigpoint Geschrieben 14. Februar 2003 Autor Geschrieben 14. Februar 2003 Originally posted by Guybrush Threepwood Hi, ich gehe mal davon aus das die Funktion in der Headerdatei deklariert ist und sich die Definition in einer DLL Datei befindet. Wenn das so ist, dann bedeutet der Fehler das der Linker die Funktion in den Angegebenen .Lib Dateien nicht finden kann. Du mußt also einfach dem Linker noch die entsprechende Lib Datei angeben. Gruß Guybrush Ne eigentlich ist es so, dass die Funktion sich in eine exe befindet und rufen will ich sie in eine DLL Zitieren
Klotzkopp Geschrieben 14. Februar 2003 Geschrieben 14. Februar 2003 Originally posted by 007ski Ne eigentlich ist es so, dass die Funktion sich in eine exe befindet und rufen will ich sie in eine DLL Das funktioniert so nicht, weil der Linker nicht weiß, wo in der Exe-Datei der Einsprungpunkt für diese Klasse/Funktion ist. Das lässt sich auch nicht zur Laufzeit auflösen. Das geht nur bei Aufrufen von EXE nach DLL. Außerdem ist es schlechtes Design, eine DLL von einer EXE abhängig zu machen. Das widerspricht ja der Absicht, die hinter DLLs steht. Du könntest aber in der DLL eine Funktion exportieren, mit der du einen Zeiger auf eine CNameApp-Instanz oder einen Funktionszeiger angeben kannst. Zitieren
bigpoint Geschrieben 14. Februar 2003 Autor Geschrieben 14. Februar 2003 Originally posted by Klotzkopp Du könntest aber in der DLL eine Funktion exportieren, mit der du einen Zeiger auf eine CNameApp-Instanz oder einen Funktionszeiger angeben kannst. Sorry aber es überschreibt meine Möglichkeiten, kannst Du bitte mit es mit code zeigen ;() PS Die DLL rufe ich aber dynamisch in exe auf Zitieren
Guybrush Threepwood Geschrieben 14. Februar 2003 Geschrieben 14. Februar 2003 Originally posted by 007ski Die DLL rufe ich aber dynamisch in exe auf Versteh ich das jetzt richtig? Die Exe ruft etwas in der DLL und die DLL etwas in der EXE auf? Zitieren
Klotzkopp Geschrieben 14. Februar 2003 Geschrieben 14. Februar 2003 Also, das mit einem Instanzzeiger geht nicht, weiß auch nicht, wie ich darauf gekommen bin. Aber mit einem Funktionszeiger gehts: In der EXE: void do_init_benutzer() { CNameApp name name.init_benutzer(); } // irgendwo am Anfang: // der DLL den Funktionszeiger übergeben. set_do_init_benutzer( do_init_benutzer ); In der DLL: // Funktionszeiger void(*fp_init_benutzer)(void); // exportierte Funktion zum Setzen des Funktionszeigers void __declspec(dllexport) set_do_init_benutzer_fp( void(*fp)(void) ) { fp_init_benutzer = fp; } Dann kannst du in der DLL mit fp_init_benutzer(); die Funktion in der EXE aufrufen. Zitieren
bigpoint Geschrieben 17. Februar 2003 Autor Geschrieben 17. Februar 2003 Originally posted by Guybrush Threepwood Versteh ich das jetzt richtig? Die Exe ruft etwas in der DLL und die DLL etwas in der EXE auf? ja richtig Zitieren
Guybrush Threepwood Geschrieben 17. Februar 2003 Geschrieben 17. Februar 2003 Originally posted by 007ski ja richtig Mal abgesehen davon das es offentsichtlich nicht ohne weiteres Möglich ist, ist das meiner Meinung nach absolut unsaubere Programmierung. Wenn die DLL auf Variablen in deiner Exe zugreifen soll, dann übergib sie doch einfach als Parameter an die DLL. Funktionen in deiner Exe solltest du eh nur in deiner Exe aufrufen. Gruß Guybrush Zitieren
bigpoint Geschrieben 17. Februar 2003 Autor Geschrieben 17. Februar 2003 Originally posted by Guybrush Threepwood Mal abgesehen davon das es offentsichtlich nicht ohne weiteres Möglich ist, ist das meiner Meinung nach absolut unsaubere Programmierung. ja richtig Originally posted by Guybrush Threepwood Wenn die DLL auf Variablen in deiner Exe zugreifen soll, dann übergib sie doch einfach als Parameter an die DLL. Funktionen in deiner Exe solltest du eh nur in deiner Exe aufrufen Sorry aber wie kann ich ein Parameter in meinem fall Cstring an die DLL übergeben Zitieren
bigpoint Geschrieben 17. Februar 2003 Autor Geschrieben 17. Februar 2003 Ich habe eine Funktion in DLL void xyDlg::getstr(CString &str) { } dann rufe ich in exe mit AfxLoadLibrary() die DLL Und mit GetProcAddress die Funktion und dann ..... Irgend wie fehlt mir Idee bitttttte um Hilfe !?!?!? Zitieren
Klotzkopp Geschrieben 17. Februar 2003 Geschrieben 17. Februar 2003 Originally posted by 007ski Ich habe eine Funktion in DLL void xyDlg::getstr(CString &str) { } dann rufe ich in exe mit AfxLoadLibrary() die DLL Und mit GetProcAddress die Funktion und dann .....Du kannst nichtstatische Member nur aufrufen, wenn Du in der Exe eine Instanz von xyDlg (oder einen Zeiger darauf) hast. Zitieren
bigpoint Geschrieben 17. Februar 2003 Autor Geschrieben 17. Februar 2003 Originally posted by Klotzkopp Du kannst nichtstatische Member nur aufrufen, wenn Du in der Exe eine Instanz von xyDlg (oder einen Zeiger darauf) hast. Also dass was Guybrush Threepwood gesagt hat stimmt nicht ? Zitieren
Klotzkopp Geschrieben 17. Februar 2003 Geschrieben 17. Februar 2003 Originally posted by 007ski Also dass was Guybrush Threepwood gesagt hat stimmt nicht ? Auf welche Aussage von Guybrush Threepwood beziehst du das? Soweit ich das sehe, hat er nichts falsches gesagt. Exportierst du denn überhaupt die Klasse xyDlg oder die Methode getstr? Wo wird die Instanz von xyDlg erzeugt? Zitieren
Guybrush Threepwood Geschrieben 17. Februar 2003 Geschrieben 17. Februar 2003 Originally posted by 007ski Also dass was Guybrush Threepwood gesagt hat stimmt nicht ? Doch:D, im allgemeinen schon. Nur das was du da versuchst ginge nur wenn du in deiner EXE das Objekt von deiner xyDLG Klasse erstellen würdest, oder du eben einen Zeiger darauf hättest. Zitieren
bigpoint Geschrieben 17. Februar 2003 Autor Geschrieben 17. Februar 2003 Originally posted by Guybrush Threepwood Doch:D, im allgemeinen schon. Nur das was du da versuchst ginge nur wenn du in deiner EXE das Objekt von deiner xyDLG Klasse erstellen würdest, oder du eben einen Zeiger darauf hättest. ok jetzt passt Danke Klotzkopp und Guybrush Threepwood Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.