Probleme mit Dll einbinden
-
Hallo Leute,
arbeite mit VS 2003. hab zwei Projekte eins Heist MyHeap welches eine cpp datei MyHeap hat:
#include <windows.h> extern "C" { __declspec(dllexport) int Add( int a, int b ) { return( a + b ); } __declspec(dllexport) int Multi( int a,int b ) { return a*b; } }
lässt sich kompiliere, eine "MyHeap.dll" wird erstellt.
Dann hab ich noch ein Projekt in dem ich die dll test nwill:
#include "stdafx.h" #include <stdio.h> int __declspec (dllimport) Add (int a, int b); int main(int argc, char* argv[]) { printf("Hallo Welt!\n%i", Add (1,2)); char c[256]; scanf ("aa %s", c); }
fehler:
TestHeap error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl Add(int,int)" (__imp_?Add@@YAHHH@Z) referenced in function _main
ich habe die MyHeap.lib in das projekt eingebunden.. die dll und libdatei ist im projekt verzeichnis...
1. wieso der Fehler?
2. Muss ich die dll noch registieren oder so?
3. Ist immer eine lib datei bei ner dll dabei?
-
zu 1. Ist das Testprojekt ein reines C-Projekt? Wenn nicht: extern "C" vergessen?
zu 2. Nein
zu 3. NeinMehr zu 3:
Die lib-Datei ist eine Importbibliothek, in der die einzelnen DLL-Funktionen als statische Funktionen existieren. Die machen aber nichts anderes als beim ersten Aufruf die DLL dynamisch nachzuladen und dann die geladene Funktion aufzurufen.
Das ganze macht es natürlich einfach, gerade im C-Umfeld DLLs zu erstellen und zu nutzen. Aber genauso wie es Sprachen gibt die nicht gegen statische Bibliotheken linken können, kommt natürlich auch der Fall vor dass keine Importbibliothek vorhanden ist (aus welchen Gründen auch immer). In diesem Fall musst Du die Bibliothek und die enthaltenen Funktionen mit LoadLibrary etc. laden, so wie es die Importbibliothek auch macht. Nur dass Dir dabei der Compiler die Arbeit bereits abgenommen hat.
-
ok danke, hat geklappt.. nun bin ich bischen weiter:
dll:static unsigned int iSize=0; static unsigned char* pHeap=NULL; extern "C" { __declspec(dllexport) bool AllocHeap(unsigned int iBytes) { iSize=iBytes; pHeap=(unsigned char*)malloc(iBytes); return (pHeap!=NULL) ? true : false; } __declspec(dllexport) unsigned char* GetHeap() { return pHeap; } __declspec(dllexport) int AllocateBytes() { return iSize; } __declspec(dllexport) void FreeHeap() { free(pHeap); pHeap=NULL; } }
und die anwendung:
extern "C" { bool __declspec (dllimport) AllocHeap(unsigned int iBytes); unsigned char* __declspec (dllimport) GetHeap(); void __declspec (dllimport) FreeHeap(); int __declspec (dllimport) AllocateBytes(); } int _tmain(int argc, _TCHAR* argv[]) { printf(" ALLOC HEAP %s\n", (AllocHeap(5000)) ? "yes" : "no" ); FreeHeap(); return 0; }
allerding kommt hier der fehler "Einsprungspunkt "AllocHeap kann nich gefundne werden" ...
-
Kommande zurück.. ahb die dll ins falsche Verzeichnis kopiert.. jetzt klappts;) danke
-
[klugscheisser]ich frage mich, was das mit ANSI C zu tun hat
[/klugscheisser]