Tutorial
Windows Drag und Drop Tutorial
von  stephanbrunker | Seite 12 von 12 | 
CFSTR_FILEDESCRIPTOR - IStream-Variante
Da sich nur das TYMED bei den Filecontents ändert, ändert sich am Code nicht viel, wir bauen nur ein ELSEIF ein:
    ElseIf (cFlags And C_CONTSTREAM) Then
        'Format FILECONTENT as ISTREAM
        Dim i As Integer
        For i = 0 To nFiles-1
            pStream(i) = New ISTREAM(filepath(i)&filetitle (i))
            fmtetc(index+i) = divfmtetc(4)
            fmtetc(index+i).lindex = i
            With stgmed(index+i)
                .tymed = TYMED_ISTREAM
                .pstm = pStream(i)
                .pUnkForRelease = NULL
            End With
        Next i
    EndIf
IStream reagiert aber hier anders als das IDataObject: Hier übernimmt das Dropziel unsere Referenz, im Erfolgsfall würde der Stream also gelöscht. Wir müssen aber auch für den Fall des Misserfolgs planen, dann müssen wir das Interface also selbst löschen. Deshalb fragen wir den Erfolg der DoDragDrop-Operation ab und löschen bei DRAGDROP_S_CANCEL den Stream selbst:
        Dim dropresult As HRESULT
        dropresult=DoDragDrop(pDataObject,pDropSource,DROPEFFECT_COPY,@dweffect)
        Print "Dragdrop complete"
        'release the IStream if operation was canceled
        If (dropresult = DRAGDROP_S_CANCEL) And (cFlags And C_CONTSTREAM) Then
            Dim i As Integer
            For i = 0 To nFiles-1
                    pStream(i)->Release()
            Next i
        EndIf
Mit Version 1.00 des Compilers meckert er bei der Zuweisung "unseres" IStream-Pointes zu dem .pstm - Member von STGMEDIUM, da es ganz streng genommen ja nicht mehr der gleiche Pointertyp ist, Version 0.90 war das noch egal. Damit der Code mit V1.00 compiliert, müssen wir also alles ändern, was an unserem IStream noch dranhängt:
#Undef STGMEDIUM
#Undef LPSTGMEDIUM
#Undef LPSTREAM
#Undef ReleaseStgMedium
#Undef ISequentialStream
#Undef IStream
Type ISequentialStream EXTENDS IUnknown
....
Type IStream EXTENDS ISequentialStream
.....
Type LPSTREAM As IStream Ptr
type STGMEDIUM
    tymed as DWORD
    union
        hBitmap as HBITMAP
        hMetaFilePict as PVOID
        hEnhMetaFile as HENHMETAFILE
        hGlobal as HGLOBAL
        lpszFileName as LPWSTR
        pstm as LPSTREAM
        pstg as LPSTORAGE
    end union
    pUnkForRelease as LPUNKNOWN
end Type
Type LPSTGMEDIUM as STGMEDIUM Ptr
declare sub ReleaseStgMedium alias "ReleaseStgMedium" (byval as LPSTGMEDIUM)
Das finale Programm
Für das finale Projekt habe ich den Dialog um ein paar Checkboxen erweitert, um beliebige Formate für den Datenaustausch auswählen zu können:
Das Programm ist nicht ganz fehlerfrei. CF_HDROP erlaubt auch den Drop von Verzeichnissen. Wenn man dann versucht, dieses Verzeichnis als CFSTR_FILEDESCRIPTOR zu kopieren, dann versucht er das Verzeichnis als Datei zu öffnen, was natürlich nicht funktioniert ...
Dazu gehört dann auch der komplette Quellcode:
DragDrop5.zip
| Zusätzliche Informationen und Funktionen | |||||||
|---|---|---|---|---|---|---|---|
				
  | 
			
				
 
  | 
		||||||



			FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!
 Gehe zu Seite  
 Bearbeiten
 Versionen