funktion aus dll verwenden
-
also ich hab nur diesen hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=78491&highlight=dll+statisch
gefunden,
aber das problem ist, dass ich zu der dll keine lib hab. ich habe nur die dll, und ich weiss, wie die funktionen heissen.wie geht das jetzt (oder wo ist das tut, von dem du gesprochen hast?)
-
http://bcb-tutorial.c-plusplus.net/ *no comment*
guck da mal nach, da gibts sicher tipps über DLLs erstellen/einbinden usw!
-
ich bin jetzt soweit:
__declspec(dllimport) int Inp(int, int); __declspec(dllimport) int Out(int, int); HMODULE hMod = LoadLibrary("INPOUT32.dll"); if(hMod) { int Inp = GetProcAddress(hMod, "Inp"); if(Inp) { ShowMessage("Input = true"); } int *Out = GetProcAddress(hMod, "Out"); if(Inp) { ShowMessage("Output = true"); } FreeLibrary(hMod); }
aber es funktioniert nicht. ich bekomme immer folgende fehlermeldung
[C++ Fehler] Unit1.cpp(29): E2034 Konvertierung von 'int (__stdcall *)()' nach 'int' nicht möglich [C++ Fehler] Unit1.cpp(35): E2034 Konvertierung von 'int (__stdcall *)()' nach 'int *' nicht möglich [C++ Warnung] Unit1.cpp(42): W8004 'Out' wurde ein Wert zugewiesen, der nie verwendet wird.
-
Eine nicht sehr elegante Lösung ist die Nutzung von Inline-Assembler (aber sie funktionniert):
_asm{ call FUNKTION }
-
und wie wende ich das an?
(im obenstehenden quelltext)
-
Sorry, der Fehler liegt ersteinmal auch woanders:
API-Definition:
FARPROC GetProcAddress();
du hast geschrieben:
int Inp = GetProcAddress(hMod, "Inp");
Der nimmt hier an, dass du eine neue Variable mit dem Namen "Inp" erstellst, wie man auch aus der Fehlermeldung erkennen kann.
Hierzu weiß ich auch gerade nicht weiter, ich habe meinerseits soetwas bisher nur mit VC++ geschrieben.
[EDIT]
Wenn du nichts gegen reine API hast, hier der Code für deine Funktion:typedef int (__stdcall *InFkt)(int wert1, int wert2); InFkt In = NULL; In = (InFkt)GetProcAddress(DLL-HANDLE, "In"); int rueckgabe = In (Int-Variable, int-Variable);
[/EDIT]
-
und was ist
pSCardCommand
???
-
war ein fehler meinerseits, habe es geändert
-
jetzt geht es schon fast, aber ich bekomme immer folgende exception bei aufruf der funktion:
Privilegierte Anweisungworan liegt das jetzt? an der dll?
-
Hallo nochmal!
Also wenn die Exception an der Stelle kommt, wo du die Funktion "In" aufrufst
int rueckmeldung = In(integervariable1, integervariable2);
dann fällt mir nur der nicht elegante Weg ein:
Ersetze diesen Part einfach durch die nachfolgenden Code-snippets:Musst halt gucken, ob du die Variablen mit "In(&integervariable1,..)" oder nur "In(integervariable1,.." übergeben musst. Einfach testen was klappt, auf jeden Fall kommt keine Exception von wegen priviligierte Anweisung
und wenn doch..hast du Admin-Rechte auf dem PC? (nur ein Schuss ins Blaue..)Code für "In(integervariable1,..":
_asm { push integer2 push integer1 Call In mov rueckmeldung, eax }
Code für "In(&integervariable1,..)":
_asm { push offset integervariable2 push offset integervariable1 Call In mov rueckmeldung, eax }
-
ja, ich habe admin-rechte
das geht aber auch nicht.
Call In
Undefined symbol: In
-
Schade, dass auch an dieser Stelle keine Lösung kommt, würde mich nämlich auch interessieren!
-
Hallo
Antwort worauf? Keiner weiß mehr was in diesem wirren Thread eigentlich das Problem war. Wie DLLs zu behandeln sind findest du zum Beispiel hier. Dazu braucht man auch keine Assembler-Tricks.
bis bald
akari
-
Ja, das stimmt.
Ich ging davon aus, dass man wissen möchte, wie man die Fehlermeldung "Privilegierter ..." wegbekommt, wenn man z.B. mit der inpout32.dll auf die Parallelschnittstelle zugreifen will. Codebeispiele zu diesem Zugriff sind zwar im Forum zu finden, aber nichts zu dieser Fehlermeldung.
-
Hallo
Doch das Thema hatten wir schon. Das hier habe ich beim Suche nach *inpout32* gefunden.
bis bald
akari