problemer med et API klald

Tags:    visual-basic

jeg benytter et API kald til at hente produkt navnet i en USB HID enhed

i mit .bas modul har jeg indsat følgende kode:

Public Declare Function HidD_GetProductString _
Lib "HID.dll" _
(ByVal HidDeviceObject As Long, _
ByVal Buffer As Long, _
ByVal BufferLength As Long) _
As Boolean


'*** lidt forklaring:
'***
'*** Buffer: Pointer to a caller-allocated buffer that the routine uses to return the
'*** requested product string. The routine returns a NULL-terminated wide
'*** character string.
'***
'*** BufferLength: Specifies the length, in bytes, of a caller-allocated buffer provided at Buffer.
'*** If the buffer is not large enough to return the entire NULL-terminated
'*** embedded string, the routine returns nothing in the buffer.

Problemet opstår når jeg skal kalde funktionen fra en sub, det første agument [HidDeviceObject] har jeg styr på, men hvordan opretter jeg den buffer, måske har det noget at gøre med at VB bruger pointer-typen: BSTR og API kaldet retunere i pointer typen LPWSTR

her ses mit kald:

MsgBox (HidD_GetProductString(HIDHandle, ???????, 254))


er der nogen der ved hvordan jeg læser det produkt navnet????

venlig hilsen Joachim Boll



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
jeg benytter et API kald til at hente produkt navnet i en USB HID enhed

i mit .bas modul har jeg indsat følgende kode:

Public Declare Function HidD_GetProductString _
Lib "HID.dll" _
(ByVal HidDeviceObject As Long, _
ByVal Buffer As Long, _
ByVal BufferLength As Long) _
As Boolean


'*** lidt forklaring:
'***
'*** Buffer: Pointer to a caller-allocated buffer that the routine uses to return the
'*** requested product string. The routine returns a NULL-terminated wide
'*** character string.
'***
'*** BufferLength: Specifies the length, in bytes, of a caller-allocated buffer provided at Buffer.
'*** If the buffer is not large enough to return the entire NULL-terminated
'*** embedded string, the routine returns nothing in the buffer.

Problemet opstår når jeg skal kalde funktionen fra en sub, det første agument [HidDeviceObject] har jeg styr på, men hvordan opretter jeg den buffer, måske har det noget at gøre med at VB bruger pointer-typen: BSTR og API kaldet retunere i pointer typen LPWSTR

her ses mit kald:

MsgBox (HidD_GetProductString(HIDHandle, ???????, 254))


er der nogen der ved hvordan jeg læser det produkt navnet????

venlig hilsen Joachim Boll


Du kan gøre det på følgende måde:
Fold kodeboks ind/udKode 


/Michael.



jeg benytter et API kald til at hente produkt navnet i en USB HID enhed

i mit .bas modul har jeg indsat følgende kode:

Public Declare Function HidD_GetProductString _
Lib "HID.dll" _
(ByVal HidDeviceObject As Long, _
ByVal Buffer As Long, _
ByVal BufferLength As Long) _
As Boolean


'*** lidt forklaring:
'***
'*** Buffer: Pointer to a caller-allocated buffer that the routine uses to return the
'*** requested product string. The routine returns a NULL-terminated wide
'*** character string.
'***
'*** BufferLength: Specifies the length, in bytes, of a caller-allocated buffer provided at Buffer.
'*** If the buffer is not large enough to return the entire NULL-terminated
'*** embedded string, the routine returns nothing in the buffer.

Problemet opstår når jeg skal kalde funktionen fra en sub, det første agument [HidDeviceObject] har jeg styr på, men hvordan opretter jeg den buffer, måske har det noget at gøre med at VB bruger pointer-typen: BSTR og API kaldet retunere i pointer typen LPWSTR

her ses mit kald:

MsgBox (HidD_GetProductString(HIDHandle, ???????, 254))


er der nogen der ved hvordan jeg læser det produkt navnet????

venlig hilsen Joachim Boll

Du kan gøre det på følgende måde:
Fold kodeboks ind/udKode 


/Michael.




Jeg har prøvet ovenstående kode, problemet er at sBuf er en string og funktionen forventer en
"long"
Måske skal man oprette en string eks. sBuf og så sende pointeren i et "long" format så kan routinen aflevere string'en vha. pointeren ??
men jeg er meget åben for gode ide'er

VH Joachim Boll



jeg benytter et API kald til at hente produkt navnet i en USB HID enhed

i mit .bas modul har jeg indsat følgende kode:

Public Declare Function HidD_GetProductString _
Lib "HID.dll" _
(ByVal HidDeviceObject As Long, _
ByVal Buffer As Long, _
ByVal BufferLength As Long) _
As Boolean


'*** lidt forklaring:
'***
'*** Buffer: Pointer to a caller-allocated buffer that the routine uses to return the
'*** requested product string. The routine returns a NULL-terminated wide
'*** character string.
'***
'*** BufferLength: Specifies the length, in bytes, of a caller-allocated buffer provided at Buffer.
'*** If the buffer is not large enough to return the entire NULL-terminated
'*** embedded string, the routine returns nothing in the buffer.

Problemet opstår når jeg skal kalde funktionen fra en sub, det første agument [HidDeviceObject] har jeg styr på, men hvordan opretter jeg den buffer, måske har det noget at gøre med at VB bruger pointer-typen: BSTR og API kaldet retunere i pointer typen LPWSTR

her ses mit kald:

MsgBox (HidD_GetProductString(HIDHandle, ???????, 254))


er der nogen der ved hvordan jeg læser det produkt navnet????

venlig hilsen Joachim Boll

Du kan gøre det på følgende måde:
Fold kodeboks ind/udKode 


/Michael.



Jeg har prøvet ovenstående kode, problemet er at sBuf er en string og funktionen forventer en
"long"
Måske skal man oprette en string eks. sBuf og så sende pointeren i et "long" format så kan routinen aflevere string'en vha. pointeren ??
men jeg er meget åben for gode ide'er

VH Joachim Boll


Hej Joachim,

Prøv at lav din streng reference on til en long:
Fold kodeboks ind/udKode 


/Michael.



t