string in byte array

Anfängerfragen zum Programmieren mit PureBasic.
Georg
Beiträge: 29
Registriert: 17.06.2005 19:04

string in byte array

Beitrag 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
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: string in byte array

Beitrag 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.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Georg
Beiträge: 29
Registriert: 17.06.2005 19:04

Re: string in byte array

Beitrag von Georg »

Hallo _JON_

hatte ich schon ohne Erfolg versucht.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: string in byte array

Beitrag 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

PB v5.72 x86/x64
Windows 10 Pro 64bit
Georg
Beiträge: 29
Registriert: 17.06.2005 19:04

Re: string in byte array

Beitrag 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
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: string in byte array

Beitrag 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

PB v5.72 x86/x64
Windows 10 Pro 64bit
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: string in byte array

Beitrag von - chris - »

#AHID_LICENSE_ERROR wird zurück gegeben wenn die 30 Tage abgelaufen sind.
PB v5.72 x86/x64
Windows 10 Pro 64bit
Georg
Beiträge: 29
Registriert: 17.06.2005 19:04

Re: string in byte array

Beitrag von Georg »

Warum musst Du PrototypeC verwenden?
Bei mir funktioniert Prototype bis jetzt ohne Fehler.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: string in byte array

Beitrag 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

PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: string in byte array

Beitrag 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.
Antworten