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 | |||||||
---|---|---|---|---|---|---|---|
|
|