dll ansprechen mit stuktur

  • Hallo @ all

    hab da n kleines Problemchen...

    Ich versuche eine DLL anzusprechen mit einer Struktur.

    ABER irgendwie glaube ich, funktioniert mein dllcall nicht, weis aber nicht, was ich da anderst machen soll.

    hier mein Script

    also wenn irgend jemand was auf fällt ... einfach mal los schreiben ..

    DANKE !!

    Spoiler anzeigen


    #cs ----------------------------------------------------------------------------

    AutoIt Version: 3.3.6.1
    Author: myName

    Script Function:
    NIdll ansprechen

    #ce ----------------------------------------------------------------------------

    #cs

    #define BUFFERSIZE 256
    #define NumberIOs 24

    typedef struct
    {
    char name[BUFFERSIZE]; // Name der Karte
    char port0[BUFFERSIZE]; // Name von Port0
    char port1[BUFFERSIZE]; // Name von Port1
    char port2[BUFFERSIZE]; // Name von Port2
    BOOL ioPort0; // Input (TRUE) oder Output (FALSE)
    BOOL ioPort1; // Input (TRUE) oder Output (FALSE)
    BOOL ioPort2; // Input (TRUE) oder Output (FALSE)
    int handle[NumberIOs]; // Maximal pro IO ein Handle
    BOOL bits[NumberIOs]; // Eine Karte hat NumberIOs Bits.
    } NICard;


    ;#########################################################

    how to use:
    niDll:
    NI USB-Karten,

    init_NICard (NICard *nicard, +Std)
    öffnet die Handle für die einzelnen Ports.
    Hierbei wird unterschieden zwischen Input/Output-Ports

    Für einen Input-Port wird ein Handle aufgemacht,
    für einen Output-Port wird für jedes Bit ein Handle aufgemacht,
    so dass auch jedes Bit einzeln geschrieben werden kann.

    write_NICard_bit (NICard *nicard, int bit, +Std)
    schreibt ein einzelnes bit,

    read_NICard (NICard *nicard, +Std)
    liest alle Ports auf einmal und

    shutdown_NICard (NICard *nicard, +Std)
    schließt alle Handle.

    genauer :
    int init_NICard (NICard *nicard, char* reportText, short* errorOccured, long* errorCode, char* errorMsg);

    int read_NICard (NICard *nicard, char* reportText, short* errorOccured, long* errorCode, char* errorMsg);

    int write_NICard_bit (NICard *nicard, int bit, char* reportText, short* errorOccured, long* errorCode, char* errorMsg);

    int shutdown_NICard (NICard *nicard, char* reportText, short* errorOccured, long* errorCode, char* errorMsg);

    #ce


    ; strukturparameter
    $str = "char name[256];char port0[256];char port1[256];char port2[256];BOOL ioPort0; BOOL ioPORT1;BOOL ioPORT2;int handle[24];BOOL bits[24]"


    $nidll_Strukt = DllStructCreate($str) ; struktur generieren

    DllStructSetData($nidll_Strukt,"name","test")
    DllStructSetData($nidll_Strukt,"port0","A")
    DllStructSetData($nidll_Strukt,"port1","B")
    DllStructSetData($nidll_Strukt,"port2","C")
    DllStructSetData($nidll_Strukt,"ioPort0",True)
    DllStructSetData($nidll_Strukt,"ioPort1",True)
    DllStructSetData($nidll_Strukt,"ioPort2",True)
    DllStructSetData($nidll_Strukt,"handle",3)
    DllStructSetData($nidll_Strukt,"bits",0)


    ; dll öffnen
    $niDll_dll = DllOpen("niDll.dll")

    ;result = DllCall ( "dll ","return type"," function " , type1 , param1 )
    $result = DllCall ( $niDll_dll , "int" ,"init_NICard", "ptr" ,DllStructGetPtr($nidll_Strukt) )


    ; close

    DllClose($niDll_dll)
    $nidll_Strukt = 0 ; struktur löschen

    ich suche grad noch free-webspace, dann poste ich noch die zugehörige dll

    hier die DLL -> http://uploaded.to/file/m5b7sn

    Einmal editiert, zuletzt von vivus (29. Juni 2010 um 17:02)

  • Hi,

    versuche es doch bitte einmal so ...

    [autoit]

    $result = DllCall ( $niDll_dll , "int:cdecl" ,"init_NICard", "ptr" ,DllStructGetPtr($nidll_Strukt) )

    [/autoit]

    EDIT:
    Da fehlen noch die anderen Parameter der Funktion !!!

    EDIT 2:
    Na gut, weil heute Dienstag ist ...
    So sollte es ungefähr aussehen (ungetestet!)

    Spoiler anzeigen
    [autoit]

    ;~ init_NICard (NICard *nicard, char* reportText, short* errorOccured, long* errorCode, char* errorMsg)

    [/autoit] [autoit][/autoit] [autoit]

    ; strukturmitglieder
    $str = "char name[256];"& _
    "char port0[256];"& _
    "char port1[256];"& _
    "char port2[256];"& _
    "BOOL ioPort0;"& _
    "BOOL ioPORT1;"& _
    "BOOL ioPORT2;"& _
    "int handle[24];"& _
    "BOOL bits[24]"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $nidll_Strukt = DllStructCreate($str) ; struktur generieren

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($nidll_Strukt,"name","test")
    DllStructSetData($nidll_Strukt,"port0","A")
    DllStructSetData($nidll_Strukt,"port1","B")
    DllStructSetData($nidll_Strukt,"port2","C")
    DllStructSetData($nidll_Strukt,"ioPort0",True)
    DllStructSetData($nidll_Strukt,"ioPort1",True)
    DllStructSetData($nidll_Strukt,"ioPort2",True)
    DllStructSetData($nidll_Strukt,"handle",3)
    DllStructSetData($nidll_Strukt,"bits",0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Parameter zum Aufruf der Funktion init_NICard
    $szReportText = DllStructCreate ("char[256]")
    $ErrorOccured = DllStructCreate ("short")
    $ErrorCode = DllStructCreate ("long")
    $szErrorMsg = DllStructCreate ("char[256]")

    [/autoit] [autoit][/autoit] [autoit]

    ; dll öffnen
    $niDll_dll = DllOpen("niDll.dll")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Funktion zum Initialisieren aufrufen.
    init_NICard (DllStructGetPtr($nidll_Strukt), _
    DllStructGetPtr($szReportText), _
    DllStructGetPtr($ErrorOccured), _
    DllStructGetPtr($ErrorCode), _
    DllStructGetPtr($szErrorMsg))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;############ NICard API ############

    [/autoit] [autoit][/autoit] [autoit]

    Func init_NICard ($lpNicard, $pszReportText, $pErrorOccured, $lpErrorCode, $pszErrorMsg)

    [/autoit] [autoit][/autoit] [autoit]

    $aRes = DllCall ( $niDll_dll , "int:cdecl" ,"init_NICard", _
    "ptr" , $lpNicard, _
    "ptr" , $pszReportText, _
    "ptr" , $pErrorOccured, _
    "ptr" , $lpErrorCode, _
    "ptr" , $pszErrorMsg _
    )
    Return $aRes[0]

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    Gruß
    Greenhorn


    2 Mal editiert, zuletzt von Greenhorn (29. Juni 2010 um 17:35)

  • hi Greenhorn !!
    hab's mal versucht ... kommt leider genau der gleiche Fehler wie bei meinem Script

    -> SetPanelCharacterSet in cvirte.dll nicht gefunden <- ? ??

    hängt wahrscheinlich irgend was noch in der Luft was noch gefunden werden muss ..

    Ich häng mich jetzt noch mal an die Initialisierungsparameter, vielleicht stimmt da was nicht.

    Danke für dein Script . . habe die restlichen Parameter weg gelassen, weil ich dachte dass die nur für die Fehlerroutinen sind.

    du hast "int:cdecl" eingesetzt .. hab mal ge googelt . . handelt sich also um einen Aufrufmethode . . hat was mit dem stack zugriff zu tun.
    Woher weist du, dass man das hier verwenden muss ? Woran sieht man das ?

    DANKE !

    • Offizieller Beitrag

    SetPanelCharacterSet in cvirte.dll nicht gefunden <- ? ??


    Wie soll eine Funktion verwendet werden, die es in der DLL gar nicht gibt?
    Hier die Funcs aus der DLL:
    init_NICard
    read_NICard
    shutdown_NICard
    write_NICard_bit

    Übrigens scheint die DLL buggy zu sein. Dependency Walker gibt einige Fehlermeldungen beim Öffnen.

  • Hi bugFix
    hast du schon recht . . . die funktion ist nicht in der dll

    Habe jetzt auch den grund für die Misere :

    man benötigt eine Runtime-Engine . . . um die DLL auszuführen.

    die DLL versucht wahrscheinlich in ihren Funktionen selbst auf die bemängelte "fehlende" Funktion zu zu greifen.

    leider hab ich die DLL nicht selber geschrieben und habe somit keinen einblick in diese.

    ... habe die Runtime installiert .. ( von ni.com ) ist die CVI runtime 8.5

    jetzt ist auch die Fehlermeldung weg.

    allerdings muss man doch die dll mit "int" aufrufen nicht mit "int:cdecl" .. weil sonst autoIt abraucht.

    leider bekomme ich noch keine Werte zurück von der Karte ..

    muss wohl noch ein wenig rum spielen ..

    DANKE !

    Einmal editiert, zuletzt von vivus (30. Juni 2010 um 10:39)