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.