C-DLL Adresse/Zeiger übergeben



  • Guten Tag.

    Ich habe eine Funktion in meiner C-DLL. Der übergebe ich z.B. -aus main()- zwei Intergerwerte und erhalte einen Integerwert zurück.
    Wegen der Effizienz würde ich gerne mit Referenzen oder Zeigern arbeiten.

    Mit den Referenzen klappt das auch, wenn sie in main() initialisiert und der DLL übergeben werden.

    Wie muss der Aufruf aus main() erfolgen und die Definition der Funktion in der DLL aussehen, wenn ich das mit Zeigern machen will.

    Ich hoffe mir kann geholfen werden ?



  • Vergessen schrieb:

    Ich habe eine Funktion in meiner C-DLL. Der übergebe ich z.B. -aus main()- zwei Intergerwerte und erhalte einen Integerwert zurück.
    Wegen der Effizienz würde ich gerne mit Referenzen oder Zeigern arbeiten.

    warum willst du so etwas machen?
    int == 4bytes
    pointer == 4bytes
    es macht also keinen sinn pointer einzusetzen.
    und referenzen afaik für c++ gedacht

    // aber trotzdem ein bsp
    void foo(int *bar) { /* mach was */ }
    
    // aufruf
    int i = 50;
    foo(&i);
    


  • "invalid conversion from 'int*' to 'int';

    ....so geht's nicht. Deswegen habe ich gefragt.



  • Mir scheint, du hast das Sternchen vor bar nicht mit übernommen 😉



  • dll.h:
    int getIrgendwas(int *, int 😉
    maindll.c:
    int getIrgendwas(int * wert1, int * wert2){
    ....
    }

    Aufruf:
    getIrgendwas( & w1, & w2);

    So hab ich's gemacht. Funktioniert aber mit Zeigern nicht.
    Es geht bei diesem (Integer-) Beispiel nur ums Prinzip.



  • greifst du dynamisch auf die dll zurück?
    wenn ja stimmt dein funktionspointer?



  • Deine Funktion sieht so aus:

    //
    int MeineFunktion(int * param1, int * param2) {
    //CODE
    }

    Wenn du diese Funktion aufrufst, sieht es so aus:
    int variable1, variable2;
    int result;
    result = MeineFunktion(&variable1, &variable2);



  • Bitte lasse keinen Abstand zwischen den Adressoperatoren und der Variablen.



  • Danke für eure Antworten.

    Ich lese die DLL dynamisch, mittels Funktionszeiger ein . Ich glaube da liegt auch das Problem. Die Parameter sind da wohl bereits als Zeiger "ausgeführt".

    typedef int(* GetIrgendwasPROC)(int, int);
    GetIrgendwasPROC pfnGetIrgendwas = NULL;
    HMODULE hMyLib;
    ....
    etc.

    Im Moment übergebe ich die Parameter, aus dem Hauptprogramm heraus, als Referenz. Das kann ich mir doch sparen, oder ?



  • Wenn du in deiner Schnittstelle Zeiger übergeben willst, dann musst du das im typedef auch definieren.

    typedef int (*GetIrgendwasPROC)(int *, int *);
    


  • .. hätt ich auch selber drauf kommen können

    Wirklich krass, dass ich das übersehen habe.



  • Tja, manchmal sitzt man halt blind davor und schaut wie 'n Schwein ins Uhrwerk. 😃 Geht mir auch oft genug so. 😉



  • Aber sag mal, normal hätte doch der Funktionszeiger immer NULL sein müssen, wenn du GetProcAddress ausgeführt hast. Oder nicht? 😕

    [Edit]Rechtschreibfehler[/Edit]



  • Ich lese mit LoadLibrary() die DLL ein.

    Mit GetProcAdress() suche ich mir die Adresse (den Zeiger) und weise den dann zu. Danach ist
    pfnGetIrgendwas nicht mehr NULL.

    Mach das halt ganz ordentlich, der Reihe nach.



  • Das meine ich nicht. Als dein typedef noch falsch war. Da hätte doch der Zeiger eigentlich NULL sein müssen. Oder nicht? 😕



  • Maffe001 schrieb:

    Aber sag mal, normal hätte doch der Funktionszeiger immer NULL sein müssen, wenn du GetProcAddress ausgeführt hast. Oder nicht? 😕

    hab gerade ein bisschen rumgespielt und den param typ mit anderen vertauscht
    zb: mit float und die anzahl der parameter im funcpointer verändert und
    es hat trotzdem funktioniert.
    die remarks in der msdn könnte man so deuten als wären in die parameter egal
    sondern nur der name zählt die adresse der funktion zu bekommen.



  • Hmm, ist ja auch klar, jetzt wo du's sagst :D. Wenn man sich anschaut, was von einer Dll exportiert wird, erhält man ja auch nur den Namen und nicht mehr.



  • ... als mein typedef noch "falsch" war, funktionierte das auch nicht. Die Compilation wurde abgebrochen.



  • GetProcAdress() sucht doch anhand des Funktionsnamens die Adresse. Was meint ihr mit "was von einer DLL exportiert wird" ?



  • vergessen schrieb:

    ... als mein typedef noch "falsch" war, funktionierte das auch nicht. Die Compilation wurde abgebrochen.

    dann hast du irgendwo anderes einen fehler gehabt, den dieses wird erst zur laufzeit verarbeitet.


Anmelden zum Antworten