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 Anweisung

    woran 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


Log in to reply