DLL Import



  • Hallo zusammen,
    ich habe mich hier schon einmal umgesehen und schon ein paar Anregungen bekommen. Aber es will alles noch nicht so wie ich will.

    So jetzt zu meinem Problem:
    Ich soll mit Visual Studio 2005 eine Grafische Oberfläche erstellen und das mit C# soweit kein Problem.
    Ich soll aber auch aus der Anwendung heraus Hardware ansprechen. Zu diesem Zweck habe ich eine DLL-Datei eine .lib und eine .h Datei bekommen sonst nichts.

    Aus der Header(.h)-Datei habe ich mir die vier Funktionen heraus gesucht die ich für meine Zwecke benötige:

    extern "C" HANDLE PASCAL EXPORT InitPendelkarte  (void);
    extern "C" BOOL PASCAL EXPORT LeseWinkel (long* pWinkel,long* pPosition);
    extern "C" BOOL PASCAL EXPORT SetzeKraft(float fKraft);
    extern "C" void PASCAL EXPORT ClosePendelkarte(HANDLE hHandle);
    

    Ich habe die DLL in mein Projekt eingefügt über Hinzufügen-> Vorhandenes Element und zum Test folgende Zeilen Code die ich schon im Forum gefunden habe eingefügt:

    class hwpendContr
        {
            [System.Runtime.InteropServices.DllImport("hwpendContr.dll")]
            public static extern bool SetzeKraft(float fKraft);
        }
    

    Ich habe diese Funktion gewält, da sie mir am einfachsten vorkamm (keine Handle, keine pointer).

    In einem anderen Teil des Projetes rufe ich die Funktion auf:

    hwpendContr.SetzeKraft((float)5);
    

    Leider wird mir beim ausführen immer an dieser Stelle gesagt:

    Die DLL hwpendContr.dll: Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
    

    Jetzt bin ich aber mit meinem Latein am ende.
    Ich würde mich über Hilfe sehr freuen.

    Danke
    Hanz



  • Servus,

    folgende Ursachen kann das Problem u.a. haben:

    - Er findet die angegebene DLL einfach nicht (Ist sie im Ausführungsverz.?)
    - Die DLL hat noch weitere Abhängigkeiten (Noch andere referenzierte DLLs die benötigt werden)
    - Er findet die angegebene Methode einfach nicht

    Damit du sicher sein kannst, dass er die Methode wirklich findet, kannst du einfach mal folgendes ausprobieren und noch ein paar weitere Attribute einfügen:

    [DllImport("XXXXXXX.dll", EntryPoint="DerMethodenNameInDerDLL", CallingConvention=CallingConvention.StdCall)]
    public static extern bool DerMethodenNameInDerDLL(bool parameter);
    

    Daran wirds aber bei dir nicht liegen. Ich denke mir das er einfach die DLL / Methode nicht findet.

    Bedenke bei P/Invoke das du bei Datentypen die übergeben werden auch immer den richtigen C# Typ castest. d.h. Mache dich mit Marshallen vertraut.

    Bsp. Funktionzeiger:

    [DllImport("XXXXXXX.dll", EntryPoint="DerMethodenNameInDerDLL", CallingConvention=CallingConvention.StdCall)]
    public static extern bool DerMethodenNameInDerDLL([MarshalAs(UnmanagedType.FunctionPtr)] EinTyp parameter);
    

    mfg
    Hellsgore



  • Hallo Hellsgore,
    vielen Dank für deine Schnelle Hilfe.
    Es hat tatsächlich noch eine weitere DLL-Datei gefehlt, ich musste sie nur noch ins Ausführungsverzeichnis kopieren und schon klappte es, zumindest der erste Test.
    Vielen Dank auch für deinen Tipp mit dem „Marshallen“ ich werde mich da mal einarbeiten.

    Noch mal vielen Dank
    Hanz



  • Äh, StdCall wird als Aufrufkonvention aber undefiniertes Verhalten erzeugen, denn die DLL exportiert die DLLs doch in der FastCall-Konvention („PASCAL“).


Anmelden zum Antworten