000
08.07.2004, 12:19 Uhr
RHBaum
|
Hallo,
ALso ich braucht nen Tamplate, was ich mit nem String kann ...
Also sowas wie
Template:
C++: |
template<const char * const DLLName> class DLLHandler { };
|
Verwendung:
C++: |
typedef DLLHandler<"api.dll"> APIDLLHandler;
|
das geht natuerlich nicht .... 1. Ansatz einer Loesung ist .... Template:
C++: |
template<class NameClass> class DLLHandler { };
|
Verwendung:
C++: |
class APIName { public: inline static const char * Get_Name() { return "api.dll"; } }; typedef DLLHandler<APIName> APIDLLHandler;
|
Statt direct auf den namen greif ich dann auf die statische memberfunktion Zurueck. Das deklarieren der Name-Klasse ist mir aber noch zu umstaendlich !
Hintergrund: Ich brauch dynamischen zugriff auf Dlls, mit Proxy Handlern / Funktionspointern. Also sprich beim ersten gebrauch initialisieren, dann irgendwann mal wieder ungueltig machen (wenn programm ende)... in der Zwischenzeit sollen die handels / Zeiger ohne grossen Aufwand zugaenglich sein.
Statische Variablen als Handler und Funktionspointer bieten sich da grad zu an. Aber, ich brauch halt fuer jede DLL und jede funktion ne eigenen statische Member -> eigene Klassen (typisiertes Template). Die dll und die funktion werden aber spezifiziert durch die Namen = Strings ....
Im moment schreib ich die Proxyfunktionen immer noch per hand .... als Memberfunktionen einer Handlerklasse.
Header
C++: |
class APIDLLHandler {
int DllFunc(int i); private: HINSTANCE m_dll;
// dll FunktionsPointer typedef int (__stdcall T_pfDllFunc)(int i);
T_pfDllFunc * m_pfDllFunc; };
|
Rumpf
C++: |
int APIDLLHandler::DllFunc(int i) { int ireturn = 0; if(!m_pfDllFunc) { if(!m_dll) { // Handle mit LoadLibrary holen; } if(m_dll) { // Funktionspointer mit GetProcAdress Holen; } } if(m_pfDllFunc) { ireturn = (*m_pfDllFunc)(i); } return ireturn; }
|
Das will ich irgendwie vereinfachen, generalisieren, so das die ganzen schritte automatsich gemacht werden, man nur in irgend einer Form die Funktionen samt parameter als Template Klassen defienieren soll ....
so in der Art:
C++: |
typedef DLLHandler<"api.dll"> APIDLLHandler;
typedef DLLFuncHandlerP1R<DLLHandler,"dllfunc",int,int,0> dllfunc; // (P1R steht fuer 1 Paramater, mit rueckagebewert)
int ireturn = dllfunc::execute(5);
|
; Was natuerlich auf grund der Strings ned geht.
Fuer jede DLL funktion ne eigene NamensKlasse generieren ... macht die sache imho unuebersichtlich .... Ich koennt die Namensklasse natrulich durch nen Makro generieren lassen ... find ich aber unelegant.
Hat wer ne idee wie man das hinbekommen koennte ... .oder grundsaetzlich ne andere vorgehensweise besser ? Das ganze soll unter VC++ 6.0 laufen ....
Ciao ... Dieser Post wurde am 08.07.2004 um 12:26 Uhr von RHBaum editiert. |