Fatal Error *.lib could not locate "IrgendeineFunktion"
-
Hallo,
ich habe ein Interface programmiert, welches mir Kameras verschiedener Hersteller steuert. Das ganze ist so aufgebaut, dass es eine abstrakte Klasse gibt und ein Interfacepointer-Array, welches die Adressen der Herstellerklassen beinhaltet. Ich habe zusätzlich eine Lib-Datei einbinden müssen. Früher hatte ich eine schlechtere Architektur (sprich für jede Kamera eine SDK Klasse (das ist gleich geblieben), aber viele switch-case auswertungen welche Klasse angesprochen werden soll). Die Architektur mit der abstrakten Klasse gefällt mir rein programmatisch viel besser, aber seitdem kann ich eine Funktion der eingebundenen Lib-Datei nicht mehr ansprechen bzw. wird die Lib-Datei nicht mehr erkannt. Kann dies auf die neue Architektur zurückzuführen sein? Wie gesagt früher hat dies funktioniert, aber mein Code wurde schnell unübersichtlich. Es sei noch dazugesagt das dieses Interface als DLL kompiliert wird und von der Hauptapplikation aufgerufen.

-
Kannst du das Problem auf ein hier postbares Beispiel reduzieren? - Das sollte nicht all zu schwer sein, nachdem, wie das klingt.:)
-
drakon schrieb:
Kannst du das Problem auf ein hier postbares Beispiel reduzieren? - Das sollte nicht all zu schwer sein, nachdem, wie das klingt.:)
Ok ich versuche es mal aus dem Kopf zu reduzieren, da ich mom kein Zugriff auf das Projekt habe.
Abstrakte Klasse:
class cam_interface { public: Abstract_Cam_Interface(); virtual ~Abstract_Cam_Interface(); virtual int Connect()= 0; }Kamaeraklasse:
class Kamera : public virtual cam_interface { private: Cam_DLL_Fcts FctAddr; // Struktur für die Einsprungadressen. public: // Auf Konstruktor und Destruktor habe ich fürs Forum verzichtet. int Connect(); NumericArrayResize // Dient der Allokierung eines LabVIEW Arrays. }Zugehörige CPP:
int Kamera::Connect() { HINSTLIB Lib = LoadLibrary("cam.dll") if(Lib) { Kamera::FctAddr.GetSources = (irb_GetSources)GetProcAddress(Lib, "cam_GetSources"); Kamera::FctAddr.InitSource = (irb_InitSource)GetProcAddress(Lib, "cam_InitSource"); Kamera::FctAddr.CloseSource = (irb_CloseSource)GetProcAddress(Lib, "cam_CloseSource"); Kamera::FctAddr.Grab = (irb_Grab)GetProcAddress(Lib, "cam_Grab"); } this->GetFctAddr().GetSources(&SrcID); // Adresse auf Variable welche mit der SourceID beschrieben wird. this->InitSource(SrcID); // Verbindungsaufbau mit der Quelle. TD1Hdl LVMem = NULL; // Struktur wurde vorher angelegt. this->NumericArrayResize(uW, 1L, SizeX*SizeY); // SizeX SizeY entspricht der Kameraauflösung. (*LVMem)->DimSize = SizeX*SizeY; _beginthreadex(/*Übergabeparameter weiss ich nicht mehr genau*/ this...); return 0; } // Der Datenaufnahmethread der oben gestartet wird. unsigned __stdcall Dataaquisition( void *pthis ) { while(repeat){ static_cast<Kamera*>(pthis)->Grab(&buf); MoveBlock(buf, &LVMem.Elements, sizeof(unsigned short int) * SizeX * SizeY) PostLVUserEvent(Ref, &LVMem); // Ref wurde vorher von LV Übergeben. /* PostLVUserEvent ist die Funktion welche den Fehler auslöst. Diese Funktion ist innerhalb der LabVIEW.lib definiert. */ } return NoError; }DLL Main:
extern "C" __declspec(dllexport) int Connect() { Kamera Cam; // Objekt der Klasse erzeugen. Abstract_Cam_Interface *Interface = &Cam; // Interfacepointer anlegen. return Interface->Connect(); // Funktion ausführen. }So ich hoffe ich habe an alles gedacht.