Wenn ich mir jetzt bei Microsoft die Beschreibung anschaue:
IFileOperation::CopyItem method (shobjidl_core.h)
Da finde ich dann unten ein C++ Beispiel für die Benutzung - das müsste ich ja in Delphi umsetzen...
d.h. ich benötige zuerst
CoInitializeEx - verfügbar in der
ComObj-
Unit, dann
CoCreateInstance - verfügbar ebenfall in der
ComObj-
Unit; oder ich verwende direkt
CreateComObject aus der selben
Unit...
Für den CoCreateInstance-Aufruf - oder für den Cast (?) des IUnknown-Objektes, das bei CreateComObject zurück kommt) benötige ich eine Pascal Definition der IFileOperation-Schnittstelle, weil ich diese ja zurück bekomme (
IFileOperation *pfo im C++ Beispiel, verwendet über das Makro
IID_PPV_ARGS()):
Code:
extern "C++"
{
template<typename T> _Post_equal_to_(pp) _Post_satisfies_(return == pp) void** IID_PPV_ARGS_Helper(T** pp);
}
#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
(wie soll ich denn das umsetzen?)
In C++ ist das Interface IFileOperation so definiert:
Code:
IFileOperation : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE Advise(
/* [in] */ __RPC__in_opt IFileOperationProgressSink *pfops,
/* [out] */ __RPC__out DWORD *pdwCookie) = 0;
virtual HRESULT STDMETHODCALLTYPE Unadvise(
/* [in] */ DWORD dwCookie) = 0;
virtual HRESULT STDMETHODCALLTYPE SetOperationFlags(
/* [in] */ DWORD dwOperationFlags) = 0;
virtual HRESULT STDMETHODCALLTYPE SetProgressMessage(
/* [string][in] */ __RPC__in_string LPCWSTR pszMessage) = 0;
virtual HRESULT STDMETHODCALLTYPE SetProgressDialog(
/* [in] */ __RPC__in_opt IOperationsProgressDialog *popd) = 0;
virtual HRESULT STDMETHODCALLTYPE SetProperties(
/* [in] */ __RPC__in_opt IPropertyChangeArray *pproparray) = 0;
virtual HRESULT STDMETHODCALLTYPE SetOwnerWindow(
/* [in] */ __RPC__in HWND hwndOwner) = 0;
virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItem(
/* [in] */ __RPC__in_opt IShellItem *psiItem) = 0;
virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItems(
/* [in] */ __RPC__in_opt IUnknown *punkItems) = 0;
virtual HRESULT STDMETHODCALLTYPE RenameItem(
/* [in] */ __RPC__in_opt IShellItem *psiItem,
/* [string][in] */ __RPC__in_string LPCWSTR pszNewName,
/* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
virtual HRESULT STDMETHODCALLTYPE RenameItems(
/* [in] */ __RPC__in_opt IUnknown *pUnkItems,
/* [string][in] */ __RPC__in_string LPCWSTR pszNewName) = 0;
virtual HRESULT STDMETHODCALLTYPE MoveItem(
/* [in] */ __RPC__in_opt IShellItem *psiItem,
/* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder,
/* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszNewName,
/* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
virtual HRESULT STDMETHODCALLTYPE MoveItems(
/* [in] */ __RPC__in_opt IUnknown *punkItems,
/* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder) = 0;
virtual HRESULT STDMETHODCALLTYPE CopyItem(
/* [in] */ __RPC__in_opt IShellItem *psiItem,
/* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder,
/* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszCopyName,
/* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
virtual HRESULT STDMETHODCALLTYPE CopyItems(
/* [in] */ __RPC__in_opt IUnknown *punkItems,
/* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder) = 0;
virtual HRESULT STDMETHODCALLTYPE DeleteItem(
/* [in] */ __RPC__in_opt IShellItem *psiItem,
/* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
virtual HRESULT STDMETHODCALLTYPE DeleteItems(
/* [in] */ __RPC__in_opt IUnknown *punkItems) = 0;
virtual HRESULT STDMETHODCALLTYPE NewItem(
/* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder,
/* [in] */ DWORD dwFileAttributes,
/* [string][in] */ __RPC__in_string LPCWSTR pszName,
/* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszTemplateName,
/* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
virtual HRESULT STDMETHODCALLTYPE PerformOperations( void) = 0;
virtual HRESULT STDMETHODCALLTYPE GetAnyOperationsAborted(
/* [out] */ __RPC__out BOOL *pfAnyOperationsAborted) = 0;
};
Dafür brauche ich dann wieder eine Definition von
IShellItem, das ich leider auch nicht in meinen Delphi-Quellen als Umsetzung finde;
Hier die C++-Definition:
Code:
IShellItem : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE BindToHandler(
/* [unique][in] */ __RPC__in_opt IBindCtx *pbc,
/* [in] */ __RPC__in REFGUID bhid,
/* [in] */ __RPC__in REFIID riid,
/* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
virtual HRESULT STDMETHODCALLTYPE GetParent(
/* [out] */ __RPC__deref_out_opt IShellItem **ppsi) = 0;
virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
/* [in] */ SIGDN sigdnName,
/* [annotation][string][out] */
_Outptr_result_nullonfailure_ LPWSTR *ppszName) = 0;
virtual HRESULT STDMETHODCALLTYPE GetAttributes(
/* [in] */ SFGAOF sfgaoMask,
/* [out] */ __RPC__out SFGAOF *psfgaoAttribs) = 0;
virtual HRESULT STDMETHODCALLTYPE Compare(
/* [in] */ __RPC__in_opt IShellItem *psi,
/* [in] */ SICHINTF hint,
/* [out] */ __RPC__out int *piOrder) = 0;
};
Uff - und wenn ich da in der Definition irgendwas nicht korrekt umsetze, wird's beim Aufruf wahrscheinlich einfach "knallen" und ich weiß nicht warum...
Mal schauen, wie /ob ich damit weiter komme...