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.