Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Syntax aus delphi7 für DLL-call in AHK übersetzen



  • Please log in to reply
18 replies to this topic
just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011
✓  Best Answer

Hallo,

 

nach Allem, was da steht, vermuten die Beteiligten, dass sich die DLL beim Laden initialisiert und deshalb zwischen zwei DllCalls, bei denen die DLL geladen und wieder entladen wird, das per FT_Open() ermittelte Handle ungültig wird. Du solltest das ausprobieren.


Prefer ahkscript.org for the time being.


pebe54
  • Members
  • 17 posts
  • Last active: Jan 24 2014 05:26 PM
  • Joined: 16 Jan 2013

Hallo,

ich habe es ausprobiert - und es funktioniert grin.png

Nur einen kleinen Haken hat die ganze Sache nun doch noch. Die Relais werden binär angesprochen (1=Relais1|2=Relais2|4=Relais3|8=Relais4|....|128=Relais8   => 255 = alle ein  => 0 = alle aus  => 3 = R1+R2 ein). Mit den gesetzen BitModus oden den bei FT_Write gesetzen Werten stimmt was nicht.

So wie ich das Script geschrieben habe sollte folgendes passieren:

Drücke ESC => Relais 1 ein , loslasen => Relais 1 aus, und bei TAB das gleiche mit Relais 2

Und das passiert: Beim ersten Drücken von ESC oder TAB schaltet das betreffende Relais und die Relais 7und 8 dazu ein. Beim Loslassen schaltet das betreffende Relais ab, aber die Relais 7und 8 bleiben an. Ich habe schon versucht die Werte als Hex zuschreiben zB. 0x10 für Relais 5 - in diesem Fall schalten die Relais 7und 8 ein. Gebe ich bO_Mask := 16 ein, schaltet Relais 1 ein/aus und Relais 8und 8 schalten ein und bleiben ein.sad.png

Und hier das Script:

;***********Steuerung USB-Relais**********
;1=Relais1|2=Relais2|4=Relais3|8=Relais4|....|128=Relais8|   => 255 = alle ein  => 0 = alle aus  => 3 = R1+R2 ein  => 12 = R3+R4 ein
FT_hd := 0            ; DWORD (FT_Handle)     -> UInt
dwDevCount := 0   ; DWORD                        -> UInt
Result := 0            ; Integer (FT_Result)        -> Int
bIO_Mask := 0      ; Byte                             -> UChar
bO_Mask := 0       ; Byte                            -> UChar
iWritten := 0          ; Integer                         -> Int
H := A_ScreenHeight-100
FT_LIST_NUMBER_ONLY := 0x80000000

 

hModule := DllCall("LoadLibrary", "Str", "ftd2xx.dll", "Ptr") 
Result := DllCall("ftd2xx.dll\FT_ListDevices", "UIntP", dwDevCount, "Ptr", 0, "UInt", FT_LIST_NUMBER_ONLY, "Int")
Result := DllCall("ftd2xx.dll\FT_Open", "Int", 0, "UIntP", FT_hd, "Int")
if Result <> 0
{
Reload
}
 bIO_Mask := 255
Result := DllCall("ftd2xx.dll\FT_SetBitMode", "UInt", FT_hd, "UChar", bIO_Mask, "UChar", 0x01, "Int")

 

TAB::
Esc::                                                                                      
while GetKeyState("Esc")
{
bO_Mask := 1
Result := DllCall("ftd2xx.dll\FT_Write", "UInt", FT_hd, "Ptr", &bO_Mask, "Int", 1, "IntP", iWritten, "Int")
 StatusWrite := Result
 Gui, +AlwaysOnTop +Disabled -Caption
 Gui, Font, s24, Verdana
 Gui, Color, EEAA99
 Gui +LastFound 
 WinSet, TransColor, EEAA99
 Gui, Add, Text,, - Relais binär %bO_Mask% ein -
 Gui, Show, xCenter y%H%, NoActivate, Volumen
}
while GetKeyState("TAB")
{
bO_Mask := 2
Result := DllCall("ftd2xx.dll\FT_Write", "UInt", FT_hd, "Ptr", &bO_Mask, "Int", 1, "IntP", iWritten, "Int")
 StatusWrite := Result  
 Gui, +AlwaysOnTop +Disabled -Caption 
 Gui, Font, s24, Verdana 
 Gui, Color, EEAA99
 Gui +LastFound 
 WinSet, TransColor, EEAA99
 Gui, Add, Text,, - Relais binär %bO_Mask% ein -
 Gui, Show, xCenter y%H%, NoActivate, Volumen
}
 Gui, Destroy

bO_Mask := 0
Result := DllCall("ftd2xx.dll\FT_Write", "UInt", FT_hd, "Ptr", &bO_Mask, "Int", 1, "IntP", iWritten, "Int")
Return 
DllCall("FreeLibrary", "Ptr", hModule)



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Wie ich mir schon dachte,

bO_Mask := Chr(3) ; hier muss wahrscheinlich ein Zeichen genutzt werden, das den ASCII-Wert 0x03 repräsentiert

 

Schau Dir das mal an:

Byte := 1
Binary1 := GetBinary(NumGet(Byte, 0, "UChar"))
Byte := Chr(1)
Binary2 := GetBinary(NumGet(Byte, 0, "UChar"))
MsgBox, 0, Binärwerte, 1`t=`t%Binary1%`nChr(1)`t=`t%Binary2%
ExitApp

GetBinary(Byte) {
   Binary := ""
   Loop, 8
      Binary .= (Byte >> (8 - A_Index)) & 1
   Return Binary
}

 

Bei bIO_Mask := 255 klappt das nur, weil bei der Umwandlung in ein "UChar" der numerische Wert verwendet wird.

 

 

Edit: Mach es lieber mit NumPut(), sonst kannst Du den Binärwert 0 für "Alle aus" nicht setzen.


Prefer ahkscript.org for the time being.


pebe54
  • Members
  • 17 posts
  • Last active: Jan 24 2014 05:26 PM
  • Joined: 16 Jan 2013

grin.png Super, jetzt stimmt alles!

Ich danke Allen die mir geholfen haben, denn ohne Eure Kompetenz hätte ich es nie geschafft.