C-DLL Adresse/Zeiger übergeben
-
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.
-
Wenn du bei der Erstellung einer Dll nicht genau angibst, was exportiert werden soll, kannst du es später z.B. per GetProcAddress nicht laden. Ich mach das so:
//Dll.h #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT int myFunc (<Parameter>);
-
Maffe001 schrieb:
Wenn du bei der Erstellung einer Dll nicht genau angibst, was exportiert werden soll, kannst du es später z.B. per GetProcAddress nicht laden. Ich mach das so:
jetzt bin ich verwirrt
, für wenn ist das jetzt 
-
Für vergessen.
vergessen schrieb:
[...]Was meint ihr mit "was von einer Dll exportiert wird."[...]