Toon posts:

[VB6] String aan DLL doorgeven

Pagina: 1
Acties:
  • 132 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Wie kan me helpen want ik kom er niet uit 8)7

Ik ben bezig met de avicap32.dll vanuit VB, alles werkt naar behoren maar 1 functie kom ik niet uit:

Function capFileSaveDIB(ByVal lwnd As Long, ByVal szName As Long) As Boolean
capFileSaveDIB = SendMessage(lwnd, WM_CAP_FILE_SAVEDIB, 0, szName)
End Function

szName zou ik als Long bij de aanroep moeten meegeven maar het gaat om een string (filenaam). In de SDK staat:

Pointer to the null-terminated string that contains the name of the destination DIB file.

Hoe fabriek ik die pointer as Long in VB ?

Verwijderd

Verwijderd schreef op 13 March 2003 @ 23:20:
Function capFileSaveDIB(ByVal lwnd As Long, ByVal szName As Long) As Boolean
capFileSaveDIB = SendMessage(lwnd, WM_CAP_FILE_SAVEDIB, 0, szName)
End Function

szName:
Pointer to the null-terminated string that contains the name of the destination DIB file.
Dat is hetzelfde als
Function capFileSaveDIB(ByVal lwnd As Long, ByReference szName As Variant) As Boolean
capFileSaveDIB = SendMessage(lwnd, WM_CAP_FILE_SAVEDIB, 0, szName)
End Function

Tenslotte is een pointer hetzelfde als een reference, naar mijn weten. Ik ben niet echt de VB-geek dus misschien moet je er nog wat mee rotzooien.

  • MrC4u
  • Registratie: Maart 2002
  • Laatst online: 12-08 18:16
ByReference moet zijn ByRef. Maar idee was goed :)

..: De 3 H's van Microsoft: Herhalen, Herstarten en Herinstalleren :..


Verwijderd

Topicstarter
Helaas, werkt niet geeft een Type Mismatch op :

capFileSaveDIB = SendMessage(lwnd, WM_CAP_FILE_SAVEDIB, 0, szName)

  • MrC4u
  • Registratie: Maart 2002
  • Laatst online: 12-08 18:16
Is de API ook veranderd voor dit gebruik? (de Declare Function SendMessage...)

..: De 3 H's van Microsoft: Herhalen, Herstarten en Herinstalleren :..


Verwijderd

Topicstarter
Dit zijn de declaraties

Public Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Integer, ByVal lParam As Long) As Long

Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, ByVal dwStyle As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Integer, ByVal hWndParent As Long, _
ByVal nID As Long) As Long

Declare Function capGetDriverDescriptionA Lib "avicap32.dll" ( _
ByVal wDriver As Integer, ByVal lpszName As String, _
ByVal cbName As Long, ByVal lpszVer As String, _
ByVal cbVer As Long) As Boolean

[ Voor 17% gewijzigd door Verwijderd op 13-03-2003 23:38 ]


  • MrC4u
  • Registratie: Maart 2002
  • Laatst online: 12-08 18:16
:X

Stom, ik zie al een fout: Je wil een API oproepen:
Function capFileSaveDIB(ByVal lwnd As Long, ByVal szName As Long) As Boolean
capFileSaveDIB = SendMessage(lwnd, WM_CAP_FILE_SAVEDIB, 0, szName)
End Function
maar daarin verander je zelf de returnwaarde van de functie? Moet er dus geen andere code in capFileSaveDIB staan? Om een paar foutjes op te noemen (maar het kan zijn dat ik er ook naast zit, ben een beetje gaar nu).

..: De 3 H's van Microsoft: Herhalen, Herstarten en Herinstalleren :..


Verwijderd

Topicstarter
Mrc4U schreef op 13 maart 2003 @ 23:43:
:X

Stom, ik zie al een fout: Je wil een API oproepen:

[...]

maar daarin verander je zelf de returnwaarde van de functie? Moet er dus geen andere code in capFileSaveDIB staan? Om een paar foutjes op te noemen (maar het kan zijn dat ik er ook naast zit, ben een beetje gaar nu).
Hoezo, de return is gewoon True of False. Verder werken de andere functies prima. Het gaat puur om de szName.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
een sendMessage API call is geen boolean return maar een long. ook je wParam moet een Long zijn, try this though:

Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA" _
(ByVal Hwnd as Long, ByVal wMsg as Long, _
ByVal wParam as Long, lParam as String) as Long

Strings in VB != C(Windows API) strings (maar dit wist je al?)

als dat niet lukt probeer dan lParam as Any... je gaat dus doorgeven met ByRef rather than ByVal omdat een VB string in feite een BSTR is en een byval gaat daar de header mee doorgeven ipv de string zelf. (+4bytes) door een byref te doen gaat die die +4 zelf doen ...

edit: oppassen met c/p van sites want voor VB zijn de meeste < VB6.0

[ Voor 37% gewijzigd door hobbit_be op 14-03-2003 01:33 ]


Verwijderd

Topicstarter
Strings in VB != C(Windows API) strings (maar dit wist je al?)

Ja, pijnlijke ontdekking

als dat niet lukt probeer dan lParam as Any... je gaat dus doorgeven met ByRef rather than ByVal omdat een VB string in feite een BSTR is en een byval gaat daar de header mee doorgeven ipv de string zelf. (+4bytes) door een byref te doen gaat die die +4 zelf doen ...

Het werkt nu, de fout zat daar inderdaad. Ik had in de VB Resource Kit dat van BSTR en LPSTR al bestudeerd maar kwam er niet uit wat ik fout deed.
Mijn dank, nu kan ik rustig gaan slapen _/-\o_
Pagina: 1