DLL :: Problem mit Rückgabewert / Parameter
-
ich habe eine DLL erstellt, die ich in einem anderen programm lade.
die in der DLL exportierte funktion ist diese:
CString Create_CLine(CCLInfo cCCL)
'CCLInfo' ist ne struktur die ich gemacht habe.
auf jeden fall kommt diese fehlermeldung wenn die funktion ihren rückgabewert übergeben soll:
============================================
Debug Assertion Faild!BLA BLA
Exception: _CrtIsValidHeapPointer(pUserData)
es wohl damit zusammen, das ich einen CString zurück gebe. wenn ich einen BOOL - rückgabewert habe klappt es. ich habe auch schon versucht den rückgabewert über die parameter zurückzugeben (adresse an DLL - funktion übergeben) aber das geht auch nicht
-
Lösung: DLL und Anwendung müssen beide die C++ - Laufzeitbibliothek als DLL mit den gleichen Einstellungen reinladen (also Single/Mulitthreaded DLL Debug/-)
Ursache: Bein unterschiedlichen Einstellungen verwenden DLL und .EXE unterschieldiche CRT-Instanzen, und damit unterschiedliche Heaps. Dann gilt: Was die DLL alloziert, kann die EXE nicht freigeben (und umgekehrt).
-
aahh
werd's gleich mal testen, danke !!
-
Hat doch nicht geklappt
das hab ich gemacht:
- das MFC-Programm benutzt eine statisch verknüpfte MFC-bibliothek
- meine DLL ist eine Standart DLL mit verknüpfter MFC-bibliothekdas kann man ja so einstellen wenn man ein neues Projekt erstellt.
ich denke das ich das nicht so gemacht hab, wie du das meintest, oder ??
-
Nein
Die EXE mußt du auf MFC dynamisch setzen (damit wird auch die CRT dynamisch gelinkt, das ist gekoppelt)
Dann kannst du in der EXE nochmal abchecken: "Settings/C++/Code generation": sollte auf Multithreaded DLL (Release Build) bzw. Multithreaded DLL Debug (Debug Build)stehen.
Die DLL identisch einstellen.
-
aso, danke
kriege jetzt einen hauen unaufgelöster symbole vom compiler ausgespuckt, sorry.
die MSDN hat zwar viele lösungsansätze dazu, aber bis jetzt noch keinen der bei mir funkioniert. habe schon einige befehler in der konsole meines projektes eingegeben.hast du zufällig auch da eine lösung ??
*hoff, zitter*
-
Poste mal ein paar davon (oder alle wenn nicht zu viel).
bindest du Libs ein, die mit anderen Einstellungen übersetzt sind?
-
hier die fehler:
nafxcwd.lib(appcore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol ___argv
nafxcwd.lib(appcore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol ___argc
nafxcwd.lib(olelink.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __mbctype
nafxcwd.lib(dcmeta.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __mbctype
nafxcwd.lib(filelist.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __mbctype
nafxcwd.lib(timecore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __mbctype
nafxcwd.lib(apphelp.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __mbctype
nafxcwd.lib(oledlgs1.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __mbctype
Debug/DllTest.exe : fatal error LNK1120: 3 unaufgeloeste externe Verweiseich habe gar keine DLLs eingebunden. die kommen nur wenn ich das auf Multithreaded DLL stelle
-
ping mich mal bitte sonnabend wenn du nix gefunden hast wieder an. Stecke grad kopfüber in Assemblerscheiß und eher wird's nicht...
Ist alles Zeug, was aus Standardlibs kommen sollte. Entweder ein #define falsch, oder du hast mit den Bibliotheksimporten mist gemacht.
-
Habe mein meine DLL und meine EXE jetzt BEIDE so eingestellt:
Projekteinstellungen -> C/C++ -> Code Generation:
- Multithreaded DLL
Projekteinstellungen -> CAllgemein:
- Gemeinsahm genutzte DLL verwenden(habe auch von DLL und EXE eine debugversion erstellt)
konnte auch beides kompilieren, nur als die DLL den rückgabewert an meine exe zurückgeben soll ist das programm abgestürzt:
Der Vorgang "written" konnte auf dem speicher nicht durchgeführt werden
bin da etwas ratlos
-
habs doch hinbekommen, ich hatte da nen fehler in der funktionstypendefinition