Problem mit DLL Funktion

  • Hi
    also ich habe eine dll datei ,womit ich einen USB HighSpeed Interface Modul ansprechen kann .

    um das Usb Modul zu Initialisieren zu können muss ich zuerst der Dll die funktion Devnum mitteilen :

    DllOpen("Usb2.dll")
    DllCall("usb2.dll", "int", "UsbInit","int",0,"int",0)

    die dll reagiert mit nem Fenster wo mit geteilt wird (das es ne Demo wehre und alle 5 Minuten wieder kommt)
    dann ein Fenster von Windows ( autoit v3 Script funktioniert nicht mehr )
    autoit zeigt mir darauf hin das an :
    !>19:02:57 AutoIT3.exe ended.rc:-1073741819
    >Exit code: -1073741819 Time: 94.120

    so an was kann das liegen ?
    Ps (wieso ist kann ich in opera keine Skripte rein setzen ,da fehlt ne leiste und smiles kann man auch net machen )

    Einmal editiert, zuletzt von FunH@cker (5. Juni 2010 um 23:56) aus folgendem Grund: Tehma gendert da es nicht mehr um das abstürzen des Skriptes geht sonder um die Funktion einer Dll Datei

  • hmm ist das so richtig

    [autoit]


    DllOpen("Usb2.dll")
    DllCall("usb2.dll", "str", "UsbInit","str",0,"str",0)

    [/autoit]

    da es immer noch das problem gibt ?(

  • Versuch es mal mit

    DllCall("usb2.dll", "str", "UsbInit","int",0,"int",0)

    oder

    DllCall("usb2.dll", "wchar", "UsbInit","int",0,"int",0)

    Denke das hat Sprenger damit gemeint ;)

    21 is only half the truth.

  • ich glaube ich habs aber jetzt n neues Problem da er mir immer 1 ausgibt bei UsbGetError (soll eigenlich 0 ausgeben da er an dem Pc hengt)
    ich glaube er kann nicht das Usb Modul Initialisieren und deshalb die 1 !

    [autoit]


    DllOpen("Usb2.dll")
    DllCall("usb2.dll", "ubyte", "UsbInit","ubyte",0)
    $error = DllCall("usb2.dll","ubyte","UsbGetError")
    MsgBox(0,"Test",$error)

    [/autoit]

    einer hat mir gesagt das man eventuel ubyte deklarieren soll aber wie macht man dass ?

    er meinte so was
    ubyte x;
    $error =x;
    (kennt autoit nicht)

  • hi
    habs jetzt geschaft nun muss ich dass hier :

    Spoiler anzeigen


    char usbParArray[152] = {0x00,0xE2,0xFF,0x20,0x00,0x00,0xFF,0xE4,
    0x11,0x01,0x02,0x00,0x04,0x00,0x00,0x00,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    // call "UsbParInitUsingArray(0, &usbParArray[0]);" to initialize

    als array in
    einer funktion in der dll übergeben !
    oder per pointer der dll FUNKTION übergeben :|
    weis einer wie das geht ?

    ______________________________________________________________ New

    jo hab von bug-fix seite : http://bug-fix.info/dll/dll_tut.html

    versucht den Pointer zu setzen aber das funst net so wie ich dachte ?(

    wo sind hier die fehler habe es 1:1 abgeschrieben halt mit meinen funktionen

    [autoit]


    Local $countElements = 1
    Local $macStringLen = 152
    Local $structChar = "ptr[" & $countElements & "];" & _
    "char[" & $maxStringLen & "];" & _
    "char[" & $maxStringLen & "];" & _
    Local $arrchar = DllStructCreate($structChar)

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

    DllStructSetData($arrchar,1 ,DllStructGetPtr($structChar,2)
    DllStructSetData ($arrchar,2,"0x00,0xE2,0xFF,0x20,0x00,0x00,0xFF,0xE4")

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

    $Dll = DllOpen("Usb2.dll")
    $init = DllCall($dll, "ubyte", "UsbInit","ubyte",0)
    $error = DllCall($dll,"ubyte","UsbGetError")
    $Iodir = DllCall($dll, "ubyte", "UsbSetIODir","ubyte",0,"ubyte",0,"ubyte",1)
    ;$Portstate= DllCall($dll, "ubyte", "UsbSetPortState","ubyte",0,"ubyte",0,"ubyte",1)
    DllCall($dll, "ubyte", "UsbSetPortState","ubyte",0,"ubyte",0,"ubyte",0)
    DllCall($dll, "ubyte", "UsbParInitUsingArray","ubyte",0,"Ptr",)

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

    DllCall($Dll,"ubyte","UsbParInitUsingArray","ubyte",0,"ptr",DllStructGetPtr($arrchar,1))

    [/autoit]

    2 Mal editiert, zuletzt von FunH@cker (6. Juni 2010 um 01:21)

    • Offizieller Beitrag

    als array in
    einer funktion in der dll übergeben


    Da vertue ich mich auch meist bei. Es ist sicherlich als Pointer zu übergeben - aber nicht als Pointer-Array, sondern als 'normales' Byte-Array. Versuch mal selbst, ob dir mein Beitrag hier weiterhilft. Ansonsten melde dich wieder (und bitte poste dann mal die Original Funktions- / Parameterbeschreibung).

  • Ich muss sagen , das ist verzwickter als ich dachte
    naja hier die Funktionen die ich grade benutzen will : (mit Beschreibung)

    Spoiler anzeigen


    UsbParInitUsingArray(DevNum, Data : Pointer) ;boolean

    Initialisiert das Parallelinterface mit Hilfe eines 152 Byte großen Arrays. Falls Sie spezielle Anforderungen an den Parallelbus haben, die durch die oben beschriebenen Standard-Modi nicht abgedeckt sind, so können wir den Bus nach Ihren Anforderungen gestalten und schicken Ihnen einen 152 Byte großen Datenblock zu, den Sie mit Hilfe dieser Funktion aktivieren. Ein zusätzlicher Aufruf der Funktion UsbParInit darf dann nicht erfolgen.


    so bei dieser Funktion hänge ich gerade ! Genauer gesagt bei der Datei oder halt Pointer

    BugFix Thx . Bräuchte aber trotzdem hilfe

  • Kannst du uns nicht mal die komplette Dokumentation zugänglich machen?

    Diese Funktion sollte so aufgerufen werden:

    [autoit]


    $bData = Binary("0x00E2FF200000FFE4110102000400000001010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F0000000000000000")

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

    $tData = DllStructCreate("byte[152]")
    DllStructSetData($tData, 1, $bData)
    $pData = DllStructGetPtr($tData)
    $aRet = DllCall($hUSB2dll, "BOOLEAN", "UsbParInitUsingArray", "ptr", $DevNum, "ptr", $pData) ;boolean

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

    $fResult = $aRet[0]

    [/autoit]
  • boolean brauch man nicht gibt nur Errors wieder aber hier ma die Ganzen Dll Funktionen usw http://www.braintechnology.de/braintechnolog…b2dll_help.html

    [autoit]


    $bData = Binary("0x00E2FF200000FFE4110102000400000001010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F0000000000000000")

    [/autoit]

    wiso binary muss doch ein array sein ?

  • das ist ein Array aus bytes ;) Nur lässt es sich auch so befüllen. Und seit der neuesten AutoIt-Version wird auch BOOLEAN unterstützt (du kannst natürlich auch byte verwenden, aber nicht ubyte, das gibt nicht :!: )

  • Zitat

    ubyte, das gibt nicht

    wiso solls kein ubyte geben ?(
    habe noch de frage
    wo haste die zahl her ?

    [autoit]


    0x00E2FF200000FFE4110102000400000001010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F01010101010101070000000000000000FFFFFFFFFFFFFFFF000000000000003F0000000000000000

    [/autoit]

    oder wie hast du die gemacht ??

    das ist ja nicht der Block hier oder ?

    Spoiler anzeigen


    char usbParArray[152] = {0x00,0xE2,0xFF,0x20,0x00,0x00,0xFF,0xE4,
    0x11,0x01,0x02,0x00,0x04,0x00,0x00,0x00,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    // call "UsbParInitUsingArray(0, &usbParArray[0]);" to initialize

  • Das ist genau der Block. und außerdem ist das keine Zahl, sondern ein Binärstring.

    Und ubyte gibt es nicht mehr, da byte schon vorzeichenlos ist. Also ist ubyte sinnlos und wurde deshalb aus den aktuellen AutoIt-Versionen entfernt.

  • hi
    haste auch n Tipp wie ich diese Funktion ansteuern soll ?

    UsbParOut(DevNum : Byte; Data : Pointer; Len : Word)
    baut sich ja auf die Lätzte auf !

    die müsste ja den Block verschieken

    Spoiler anzeigen


    const
    UsbParArray : Array[0..151] of Byte = ($00,$E2,$FF,$20,$00,$00,$FF,$E4,
    $11,$01,$02,$00,$04,$00,$00,$00,
    $0E,$03,$01,$3F,$01,$01,$01,$07,
    $01,$00,$02,$01,$00,$00,$00,$00,
    $FF,$FE,$FE,$FE,$FF,$FF,$FF,$FF,
    $00,$00,$00,$80,$00,$00,$00,$3F,
    $0A,$64,$64,$64,$64,$64,$64,$07,
    $02,$02,$02,$04,$04,$04,$04,$00,
    $FE,$FC,$F8,$FA,$FB,$FF,$FF,$FF,
    $00,$00,$00,$00,$00,$00,$00,$3F,
    $0E,$03,$01,$3F,$01,$01,$01,$07,
    $01,$00,$02,$01,$00,$00,$00,$00,
    $FF,$FE,$FE,$FE,$FF,$FF,$FF,$FF,
    $00,$00,$00,$80,$00,$00,$00,$3F,
    $0A,$64,$64,$64,$64,$64,$64,$07,
    $02,$02,$02,$04,$04,$04,$04,$00,
    $FE,$FC,$F8,$FA,$FB,$FF,$FF,$FF,
    $00,$00,$00,$00,$00,$00,$00,$3F,
    $00,$00,$00,$00,$00,$00,$00,$00);
    { call "UsbParInitUsingArray(0, @UsbParArray);" to initialize }

    oder halt

    [autoit]


    0x00E2FF200000FFE411010200040000000E03013F010101070100020100000000FFFEFEFEFFFFFFFF000000800000003F0A646464646464070202020404040400FEFCF8FAFBFFFFFF000000000000003F0E03013F010101070100020100000000FFFEFEFEFFFFFFFF000000800000003F0A646464646464070202020404040400FEFCF8FAFBFFFFFF000000000000003F000000000000$0000

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


    geht da eventuell genauso wie du das gemacht ?

  • Du kannst es so machen (mit dem Rückgabewert bin ich mir jetzt nicht sicher, aber da keiner angegeben war...)

    [autoit]


    $bData = Binary("0x...")
    $len = BinaryLen($bData)

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

    $tData = DllStructCreate("byte[" & $len & "]")
    DllStructSetData($tData, 1, $bData)
    $pData = DllStructGetPtr($tData)

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

    DllCall($hUSB2dll, "none", "UsbParOut", "Byte", $DevNum, "ptr", $pData, "ushort", $len)

    [/autoit]