Plugin Framework



  • Hallo erstmal,

    So habe auf CodeGure nen schönen Artikel gefunden für nen Plugin-Framework

    http://www.codeguru.com/Cpp/misc/misc/plug-insadd-ins/article.php/c3879/

    genau so etwas einfaches hab ich für meinen webserver gesucht.

    so eingebaut bekomme ich das auch.

    es geht um folgenden code

    void CPluginDriverDlg::OnLoad()
    {
      char filepath[MAX_PATH];
    
      //who are we really? Get the Exe Path
      GetModuleFileName(AfxGetApp()->m_hInstance,filepath,
    MAX_PATH-1);
      SetCurrentDirectory(ExtractFilePath(filepath));
      CFileFind finder;
      CString strWildCard = _T("*.plx"); //look for the
    plugin files
    
      //call this to set up the finder to iterate through all
      //the plugins
      BOOL bWorking = finder.FindFile(strWildCard);
      while (bWorking)
      {
        //have to call
    FindNextFile() before GetFileName() or GetFilePath()
        //because FindFile just sets the object up and returns
        //true if _ANY_ files were found
        bWorking = finder.FindNextFile();
    
        HMODULE hm = LoadLibrary(finder.GetFilePath());
        if ( !hm )
        {
          MessageBox("couldn't load");
        }
        else
        {    //loaded OK, so add each library's HMODULE to an array.
          //m_dwa is an MFC CDWordArray
          m_dwa.Add((DWORD)hm);
        }
      }
    }
    

    und zwar ganz am ende geschieht ja folgendes

    {    //loaded OK, so add each library's HMODULE to an array.
          //m_dwa is an MFC CDWordArray
          m_dwa.Add((DWORD)hm);
    

    mein problem ich möchte ja eine funktion realisieren das wenn ne abfrage an den server kommt und ne datei nicht vorhanden ist soller irgendwie nachschauen obs fürs verzeichniss ne dll gibt als beispiel

    /FORUM/ViewTopic.html?t=30

    so nun möchte ich das nachschaut ob für Forum nen eintrag mit dll existiert und danach die dll aufruft und ihr eben den pfad übergibt

    nur nütz es mir nichts das er das einfach in das CDWordArray schmeisst da ich keinen bezug zu nem suchstring herstellen kann da der standpunkt im CDWordArray ja sich schon durch einfügen einer dll ändert

    und der aufruf wie er in dem beispiel ist nütz mir ja nichts

    for(int i=0; i<m_dwa.GetSize() ; i++)
      {
      //Find a function and use it
        PFUNC pFunc = (PFUNC)GetProcAddress(
        (HINSTANCE)m_dwa.GetAt(i), _T("fnPlug1"));
        if (pFunc != NULL)
        {
          int n = pFunc();
          CString answer ;
          answer.Format("The answer is %d", n);
          MessageBox(answer);
        }
    

    wie kann man die letzte funktion abändern das ich die eintrage in folgender art und weise habe z.b. wie ein map

    Forum = HMODULE von Forum.dll
    Gästebuch = HMODULE von Gästebuch.dll

    vielleicht hat ja jemand ne idee wie man das dort hinbekommt am besten wäre natürlich das der dateiname für den ersten eintrag genommen wird.



  • Hm.
    Was genau war jetzt dein Problem? Du bsit doch schon selbst auf die Lösung gekommen: eine Map.

    Du könntest beispielsweise ein std::map verwenden.



  • Jede DLL muss eine Funktion bereitstellen die den Typ zurückgibt.



  • ist ja schonmal schön zu wissen das sdt::map noch gibt habe vor einigen wochen gewechselt von DEV C ++ nach Visual Studio nun gehen ja einige sachen nicht mehr z.b. sdt::string womit ich in meinen funktionen die ganze Zeit gearbeitet habe oder auch das makro ISDIR bzw bei ms heissts IFDIR

    im original habe ich ja folgendes CDWordArray m_dwa;

    und beim map?
    der erste teil wäre am besten CString aber was mach mit dem DWORD?

    sdt::map<CString, ???> m_dwa;



  • natürlich geht sdt::string nicht. std::string aber sehr wohl.

    std::map<CString, DWORD> m_dwa;
    

    Was auch sonst?



  • Skippy schrieb:

    ist ja schonmal schön zu wissen das sdt::map noch gibt habe vor einigen wochen gewechselt von DEV C ++ nach Visual Studio nun gehen ja einige sachen nicht mehr z.b. sdt::string womit ich in meinen funktionen die ganze Zeit gearbeitet habe oder auch das makro IFDIR bzw bei ms heissts IFDIR

    ????
    Vielleicht solltest Du nur #include <string> machen, dann geht auch mit MS-VC alles...

    Skippy schrieb:

    im original habe ich ja folgendes CDWordArray m_dwa;

    Dann würde ich auch lieber zu einem

    std::vector<DWORD> m_dwa
    

    tendeieren...

    Skippy schrieb:

    und beim map?
    der erste teil wäre am besten CString aber was mach mit dem DWORD?

    sdt::map<CString, DWORD> m_dwa;
    


  • @asijo sorry irgendwie versteh ich nicht was du meinst könntest das mal bitte für dumme erklären

    @dEUs danke irgendwie bringt mich dieses C vor allem durcheinander (z.b. CString)

    @Jochen Kalmbach naja vector wird mir nichts bringen da ich ja eine beziehung zwischen dem handle HMODUL einer dll und dem befehl schaffen muss.

    das heisst bildlich vorgestellt hab ich dann eine Tabelle
    in der ich dann alle Virtuellen Verzeichnisse des Servers habe und jeweils in der gleichen zeile den handle auf die jeweilige dll

    dieser dll übergebe ich dann einen string die arbeitet damit und gibt mir einen formatierten string zurück den ich dann auf einen socket zum clienten sende nachdem ich den header hinzugefügt habe



  • danke schonmal für die hilfe

    hab den code jetzt bei mir abgeändert

    // ************ The Plugin System Loading ......
    // ************ Load all plugins into Memory ......
    
      char filepath[MAX_PATH];
    
      //who are we really? Get the Exe Path
      GetModuleFileName(AfxGetApp()->m_hInstance,filepath,MAX_PATH-1);
      SetCurrentDirectory(ExtractFilePath(filepath));
      CFileFind finder;
      CString strWildCard = _T("*.plx"); //Die Endung der Plugins
    
      //call this to set up the finder to iterate through all the plugins
      BOOL bWorking = finder.FindFile(strWildCard);
      while (bWorking)
      {
        //have to call FindNextFile() before GetFileName() or GetFilePath()
        //because FindFile just sets the object up and returns
        //true if _ANY_ files were found
        bWorking = finder.FindNextFile();
    	if (finder.IsDots() || finder.IsDirectory())
    		continue;
    
        HMODULE hm = LoadLibrary(finder.GetFilePath());
        if ( !hm )
        {
          MessageBox("couldn't load");
        }
        else
        {    
          MessageBox("lade Plugin");
    	  //loaded OK, so add each library's HMODULE to an array.
          //m_dwa is an MFC CDWordArray
          m_dwa.Add((DWORD)hm);
    
          m_dwa2.insert(std::map<CString, DWORD>::value_type(finder.GetFileName(), (DWORD)hm) );
        }
      }
    

    im header hab ich die map so definiert

    typedef std::map<CString, DWORD> m_dwa2; //fürs Plugin-System

    nun bekomme ich folgende fehlermeldung

    C:\SkippSerV\ArbeitsVersion\SERWEVW.CPP(145) : error C2143: syntax error : missing ';' before '.'
    C:\SkippSerV\ArbeitsVersion\SERWEVW.CPP(145) : error C2143: syntax error : missing ';' before '.'

    für folgende zeile

    m_dwa2.insert(std::map<CString, DWORD>::value_type(finder.GetFileName(), (DWORD)hm) );
    


  • Ja, ist ja auch totaler Unsinn.
    Weißt du überhaupt, was ein typedef macht?



  • yep dacht ich eigentlich

    ich habs ja auch probiert es so zu machen wie immer

    normalerweise kommt danach ja noch ein

    m_dwa2 plx_handles;

    aber das gibt dann 42 warnings

    z.b. hier die ersten zeilen

    C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\xtree(201) : warning C4786: '?rbegin@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@QAE?
    AV?$reverse_bidirectional_iterator@Viterator@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@U?$pair@$$CBVCString@@K@3@AAU43@PAU43@H@2@XZ' 
    : identifier was truncated to '255' characters in the browser information
            C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(46) : see reference to class template instantiation 'std::_Tree<class CString,struct std::pair<class CString const ,unsigned long>,struct std::map<class CString,unsigned long,struct std::
    less<class CString>,class std::allocator<unsigned long> >::_Kfn,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
            C:\SkippSerV\Neuer Ordner\SkippSerV\serwevw.h(114) : see reference to class template instantiation 'std::map<class CString,unsigned long,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
    C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\xtree(203) : warning C4786: '?rbegin@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@QBE?
    AV?$reverse_bidirectional_iterator@Vconst_iterator@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@U?$pair@$$CBVCString@@K@3@ABU43@PBU43@H@
    2@XZ' : identifier was truncated to '255' characters in the browser information
            C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(46) : see reference to class template instantiation 'std::_Tree<class CString,struct std::pair<class CString const ,unsigned long>,struct std::map<class CString,unsigned long,struct std::
    less<class CString>,class std::allocator<unsigned long> >::_Kfn,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
            C:\SkippSerV\Neuer Ordner\SkippSerV\serwevw.h(114) : see reference to class template instantiation 'std::map<class CString,unsigned long,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
    C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\xtree(205) : warning C4786: '?rend@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@QAE?AV
    ?$reverse_bidirectional_iterator@Viterator@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@U?$pair@$$CBVCString@@K@3@AAU43@PAU43@H@2@XZ' : 
    identifier was truncated to '255' characters in the browser information
            C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(46) : see reference to class template instantiation 'std::_Tree<class CString,struct std::pair<class CString const ,unsigned long>,struct std::map<class CString,unsigned long,struct std::
    less<class CString>,class std::allocator<unsigned long> >::_Kfn,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
            C:\SkippSerV\Neuer Ordner\SkippSerV\serwevw.h(114) : see reference to class template instantiation 'std::map<class CString,unsigned long,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
    C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\xtree(207) : warning C4786: '?rend@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@QBE?AV
    ?$reverse_bidirectional_iterator@Vconst_iterator@?$_Tree@VCString@@U?$pair@$$CBVCString@@K@std@@U_Kfn@?$map@VCString@@KU?$less@VCString@@@std@@V?$allocator@K@3@@3@U?$less@VCString@@@3@V?$allocator@K@3@@std@@U?$pair@$$CBVCString@@K@3@ABU43@PBU43@H@2@
    XZ' : identifier was truncated to '255' characters in the browser information
            C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(46) : see reference to class template instantiation 'std::_Tree<class CString,struct std::pair<class CString const ,unsigned long>,struct std::map<class CString,unsigned long,struct std::
    less<class CString>,class std::allocator<unsigned long> >::_Kfn,struct std::less<class CString>,class std::allocator<unsigned long> >' being compiled
    


  • Na und? Du kannst doch lesen oder? Dann les mal bitte die Warnings...! 🙄



  • hättest du nen Hinweis was ich machen soll? das einzige was ich bis jetzt dazu gefunden habe ist ZITAT:

    Yes, it's perfectly normal for VC6

    so dann entweder #pragma warning(disable: 4786) einfügen

    oder nach VC7 wechseln.

    wenigstens nen kleinen stubser in die richtige richtung, Biiiiitttee 🙄



  • Man. Les doch die Warnung. Da steht's doch drin: Der Debugbezeichner hat mehr als 255 Zeichen. WHO CARES?!



  • @deus ich arbeite grad mal 3 wochen mit VC6. habe vorher nur mit DEV C++ gearbeitet und da kommt diese Warnung nicht. hab alles was google über die fehlermeldung hat gelesen und die einzigen beiden Lösungen die ich gefunden habe waren wie ich schon geschrieben habe die warnung zu deaktivieren oder umzusteigen auf VC7 da er mit "debug identifier" umgehen kann die länger als 255 Zeichen sind.

    habe mir auch nochmal tutorials angesehen in der Hoffnung das ich einfach was übersehen habe. aber immer kommt diese fehlermeldung.

    mag sein das es nur ein kleiner Schusselfehler ist aber ich komme leider nicht dahinter



  • Du hast doch Deine Frage schon beantwortet! Oder was ist noch Dein Problem?

    Du musst in der CPP-Datei ganz oben ein

    #pragma warning(disable: 4786)
    

    einbauen (oder in einer H-Datei die immer als erstes includiert wird (z.B. stdafx.h)



  • nur ist das doch keine Fehlerbehebung, oder ich deaktiviere die Fehlermeldung nur einfach. habe ja gehofft man kanns im code "beseitigen".
    So hab ichs ja mittlerweile erstmal gemacht damit ich am code weiterarbeiten kann.

    Wäre halt nur schön wenn ich erstmal ohne solche #pragmawarning(disable:.... "spielchen" auskommen würde.



  • Ich glaube, du hast da nen Logikfehler:
    Es ist ja keine Fehler, sondern eineWarnung.
    Und diese kannst du getrost ignorieren.



  • PS: VC7 behebt den "Fehler" auch nicht, sondern da ist diese Warnung nur per "default" deaktiviert 😉



  • @Paul_C. yep ich weiss das man warnungen ignorieren kann nur soll aus dem Programm nen Projekt werden an dem mehrere Einsteiger mitwirken und da wollt ich halt sowas eben so wenig wie möglich drin haben.
    Ich weiss auch das es sich bei größeren Programmen meisst ar nicht vermeiden lässt (siehe z.b. Code von CrystalSpace)

    @Jochen Kalmbach: wenn das so ist lassen wir das einfach



  • Jochen Kalmbach schrieb:

    PS: VC7 behebt den "Fehler" auch nicht, sondern da ist diese Warnung nur per "default" deaktiviert 😉

    Ist das wirklich so? 😕

    Habe den VC++7.1, der kann das ohne Probs.


Anmelden zum Antworten