Klasse aus dll holen ohne lib
-
Hallo zusammen,
ich hab ein etwas größeres problem und hoffe mir kann jemand helfen.
also ich hab eine Hardware, bei der Hardware liegen dlls und libs und header dabei.
Problem ist das die Lib datei nicht für borland ist. (coff fehler). alles umwandeln der datei hat nichts geholfen.
Aber mir ist etwas eingefallen. Und zwar hat mir mal jemand geholfen eine funktion aus einer dll zu holen ohne über die lib zu gehen.
das ganze sah dabei etwa so aus:
int BPM_Create(void) { HINSTANCE hInstance; typedef int (DLLFUNCTION1)(void); DLLFUNCTION1 *pDllFunction1; hInstance = ::LoadLibrary("bpmDetect.dll"); pDllFunction1 = (DLLFUNCTION1*)::GetProcAddress((HMODULE)hInstance, "BPM_Create"); int result; if(pDllFunction1) result= (*pDllFunction1)(); return result; };ich glaub dazu schwirrt auch noch irgendwo ein Thema davon im Forum rum.
naja, das hatte dabei auf jedenfall funktioniert.
jetzt die frage ob das ganze auch mit klassen geht und wie das ganze dann aussehen muss?!?!
also in der h datei ist zur zeit folgende klasse gegeben:
class EXPORTED Bench : public BaseJavaClass { public: Bench(); JString getFilterWavelength(); void setFilterWavelength(JString& value); JString getSlitSize(); void setSlitSize(JString& value); JString getGrating(); void setGrating(JString& value); ~Bench(); // No public Java copy constructor; creating one: Bench(const Bench &that); // Creating assignment operator Bench &operator=(const Bench &that); private: jmethodID mid_Bench729; jmethodID mid_getFilterWavelength730; jmethodID mid_setFilterWavelength731; jmethodID mid_getSlitSize732; jmethodID mid_setSlitSize733; jmethodID mid_getGrating734; jmethodID mid_setGrating735; void init_ids(); };wie bekomm ich die jetzt aus der DLL??
Ich will hoffen das mir dabei einer helfen kann !!!

-
Hallo
Nein Klassen können nicht dynamisch aus DLLs geladen werden, nur rein statische Funktionen. Überhaupt wirst du eine fremde Klassen-DLL nur sauber verwenden können wenn die DLL auch mit dem exakt gleichem Borland-Compiler erstellt wurden, denn das macht mangels Standard jeder Compiler auf seine Art.
bis bald
akari
-
Der Import bzw. Export/von Klassen ist möglich indem eine statische Funktion eine Instanz jener Klasse erstellt und diese dann weiterleitet.
Vielleicht hilft dir folgender Beispielcode:
#define EXPORT_DLL // beim importieren auskommentieren.. #ifdef EXPORT_DLL # define DLL_ACCESS __declspec (dllexport) #else # define DLL_ACCESS __declspec (dllimport) #endif class DLL_ACCESS Test { public: // verwendete methoden muessen als virtual deklariert werden virtual int GetValue(); }; extern "C" __declspec (dllexport) Test* CreateInstance();-----
Source:
#include "Test.h" extern "C" DLL_ACCESS Test* CreateInstance() { return (new Test); } int Test::GetValue() { return 23; }-----
Importvorgang:
#include <Windows.h> #include "../dll_export/Test.h" int main() { HINSTANCE hInstance = ::LoadLibrary("dll_export.dll"); typedef Test* (*DLL_Func)(); DLL_Func pFunc = (DLL_Func)GetProcAddress((HMODULE)hInstance, "CreateInstance"); Test * test = (*pFunc)(); int check = test->GetValue(); return 0; }----
Viel Erfolg !

-
Hallo
@ apollux :
Deine Lösung beseitigt aber nicht das eigentliche Problem : Das Klassen von jedem Compiler unterschiedlich verwaltet werden. Das von dir gezeigte dynamische Erstellen von Instanzen ist nur dann korrekt wenn DLL und Programm mit dem selben Compiler kompiliert wurden. Und in diesem Fall kann man die DLL auch gleich statisch linken, ohne Umweg über eine CreateInstanz-Funktion.bis bald
akari