Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » template mit String typisieren kann...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2004, 12:40 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich habe noch nicht verstanden, warum es unbedingt Templates sein müssen?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2004, 13:16 Uhr
RHBaum



Es muessen nicht unbedingt Templates sein ....

Das einzige was ich will ... Typsicher -> die dll funktion muss mit allen Parametern deklariert sein ....

Holen der Handles / pointer erst bei bedarf ....

wegfall des manuellen schreibens der Poxy Funktionen, und wegfall des explitzieten Initialisierens der FunktionsPointer. (soll automatisch mit der deklaration gehen)

Am ende will ich einfach die Funktion 1 mal definieren ... und dann irgendwo benutzen.

Ausser makros und templates viel mir nix ein ....

Ne andere variante waere vielleicht, Nen programm zu schreiben, was die dll scannt, und ne proxyklasse fuer erzeugt .... das waer auch noch machbar ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.07.2004, 14:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Also für den DLLHandler sehe ich erstmal wirklich keinen Grund, das Ding in einem Template zu fassen, da genügt dann ja eine einfache Klasse.

Was die Funktionsadaptoren angeht, so würde ich hier mit einer Komnination aus Vererbung und Template arbeiten:

C++:
class DllFunctionHandler
{
protected:
    // Hier alle Methoden rein, die dazu erforderlich sind, einen untypisierten entry Point aus einer DLL zu laden

    void* getUntypedEntryPoint() { ... };
private:
     DLLHandler& m_roDLL;
     const char* m_szFunctionName;
     void* m_pfnEntryPoint;

public:
    DllFunctionHandler(DLLHandler&, const char* p_szFunctionName);
};
...
// Template für 1 Parameter functionen:
template<typename RET_TYPE, typename PARAM_TYPE1>
class DllFunctionHandlerP1: public DllFunctionHandler
{
public:
    typedef RET_TYPE (*function_t)(PARAM_TYPE1);

    DllFunctionHandlerP1(DLLHandler& p_roDLLHandler, const char*, p_szFunctionName)
     :DllFunctionHandler(p_roDLLHandler, p_szFunctionName) {}

   function_t getEntryPoint() const { return reinterpret_cast<function_t>(getUntypedEntryPoint()); }

   RET_TYPE operator() (PARAM_TYPE1 p1)  { return getEntryPoint()(p1); }
  
};


Die Idee dürfte klar sein. Übrigens kannst Du bei einem Standardkonformen Kompiler auch als RET_TYPE problemlos "void" angeben. VC 6 weiß ich nicht.
Natürlich kannst Du auch auf die Basisklasse verzichten, aber das multipliziert unnötig Code.
Alles ungetestet.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.07.2004 um 14:31 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.07.2004, 15:23 Uhr
RHBaum



Hmmm, gute idee das so ueber den untypisierten funktionspointer auszulagern ...

die Rückebeunterscheidung brauch ich .... weil die DLL nicht existieren muss. Also wenn er die FUnktionspointer nicht bekommt, darf er zumindest bei einigen funktionen keine exception werfen, sondern muss nen vorher definierten wert zurueckgeben ... keinen unitialisierten ....
DIe funktionen sollen aber so aufrubar sein, als wuerd man die dll funktion direkt aufrufen ... also den rueckewert in die Parameterliste verschieben und generell nen errorwert zurueckgeben wollt ich ned machen ....

Ich bau mal noch etwas dranrum ....

Danke,

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2004, 15:43 Uhr
RHBaum



Das was mir noch ned gefaellt:

Erzeug ich die klassen lokal, direkt vorm aufruf, hab ich immer nen unterschiedlichen Funktionspointer wenn ich die funktion an mehrere stellen aufrufe ... waere aber auch besser wenn ich die deklaration zentral habe.

deklariere ich die klassen zentral in meiner Mutterklasse, muss ich die Klassen im header deklarieren, und in der initialisierungsliste an ner anderen stelle initialisieren ... und an ner 3. stelle benutz ich sie dan ....
Grade das initialisieren wollt ich mir sparen ... (deswegen auch die idee mit template mit string spezialiesierung) .... weil das oftmals der fehler bei meinen selbstgeschrieben Proxies gewesen ist, das ich das vergessen hab und mit nem uninitialisierten zeiger reingegangen bin ... naja, so wird die initialisation wenigstens erzwungen ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.07.2004, 16:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm, also da ich bereits erfolgreich Funktionspointer als Templateparameter verwenden konnte, habe ich mir gedacht, daß man vielleicht doch was drehen kann mit Strings als Templateparametern.
Das ist das Resultat:

C++:
#include <iostream>

template<const char* DLL>
class DLLAccessor
{
public:
    const char* getName() const
    {
        return DLL;
    }
};

extern const char apiname[] = "api.dll";

int main()
{
    DLLAccessor<apiname> APIAccessor;


    std::cout<<APIAccessor.getName()<<std::endl;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.07.2004, 10:10 Uhr
RHBaum



Hmmm, genau das ist mein problem :

wenn ich die als extern const char * definierte Konstante als template parameter angebe, mault der compiler bei mir mit:
error C2975: 'DllHandler' : Ungueltiges Vorlagenargument für 'DLLName', konstanter Ausdruck erwartet

Vc++ Problem, oder hab ich noch was falsch ?

C++:
template<const char* DLLName>
class DllHandler
{
private:
    // vonn der Klasse soll eh keiner Instanzen erstellen
    // also Konstruktion und destruktion private:
    DllHandler(){};
    ~DllHandler(){};
public:
    // Handle auf die Lib holen ....
    inline static HINSTANCE getHandle()
    {
        // Zugriff auf das Handle ....
        if(!m_HLib)
        {
            m_HLib = ::LoadLibrary(DLLName);
        }
        return m_HLib;
    };
    inline static FreeLib()
    {
        if(m_HLib)
        {
            ::FreeLibrary(m_HLib);
            m_HLib = NULL;
        }
    };
private:
    static HINSTANCE    m_HLib;
};

template<const char* DLLName>
HINSTANCE DllHandler<DLLName>::m_HLib = NULL;





C++:

extern const char DLLName[] = "vxlapi.dll";

class VectorXLDriverHandler  
{
// Definition fuer die DLL
private:
    /*
    class DLLNAME
    {
    public:
        static inline const char * getName(){ return "vxlapi"; };
    };
    */

    typedef bar_dll::DllHandler<DLLName> VectorDll;

// hier noch ne menge mehr
};



Frage am Rande:
Warum machst die getName Funktion ned static ? Braucht doch keine Members, so braucht man auch ned Instanziieren wenn man sie braucht. Glaub das sollte etwas schneller sein dann ..

Ciao ...

Dieser Post wurde am 09.07.2004 um 10:13 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: