Seite 1 von 2
string in byte array
Verfasst: 07.02.2015 14:42
von Georg
Hallo,
eine Funktion in einer DLL (AHid.dll) will als 2. Parameter einen String
in einem Byte-Array.
Im Beispiel(vb.NET) wird das so gemacht:
Dim parm1 As Byte()
'Enter license information here.
parm1 = System.Text.Encoding.ASCII.GetBytes("0")
DLL-Funktion:
AHid_Init(HWnd, parm1)
Wie kann man das in PB machen?
Danke für Hilfe.
Gruß Georg
PB 5.31
Vista 32bit
Re: string in byte array
Verfasst: 07.02.2015 15:02
von _JON_
Ich würde einfach die Adresse des Strings übergeben.
AHid_Init(HWnd, @string)
gegeben falls vorher noch in ASCII umwandeln, falls Du als Unicode kompilierst.
Re: string in byte array
Verfasst: 07.02.2015 21:06
von Georg
Hallo _JON_
hatte ich schon ohne Erfolg versucht.
Re: string in byte array
Verfasst: 07.02.2015 21:45
von - chris -
So klappt es bei mir, wenn ich "AHid_Init" weg lasse kommt die Info:
"Dear customer, your Trial Period has expired."
mit "AHid_Init":
"Dear customer, your Trial Period expires in 30 day(s)."
Code: Alles auswählen
EnableExplicit
IncludeFile "AHid.pbi"
Define *parm1, res.i, hwnd.i
*parm1 = AllocateMemory(1024)
If *parm1 = 0
End
EndIf
If AHid_OpenDLL()
PokeS(*parm1, "0", -1, #PB_Ascii)
res = AHid_Init(hwnd, *parm1)
Debug res
AHid_Info()
AHid_CloseDLL()
EndIf
End
Re: string in byte array
Verfasst: 08.02.2015 04:42
von Georg
Hallo -chris-
danke für Dein Antwort.
Auch mit Deiner Version gibt AHid_Init den Wert AHID_LICENSE_ERROR zurück.
Ich habe aber die Dll erst seit ein paar Tagen und war der Meinung, dass man Sie
mit "0" testen kann. (Eingeschränkter Umfang) Wie auf
http://www.mikrocontroller.net/topic/210792 vom Autor beschrieben.
Werde mich mal mit dem Autor in Verbindung setzen.
Nutzt du die Dll? Wenn ja, wie bist Du mit ihr zufrieden?
Gruß Georg
Re: string in byte array
Verfasst: 08.02.2015 12:36
von - chris -
Ich benutze die dll nocht nicht , erstmal nur testen.
Ich hab jetzt bemerkt das man die Funktionen mit
PrototypeC deklarieren muss.
Hier meine komplette Include:
Code: Alles auswählen
;http://ahidlib.com/
;Windows messages.
#AHID_DEVICECHANGE = #WM_DEVICECHANGE
#AHID_DATARECEIVED = #WM_USER + 101
;Report types.
#AHID_REPTYPE_INT_IN = 0
#AHID_REPTYPE_INT_OUT = 1
#AHID_REPTYPE_FEATURE = 2
;Status values.
#AHID_OK = 0
#AHID_ATTACHED = 1
#AHID_REMOVED = 2
#AHID_NOT_LISTED = 3
#AHID_IO_ERROR = 4
#AHID_NOT_INITIALIZED = 5
#AHID_LICENSE_ERROR = 6
#AHID_OTHER_ERROR = 7
#AHID_WRONG_PARAMETER = 8
#AHID_NOT_INVOLVED = 9
#AHID_OS_NOT_SUPPORTED = 10
Global AHid_hDLL.i
;- Prototype
PrototypeC.i AHid_Attached(pipe.i, wparm.i, lparm.i)
PrototypeC.i AHid_Deregister(pipe.i)
PrototypeC.i AHid_Find(pipe.i)
PrototypeC.i AHid_Info()
PrototypeC.i AHid_Init(hwnd, *parm1)
PrototypeC.i AHid_Read(pipe.i, *buffer, to_read.i, *read)
PrototypeC.i AHid_Register(*pipe, vid.i, pid.i, mi.i, rep_id.a, rep_size.a, rep_type.a)
PrototypeC.i AHid_Request(pipe.i)
PrototypeC.i AHid_Setup(pipe.i)
PrototypeC.i AHid_Write(pipe.i, *buffer, to_write.i, *written)
Procedure AHid_CloseDLL()
If AHid_hDLL <> 0
If IsLibrary(AHid_hDLL)
CloseLibrary(AHid_hDLL)
EndIf
AHid_hDLL = 0
EndIf
EndProcedure
Procedure AHid_OpenDLL()
AHid_hDLL = OpenLibrary(#PB_Any, "AHid.dll")
If AHid_hDLL = 0
ProcedureReturn #False
EndIf
Global AHid_Attached.AHid_Attached=GetFunction(AHid_hDLL,"AHid_Attached")
Global AHid_Deregister.AHid_Deregister=GetFunction(AHid_hDLL,"AHid_Deregister")
Global AHid_Find.AHid_Find=GetFunction(AHid_hDLL,"AHid_Find")
Global AHid_Info.AHid_Info=GetFunction(AHid_hDLL,"AHid_Info")
Global AHid_Init.AHid_Init=GetFunction(AHid_hDLL,"AHid_Init")
Global AHid_Read.AHid_Read=GetFunction(AHid_hDLL,"AHid_Read")
Global AHid_Register.AHid_Register=GetFunction(AHid_hDLL,"AHid_Register")
Global AHid_Request.AHid_Request=GetFunction(AHid_hDLL,"AHid_Request")
Global AHid_Setup.AHid_Setup=GetFunction(AHid_hDLL,"AHid_Setup")
Global AHid_Write.AHid_Write=GetFunction(AHid_hDLL,"AHid_Write")
ProcedureReturn #True
EndProcedure
Code: Alles auswählen
EnableExplicit
IncludeFile "AHid.pbi"
Define *parm1, res.i, hwnd.i
*parm1 = AllocateMemory(1024)
If *parm1 = 0
End
EndIf
If AHid_OpenDLL()
PokeS(*parm1, "0", -1, #PB_Ascii)
res = AHid_Init(hwnd, *parm1)
Debug res
If res = #AHID_OK
AHid_Info()
EndIf
AHid_CloseDLL()
EndIf
End
Re: string in byte array
Verfasst: 08.02.2015 14:56
von - chris -
#AHID_LICENSE_ERROR wird zurück gegeben wenn die 30 Tage abgelaufen sind.
Re: string in byte array
Verfasst: 08.02.2015 16:27
von Georg
Warum musst Du PrototypeC verwenden?
Bei mir funktioniert Prototype bis jetzt ohne Fehler.
Re: string in byte array
Verfasst: 08.02.2015 16:32
von - chris -
Hier kommt ohne PrototypeC:
"[15:30:23] [ERROR] Ungültiger Speicherzugriff. (Lesefehler an der Adresse 0)"
Code: Alles auswählen
EnableExplicit
IncludeFile "AHid.pbi"
Global *parm1
*parm1 = AllocateMemory(1024)
If *parm1 = 0
End
EndIf
Procedure init()
Protected res.i, hwnd.i
PokeS(*parm1, "012345678", -1, #PB_Ascii)
res = AHid_Init(hwnd, *parm1)
Debug res
AHid_Info()
EndProcedure
If AHid_OpenDLL()
init()
AHid_CloseDLL()
EndIf
End
Re: string in byte array
Verfasst: 08.02.2015 16:33
von edel
Die Funktionen wurden mit CDECL (in PB z.B. ProcedureC) kompiliert.
http://de.wikipedia.org/wiki/Aufrufkonvention
Auch wenn jetzt STDCALL (Standard unter PB) funktionieren mag, frueher oder spaeter fuehrt das zum Absturz.