Newsgroup: it.comp.lang.visual-basic
Titolo: Visualizzare frames da una dll

Ho una dll fornita da un collega. (non è una DLL com)
Con questa libreria mi connetto ad un server che gestisce delle
sorgenti video.
Da questa dll ricevo tramite callback i frame delle telecamere che ho
selezionato.
E' stato un po' un delirio ma alla fine la callback sono riuscito a
farla funzionare.
questa è la dichirazione della callback, che la dll mi chiama ogni
volta che deve mandare un frame (e funzia), nel senso che viene
regolarmente invocata.
Public Sub FrameProc( _
ByVal hPlayer As Long, _
ByRef pBhi As BITMAPINFOHEADER, _
ByVal pFrameDataSrc As Long, _
ByVal pUserData As Long)
hplayer è l'handle del player a cui è associato il flusso video
pbhi sono le informazioni di header del frame (il tipo
bitmapinfoheader è un external reference che si trova anche in msdn)
pFrameDataSrc è l'indirizzo dell'area di memoria che contiene i dati
del frame.
pUserData è l'handle del player da cui proviene il frame (ce ne puo'
essere piu di uno)
Ora, il fatto è che io ricevo appunto le chiamate di questa callback,
ma non capisco come devo fare per vedere il frame.
Il collega mi ha detto di usare la funzione SetDIBitsToDevice
Ho creato un picture box, e dalla callback chiamo questa
SetDIBitsToDevice, passandole l'handle del picturebox e i relativi
puntatori e valori che chiede.
Il problema pero' è che nel picturebox non vedo niente, non capisco
quindi dove stia il mio errore. Sono fermo, e al momento non posso
chiedere lumi al collega che mi ha scritto questa dll.
Il mio codice dentro la callback che riceve i frame
Public Sub FrameProc( _
ByVal hPlayer As Long, _
ByRef pBhi As BITMAPINFOHEADER, _
ByVal pFrameDataSrc As Long, _
ByVal pUserData As Long)
    Dim rgbq As RGBQUAD
    rgbq.rgbBlue = 0
    rgbq.rgbGreen = 0
    rgbq.rgbRed = 0
    rgbq.rgbReserved = 0
    Dim bi As BITMAPINFO
    bi.bmiColors = rgbq
    bi.bmiHeader.biBitCount = pBhi.biBitCount
    bi.bmiHeader.biClrImportant = pBhi.biClrImportant
    bi.bmiHeader.biClrUsed = pBhi.biClrUsed
    bi.bmiHeader.biCompression = pBhi.biCompression
    bi.bmiHeader.biHeight = pBhi.biHeight
    bi.bmiHeader.biPlanes = pBhi.biPlanes
    bi.bmiHeader.biSize = pBhi.biSize
    bi.bmiHeader.biSizeImage = pBhi.biSizeImage
    bi.bmiHeader.biWidth = pBhi.biWidth
    bi.bmiHeader.biXPelsPerMeter = pBhi.biXPelsPerMeter
    bi.bmiHeader.biYPelsPerMeter = pBhi.biYPelsPerMeter
    Debug.Print Now & " - Player Callback call"
    Debug.Print bi.bmiHeader.biBitCount& & ""
    Debug.Print bi.bmiHeader.biClrImportant & ""
    Debug.Print bi.bmiHeader.biClrUsed & ""
    Debug.Print bi.bmiHeader.biCompression & ""
    Debug.Print bi.bmiHeader.biHeight & ""
    Debug.Print bi.bmiHeader.biPlanes & ""
    Debug.Print bi.bmiHeader.biSize & ""
    Debug.Print bi.bmiHeader.biSizeImage & ""
    Debug.Print bi.bmiHeader.biWidth & ""
    Debug.Print bi.bmiHeader.biXPelsPerMeter & ""
    Debug.Print bi.bmiHeader.biYPelsPerMeter & ""
    Debug.Print pFrameDataSrc
    Call SetDIBitsToDevice(frmPlayerManagement.PbShowFrames.hDC, 0, 0,
352, 288, 0, 0, 0, 288, pFrameDataSrc, bi, 0)
    frmPlayerManagement.PbShowFrames.Refresh
End Sub
Un grazie a chiunque abbia qualche aiuto da darmi.

 Ho una dll fornita da un collega. (non è una DLL com)
ce l'ho fatta raga... non immaginate la gioia... :-)
Era un argomento della callback (il puntatore all'area di memoria che
contiene i dati del frame) che invece di byval andava byref.