Newsgroup: it.comp.programmare.win32
Titolo: LineGetID e WaveOutOpen

Salve a tutti,
 vorrei mandare sul modem un suono wave. La cosa sono riuscita a farla
in linguaggio C, ma non riesco a tradurre in VisualBasic (che conosco
poco ma sono costretto ad usare).
Le due istruzioni C che uso per ottenere l'ID del wave-out sono le
seguenti:
   if (lRet = lineGetID(0, 0, hCall, LINECALLSELECT_CALL, pVarString,
TEXT("wave/out")))
    { // errore
     return FALSE;
    }
   WaveOutID = *(UINT *)((LPBYTE)pVarString +
pVarString->dwStringOffset);
dove WaveOutID è un intero (UINT) e pVarString è di tipo PVARSTRING
(puntatore a struttura VARSTRING)
Poi WaveOutID viene passto alla funzione WaveOutOpen.
In VisualBasic ho fatto:
Dim lpDeviceID As VARSTRING
 
 lret = lineGetID(0, 0, lphCall, LINECALLSELECT_CALL, lpDeviceID,
"wave/out")
WaveOutId = ?????
E non riesco a ricavare il WaveOutId da passare a WaveOutOpen
Qualcuno sa darmi una dritta (o magari un pezzetto di codice in cui si
associa al modem su cui e' attiva una chiamata un identificativo da
passare alla WaveOutOpen) ?
Grazie.

 poco ma sono costretto ad usare).
Costretto ad usare VisualBasic vuol dire che non puoi utilizzare il codice
che hai gia' fatto ( funzionante ) in una dll?
HOWTO: Write C DLLs and Call Them from Visual Basic (Q106553)
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q106553
HOWTO: Pass a String Between Visual Basic and Your C DLL (Q187912)
http://support.microsoft.com/support/kb/articles/Q187/9/12.ASP
Fammi sapere, al limite se proprio si deve, penso che ci si possa arrivare
anche in vb.
Saluti,
Alex

che hai gia' fatto ( funzionante ) in una dll?
yes.
Vogliono vedere solo linee in Visual basic...

Ammetto che di tapi e di varstring ne so' poco e niente.
Forse esiste qualche modo piu' semplice di farlo ma
questo e' quello che userei se dovessi affrontare il tuo
problema oggi.
Prima decidi che funzioni usare ( ansi/uni...)
con tuaVARSTRING.dwStringFormat
- STRINGFORMAT_ASCII
- STRINGFORMAT_DBCS
- STRINGFORMAT_UNICODE
- STRINGFORMAT_BINARY
[il binario dovresti poterlo trattare comunque
come ansi] del dbcs sò poco
e mi sembra pure gramoso)
ora potresti usare CopyMemory per estrarre
la porzione di dati che ti interessa
con tuaVARSTRING.dwStringSize e
tuaVARSTRING.dwStringOffset + un altro
puntatore che se ho capito bene e'
VarPtr(tuaVARSTRING) stesso.
Ciao,
Alex
---
Giusto un minimo di codice, visto che dicevi
di non conoscere bene vb, dovresti poter ricavare
quel che ti serve.
Type VARSTRING
 dwTotalSize As Long
 dwNeededSize As Long
 dwUsedSize As Long
 dwStringFormat As Long
 dwStringSize As Long
 dwStringOffset As Long
End Type
Declare Function PtrToStrW Lib "kernel32" Alias "lstrcpyW" _
(ByVal RetVal As String, ByVal Ptr As Long) As Long
Declare Function PtrToStrA Lib "kernel32" Alias "lstrcpyA" _
(ByVal RetVal As String, ByVal Ptr As Long) As Long
Declare Function StrToPtr Lib "kernel32" Alias "lstrcpyW" _
(ByVal Ptr As Long, Source As Byte) As Long
Declare Function PtrToInt Lib "kernel32" Alias "lstrcpynW" _
(RetVal As Any, ByVal Ptr As Long, ByVal nCharCount As Long) As Long
Declare Function StrLenW Lib "kernel32" Alias "lstrlenW" _
(ByVal Ptr As Long) As Long
Declare Function StrLenA Lib "kernel32" Alias "lstrlenA" _
(ByVal Ptr As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByRef hpvDest As Any, ByVal hpvSource As Any, ByVal cbCopy As Long)
'trasforma puntatore a stringa ( in questo caso solo ansi )
Public Function StrPtrToStr(ByVal SrcStrPtr As Long) As String
    Dim DestStrLen As Long
    DestStrLen = StrLenA(SrcStrPtr)
    If DestStrLen > 0 Then
        StrPtrToStr = Space(DestStrLen)
        PtrToStrA StrPtrToStr, SrcStrPtr
    Else
        StrPtrToStr = ""
    End If
End Function