Zeiger an Klassenelementfunktion übergeben



  • Hallo,

    Ich poste erstmal meinen Code:

    Die Klasse load_dll:

    #include "StdAfx.h"
    #include "load_dll.h"
    
    load_dll::load_dll(void)
    {
    }
    
    load_dll::~load_dll(void)
    {
    }
    
    void load_dll::load(IApplication *pApp)
    {
    	CLSID clsid;
    	HRESULT hr;
    
    	CoInitialize(NULL); 
    
    	hr = CLSIDFromString(L"DVOBJAPILib.DvISEAPI", &clsid);
    
    	hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,  IID_IApplication, (void**)&pApp);
    	printf("HR: %x", hr);
    }
    

    Die Main Funktion:

    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	//Variablen
    	IApplication *pApp = NULL;
    	long test = 0;
    
    	load_dll dll_load;
    	dll_load.load(pApp);
    
    	pApp->get_MajorVersion(&test);
    	printf("Major: %d", test);
    
    	return 0;
    }
    

    Als erstes möchte ich sagen, das ich noch nicht lange C++ programmiere und ich mich auch gerade im Momment erst so richtig mit dem Klassenkonzept vertraut mache, wenn da also das ein oder andere im Quellcode is, wo man sagen würde "na so macht man das aber normalerweise nicht", so bitte ich dies zu berücksichtigen.

    Zu meinem Problem:
    Ich möchte eignetlich nur den Zeiger "IApplication *pApp" aus der "_tmain" an die Funktion "load" aus der Klasse "load_dll" übergeben. Die läd dann für mich die DLL und kann dann so mit "pApp" in "_tmain" arbeiten. Geht aber leider nicht...
    Er kompiliert das ganze auch, aber das Programm stürzt ab. Ich denke mal die alten c++ Hasen wissen sofort woran das liegt, ich steh seid drei Stunden auf'm Schlauch. 😃

    Grüße!
    Ben



  • Hallo,
    da du deinen Pointer pApp per Value an load() übergibst, ist pApp nachher genauso null wie vorher. Völlig unabhängig davon, was du in load() machst.

    Schau in deinem Lieblingsbuch über C++ noch mal unter den Stichpunkten Call-by-Value und Call-by-Reference nach.



  • Okay, das hab ich auch schon probiert:

    In der Main (call-by-reference):

    dll_load.load(&pApp);
    

    Allerdings sagt mir dann der Compiler:

    error C2664: 'load_dll::load': Konvertierung des Parameters 1 von 'IApplication **__w64 ' in 'IApplication *' nicht möglich
    

    Hilfe!! 🙂



  • Kann mir keiner Helfen?

    Mir ist klar (zumindest hoffe ich das), das ich der Funktion die Referenz,
    also mit &pApp übergeben muss.

    Muss dann die Klasse so aussehen:

    void load_dll::load(IApplication **pApp) {}

    -> Zeiger auf Zeiger?

    Wenn ja, wie funktioniert dann das?

    hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IApplication, (void)&pApp)**;



  • Benjamin@Bonn schrieb:

    Mir ist klar (zumindest hoffe ich das), das ich der Funktion die Referenz, also mit &pApp übergeben muss.

    Du bist dir aber bewusst, dass wenn du beim Funktionsaufruf einen &-Operator vor den Parameter schreibst, du die Adresse (und nicht die Referenz) übergibst?
    Und was versuchst du mit dem Doppelzeiger?

    Du musst in C++ grundsätzlich zwischen Zeigern und Referenzen unterscheiden.

    void ZeigerFunktion(int *a)
    {
       *a; // Zugriff auf Wert von a
    }
    void ReferenzFunktion(int &a)
    {
       a; // Zugriff auf Wert von a
    }
    
    int main()
    {
       int x = 45;
       ZeigerFunktion(&x);   // Aufruf: Zeiger mit & (Adressoperator)
       ReferenzFunktion(x);
    }
    


  • @Nexus
    Danke Danke Danke!
    Das war mir bis jetzt noch nicht so richtig klar.
    Damit werd ich jetzt erstmal ein bischen spielen! 😃



  • Habs jetzt!

    Ich ruf die Funktion wie folgt auf:

    dll_load.load(pApp);
    

    Und die Funktion schaut so aus:

    void load_dll::load(IApplication *&pApp) {}
    

    ->Referenz auf Zeiger

    Danke nochmal!



  • Benjamin@Bonn schrieb:

    Und die Funktion schaut so aus:

    void load_dll::load(IApplication *&pApp) {}
    

    ->Referenz auf Zeiger

    Aber wieso machst du es so kompliziert? Reicht eine einfache Referenz nicht?
    Also etwa so:

    void load_dll::load(IApplication &pApp)
    {
       pApp // Zugriff auf pApp
    }
    

    Und der Aufruf bliebe der gleiche:

    dll_load.load(pApp);
    

    Denn normalerweise sollte eine einfache Referenz reichen. Oder brauchst du intern noch einen Zeiger? Wie wird pApp in der Funktion gehandhabt? Zeig doch mal die Funktion so, wie sie jetzt aussieht.



  • So schaut's momentan aus...

    Klasse load_dll:

    #include "StdAfx.h"
    #include "load_dll.h"
    
    load_dll::load_dll(void)
    {
    }
    
    load_dll::~load_dll(void)
    {
    }
    
    void load_dll::load(IApplication *&pApp)
    {
    	CLSID clsid;
    	HRESULT hr;
    
    	CoInitialize(NULL); 
    
    	hr = CLSIDFromString(L"DVOBJAPILib.DvISEAPI", &clsid);
    
    	hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,  IID_IApplication, (void**)&pApp);
    }
    

    Main:

    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	//Variablen
    	IApplication *pApp = NULL;
    	Account *pAcc = NULL;
    	long test = 0; //nur zum testen
    
    	load_dll dll_load;
    	dll_load.load(pApp);
    
    	pApp->get_MajorVersion(&test); //nur zum testen 
    	printf("Major: %d", test); //nur zum testen
    
    	return 0;
    }
    

Anmelden zum Antworten