简体   繁体   English

尝试将VS 2008的Delphi接口定义转换为C ++

[英]Trying to convert Delphi interface definition to C++ for VS 2008

I need to convert an interface defined in Delpi to C++. 我需要将在Delpi中定义的接口转换为C ++。 I made small demo project that contains all of the stuff shown below. 做了一个小型演示项目 ,其中包含下面显示的所有内容。

First is the Delphi function that the person claims to be working on this thread : 首先是该人声称正在该线程上工作的Delphi函数:

function CanFileBeDeletedToRecycleBin(const AFileName: UnicodeString): Boolean;
var
  RecycleBinManager: IRecycleBinManager;
begin
  OleCheck(CoCreateInstance(CLSID_RecycleBinManager, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IRecycleBinManager, RecycleBinManager));
  try
    Result := RecycleBinManager.WillRecycle(PWideChar(AFileName)) = S_OK;
  finally
    RecycleBinManager := nil;
  end;
end;

The rest of the Delphi interface definitions are here . 其余的Delphi接口定义在这里

So I came up with the following C++ code that unfortunately crashes. 因此,我想到了以下不幸崩溃的C ++代码。 (Again, let me repeat that the person who wrote Delphi version claims that it works fine for him.) (再次,让我再说一遍,写Delphi版本的人声称它对来说很好用。)

HRESULT hr;

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED);

// {4A04656D-52AA-49DE-8A09-CB178760E748}
const CLSID CLSID_RecycleBinManager = {0x4A04656D, 0x52AA, 0x49DE, {0x8A, 0x09, 0xCB, 0x17, 0x87, 0x60, 0xE7, 0x48}};

// {5869092D-8AF9-4A6C-AE84-1F03BE2246CC}
const IID IID_IRecycleBinManager = {0x5869092D, 0x8AF9, 0x4A6C, {0xAE, 0x84, 0x1F, 0x03, 0xBE, 0x22, 0x46, 0xCC}};

IRecycleBinManager* pIRBM = NULL;

hr = CoCreateInstance(CLSID_RecycleBinManager, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
    IID_IRecycleBinManager, (void**) &pIRBM);
//  hr = SHCoCreateInstance(NULL, &CLSID_RecycleBinManager, NULL, IID_IRecycleBinManager, (void **)&pIRBM);
if (SUCCEEDED(hr))
{
    //I get a crash on the next line:
    //Unhandled exception at 0x76175ed2: 0xC0000005: Access violation writing location 0xa84d252b.
    hr = pIRBM->WillRecycle(L"C:\\test del");

    pIRBM->Release();
}

I tried my best to convert that interface from Delphi ( here ) to C++. 我尽力将该接口从Delphi( 在此 )转换为C ++。 Here's what I got (after @RemyLebeau's suggestions, which unfortunately still didn't work for me.) 这就是我得到的(在@RemyLebeau的建议之后,不幸的是,该建议仍然对我不起作用。)

#pragma pack(push,1)
struct DELETEDITEM
{
    DWORD dwFileSizeLow;
    DWORD dwFileSizeHigh;
#pragma pack(push,8)
    FILETIME ftDeletionTime;
#pragma pack(pop)
    WCHAR szOriginalPath[MAX_PATH];
    WCHAR szDisplacedPath[MAX_PATH];
};
#pragma pack(pop)

enum RECYCLEBIN_TYPE : unsigned char 
{ 
    RBTYPE_VOLUME, 
    RBTYPE_KNOWNFOLDER 
};


#if defined(__cplusplus) && !defined(CINTERFACE)

    MIDL_INTERFACE("6E325F88-D12F-49E5-895B-8EC98630C021")
    IEnumRecycleItems : public IUnknown
    {
    public:
        //virtual HRESULT __stdcall Next(unsigned celt, /* out */ tagDELETEDITEM &rgelt, unsigned &pceltFetched) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Next( 
            __RPC__in ULONG celt,
            __RPC__deref_out DELETEDITEM* rgelt,
            __RPC__deref_out ULONG* pceltFetched
            ) = 0;

        //virtual HRESULT __stdcall Skip(unsigned celt) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Skip( 
            __RPC__in ULONG celt
            ) = 0;

        //virtual HRESULT __stdcall Reset(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Reset(
            void
            ) = 0;

        //virtual HRESULT __stdcall Clone(/* out */ _di_IEnumRecycleItems &ppenum) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Clone( 
            __RPC__deref_out IEnumRecycleItems** ppenum
            ) = 0;

    };




    MIDL_INTERFACE("0125E62F-8349-443A-854B-A55FB84CFA35")
    IRecycle : public IUnknown
    {
    public:
        //virtual HRESULT __stdcall Compact(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Compact(void) = 0;

        //virtual HRESULT __stdcall GetFileData(const System::WideChar * pszPath, /* out */ tagDELETEDITEM &lpData) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetFileData( 
            __RPC__in const WCHAR* pszPath,
            __RPC__deref_out DELETEDITEM* lpData
            ) = 0;

        //virtual HRESULT __stdcall GetItemCount(/* out */ __int64 &lpCount) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetItemCount( 
            __RPC__deref_out __int64* lpCount
            ) = 0;

        //virtual HRESULT __stdcall GetUsedSpace(/* out */ __int64 &lpUsedSpace) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetUsedSpace( 
            __RPC__deref_out __int64* lpUsedSpace
            ) = 0;

        //virtual HRESULT __stdcall IsEmpty(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE IsEmpty( 
            void
            ) = 0;

        //virtual HRESULT __stdcall PurgeAll(_di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE PurgeAll( 
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall PurgeItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE PurgeItems( 
            __RPC__in const WCHAR* lpstrItems,
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall SuspendUpdating(BOOL fSuspend) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE SuspendUpdating( 
            __RPC__in BOOL fSuspend
            ) = 0;

        //virtual HRESULT __stdcall RecycleItem(const System::WideChar * lpstrItem, const unsigned dwAttrs, const __int64 iFileSize, /* out */ _di_IShellItem &psi) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE RecycleItem( 
            __RPC__in const WCHAR* lpstrItem,
            __RPC__in const DWORD dwAttrs,
            __RPC__in const __int64 iFileSize,
            __RPC__deref_out IShellItem** psi
            ) = 0;

        //virtual HRESULT __stdcall RestoreItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE RestoreItems( 
            __RPC__in const WCHAR* lpstrItems,
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall IsRecycled(const System::WideChar * pszPath, PBOOL lpRecycled) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE IsRecycled( 
            __RPC__in const WCHAR* pszPath,
            __RPC__out PBOOL lpRecycled
            ) = 0;

        //virtual HRESULT __stdcall EnumItems(unsigned dwFlags, /* out */ _di_IEnumRecycleItems &EnumRecycleItems) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE EnumItems( 
            __RPC__in DWORD dwFlags,
            __RPC__deref_out IEnumRecycleItems** enm
            ) = 0;

        //virtual HRESULT __stdcall WillRecycle(const System::WideChar * pszPath) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE WillRecycle( 
            __RPC__in const WCHAR* pszPath
            ) = 0;

    };




    MIDL_INTERFACE("F964AD97-96F4-48AB-B444-E8588BC7C7B3")
    IRecycleBin : public IUnknown
    {
    public:
        //virtual HRESULT __stdcall Compact(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Compact(void) = 0;

        //virtual HRESULT __stdcall GetFileData(const System::WideChar * pszPath, /* out */ tagDELETEDITEM &lpData) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetFileData( 
            __RPC__in const WCHAR* pszPath,
            __RPC__deref_out DELETEDITEM* lpData
            ) = 0;

        //virtual HRESULT __stdcall GetItemCount(/* out */ __int64 &lpCount) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetItemCount( 
            __RPC__deref_out __int64* lpCount
            ) = 0;

        //virtual HRESULT __stdcall GetUsedSpace(/* out */ __int64 &lpUsedSpace) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetUsedSpace( 
            __RPC__deref_out __int64* lpUsedSpace
            ) = 0;

        //virtual HRESULT __stdcall IsEmpty(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE IsEmpty( 
            void
            ) = 0;

        //virtual HRESULT __stdcall PurgeAll(_di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE PurgeAll( 
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall PurgeItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE PurgeItems( 
            __RPC__in const WCHAR* lpstrItems,
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall SuspendUpdating(BOOL fSuspend) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE SuspendUpdating( 
            __RPC__in BOOL fSuspend
            ) = 0;

        //virtual HRESULT __stdcall RecycleItem(const System::WideChar * lpstrItem, const unsigned dwAttrs, const __int64 iFileSize, /* out */ _di_IShellItem &psi) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE RecycleItem( 
            __RPC__in const WCHAR* lpstrItem,
            __RPC__in const DWORD dwAttrs,
            __RPC__in const __int64 iFileSize,
            __RPC__deref_out IShellItem** psi
            ) = 0;

        //virtual HRESULT __stdcall RestoreItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE RestoreItems( 
            __RPC__in const WCHAR* lpstrItems,
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall IsRecycled(const System::WideChar * pszPath, PBOOL lpRecycled) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE IsRecycled( 
            __RPC__in const WCHAR* pszPath,
            __RPC__out PBOOL lpRecycled
            ) = 0;

        //virtual HRESULT __stdcall EnumItems(unsigned dwFlags, /* out */ _di_IEnumRecycleItems &EnumRecycleItems) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE EnumItems( 
            __RPC__in DWORD dwFlags,
            __RPC__deref_out IEnumRecycleItems** enm
            ) = 0;

        //virtual HRESULT __stdcall WillRecycle(const System::WideChar * pszPath) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE WillRecycle( 
            __RPC__in const WCHAR* pszPath
            ) = 0;

        //virtual HRESULT __stdcall Initialize(const tagRECYCLEBIN_TYPE rbType, const System::WideChar * pszID) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Initialize(
            __RPC__in const RECYCLEBIN_TYPE rbType,
            __RPC__in const WCHAR* pszID
            ) = 0;

        //virtual HRESULT __stdcall GetTypeID(/* out */ tagRECYCLEBIN_TYPE &rbType, System::WideChar * &pszID) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetTypeID(
            __RPC__deref_out RECYCLEBIN_TYPE* rbType,
            __RPC__in const WCHAR* pszID
            ) = 0;

        //virtual HRESULT __stdcall GetIDList(/* out */ Winapi::Shlobj::PItemIDList &ppidl) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetIDList(
            __RPC__deref_out LPITEMIDLIST *ppidl
            ) = 0;

        //virtual HRESULT __stdcall GetLocation(System::WideChar * pszPathBuffer, unsigned cchMax) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetLocation( 
            __RPC__in WCHAR* pszPathBuffer,
            __RPC__in UINT cchMax
            ) = 0;

        //virtual HRESULT __stdcall GetMaxCapacityRange(/* out */ __int64 &lpMin, /* out */ __int64 &lpMax) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetMaxCapacityRange( 
            __RPC__deref_out __int64* lpMin,
            __RPC__deref_out __int64* lpMax
            ) = 0;

        //virtual HRESULT __stdcall GetMaxCapacity(/* out */ __int64 &lpCapacity) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetMaxCapacity( 
            __RPC__deref_out __int64* lpCapacity
            ) = 0;

        //virtual HRESULT __stdcall SetMaxCapacity(const __int64 lpCapacity) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE SetMaxCapacity( 
            __RPC__in const __int64 lpCapacity
            ) = 0;

        //virtual HRESULT __stdcall GetPurgeOnDelete(/* out */ BOOL &fNukeOnDelete) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetPurgeOnDelete( 
            __RPC__deref_out BOOL* fNukeOnDelete
            ) = 0;

        //virtual HRESULT __stdcall SetPurgeOnDelete(const BOOL fNukeOnDelete) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE SetPurgeOnDelete( 
            __RPC__in const BOOL fNukeOnDelete
            ) = 0;

    };




    MIDL_INTERFACE("5869092D-8AF9-4A6C-AE84-1F03BE2246CC")
    IRecycleBinManager : public IUnknown
    {
    public:

        //virtual HRESULT __stdcall Compact(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Compact(void) = 0;

        //virtual HRESULT __stdcall GetFileData(const System::WideChar * pszPath, /* out */ tagDELETEDITEM &lpData) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetFileData( 
            __RPC__in const WCHAR* pszPath,
            __RPC__deref_out DELETEDITEM* pDeletedItem
            ) = 0;

        //virtual HRESULT __stdcall GetItemCount(/* out */ __int64 &lpCount) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetItemCount( 
            __RPC__deref_out __int64* lpCount
            ) = 0;

        //virtual HRESULT __stdcall GetUsedSpace(/* out */ __int64 &lpUsedSpace) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetUsedSpace( 
            __RPC__deref_out __int64* lpUsedSpace
            ) = 0;

        //virtual HRESULT __stdcall IsEmpty(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE IsEmpty( 
            void
            ) = 0;

        //virtual HRESULT __stdcall PurgeAll(_di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE PurgeAll( 
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall PurgeItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE PurgeItems( 
            __RPC__in const WCHAR* lpstrItems,
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall SuspendUpdating(BOOL fSuspend) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE SuspendUpdating( 
            __RPC__in BOOL fSuspend
            ) = 0;

        //virtual HRESULT __stdcall RecycleItem(const System::WideChar * lpstrItem, const unsigned dwAttrs, const __int64 iFileSize, /* out */ _di_IShellItem &psi) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE RecycleItem( 
            __RPC__in const WCHAR* lpstrItem,
            __RPC__in const DWORD dwAttrs,
            __RPC__in const __int64 iFileSize,
            __RPC__deref_out IShellItem** psi
            ) = 0;

        //virtual HRESULT __stdcall RestoreItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE RestoreItems( 
            __RPC__in const WCHAR* lpstrItems,
            __RPC__in IFileOperation* pfo
            ) = 0;

        //virtual HRESULT __stdcall IsRecycled(const System::WideChar * pszPath, PBOOL lpRecycled) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE IsRecycled( 
            __RPC__in const WCHAR* pszPath,
            __RPC__out PBOOL lpRecycled
            ) = 0;

        //virtual HRESULT __stdcall EnumItems(unsigned dwFlags, /* out */ _di_IEnumRecycleItems &EnumRecycleItems) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE EnumItems( 
            __RPC__in DWORD dwFlags,
            __RPC__deref_out IEnumRecycleItems** enm
            ) = 0;

        //virtual HRESULT __stdcall WillRecycle(const System::WideChar * pszPath) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE WillRecycle( 
            __RPC__in const WCHAR* pszPath
            ) = 0;

        //virtual HRESULT __stdcall DelayCompaction(const BOOL fDelay) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE DelayCompaction( 
            __RPC__in const BOOL fDelay
            ) = 0;

        //virtual HRESULT __stdcall GetRecycleBinCount(/* out */ int &iCount) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetRecycleBinCount( 
            __RPC__deref_out int* iCount
            ) = 0;

        //virtual HRESULT __stdcall GetRecycleBinAt(const int index, const GUID &iid, /* out */ void *ppv) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetRecycleBinAt( 
            __RPC__in const int index,
            const GUID *iid,
            __RPC__deref_out void **ppv
            ) = 0;

        //virtual HRESULT __stdcall GetRecycleBin(const System::WideChar * pszPath, const GUID &iid, /* out */ void *ppv) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE GetRecycleBin( 
            __RPC__in const WCHAR* pszRootPath,
            const GUID *iid,
            __RPC__deref_out void **ppv
            ) = 0;

        //virtual HRESULT __stdcall Refresh(void) = 0 ;
        virtual HRESULT STDMETHODCALLTYPE Refresh( 
            void
            ) = 0;

    };

#endif

Can someone take a look. 有人可以看看吗。 What am I missing there? 我在那里想念什么?

Rather than translating the interface code from Delphi to C++, you can take the original code from the Russian site, put it in a .pas file as-is, and then add that file to your C++ project. 无需将界面代码从Delphi转换为C ++,您可以从俄语站点获取原始代码,直接将其放在.pas文件中,然后将该文件添加到C ++项目中。 When you build the project (or just compile the .pas file by itself), a C++ .hpp file will be generated for you, which you can then #include into your C++ code. 当您构建项目(或仅自行编译.pas文件)时,将为您生成一个C ++ .hpp文件,然后您可以将其#include到您的C ++代码中。

Doing it this way, the following code works fine for me in C++Builder XE2 on Windows 7: 这样,以下代码在Windows 7的C ++ Builder XE2中对我来说运行良好:

#include "URecycleBinStuff.hpp"
#include <ComObj.hpp>

bool __fastcall CanFileBeDeletedToRecycleBin(const UnicodeString &AFileName)
{
    DelphiInterface<IRecycleBinManager> RecycleBinManager;
    OleCheck(CoCreateInstance(CLSID_RecycleBinManager, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IRecycleBinManager, (void**)&RecycleBinManager));
    return (RecycleBinManager->WillRecycle(AFileName.c_str()) == S_OK);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (CanFileBeDeletedToRecycleBin(L"C:\\test del"))
        ShowMessage("Can be deleted"); // <-- code makes it here
    else
        ShowMessage("Can not be deleted");
}

Here is what the generated .hpp file looks like: 生成的.hpp文件如下所示:

// CodeGear C++Builder
// Copyright (c) 1995, 2011 by Embarcadero Technologies, Inc.
// All rights reserved

// (DO NOT EDIT: machine generated header) 'URecycleBinStuff.pas' rev: 23.00 (Win32)

#ifndef UrecyclebinstuffHPP
#define UrecyclebinstuffHPP

#pragma delphiheader begin
#pragma option push
#pragma option -w-      // All warnings off
#pragma option -Vx      // Zero-length empty class member functions
#pragma pack(push,8)
#include <System.hpp>   // Pascal unit
#include <SysInit.hpp>  // Pascal unit
#include <Winapi.Windows.hpp>   // Pascal unit
#include <Winapi.Messages.hpp>  // Pascal unit
#include <Winapi.ShlObj.hpp>    // Pascal unit

//-- user supplied -----------------------------------------------------------

namespace Urecyclebinstuff
{
//-- type declarations -------------------------------------------------------
#pragma option push -b-
enum tagRECYCLEBIN_TYPE : unsigned char { RBTYPE_VOLUME, RBTYPE_KNOWNFOLDER };
#pragma option pop

typedef tagRECYCLEBIN_TYPE TRecycleBinType;

struct tagDELETEDITEM;
typedef tagDELETEDITEM *PDeletedItem;

#pragma pack(push,1)
struct DECLSPEC_DRECORD tagDELETEDITEM
{

public:
    unsigned dwFileSizeLow;
    unsigned dwFileSizeHigh;
    #pragma pack(push,8)
    _FILETIME ftDeletionTime;
    #pragma pack(pop)
    System::StaticArray<System::WideChar, 260> szOriginalPath;
    System::StaticArray<System::WideChar, 260> szDisplacedPath;
};
#pragma pack(pop)


typedef tagDELETEDITEM TDeletedItem;

__interface IEnumRecycleItems;
typedef System::DelphiInterface<IEnumRecycleItems> _di_IEnumRecycleItems;
__interface  INTERFACE_UUID("{6E325F88-D12F-49E5-895B-8EC98630C021}") IEnumRecycleItems  : public System::IInterface 
{

public:
    virtual HRESULT __stdcall Next(unsigned celt, /* out */ tagDELETEDITEM &rgelt, unsigned &pceltFetched) = 0 ;
    virtual HRESULT __stdcall Skip(unsigned celt) = 0 ;
    virtual HRESULT __stdcall Reset(void) = 0 ;
    virtual HRESULT __stdcall Clone(/* out */ _di_IEnumRecycleItems &ppenum) = 0 ;
};

__interface IRecycle;
typedef System::DelphiInterface<IRecycle> _di_IRecycle;
__interface  INTERFACE_UUID("{0125E62F-8349-443A-854B-A55FB84CFA35}") IRecycle  : public System::IInterface 
{

public:
    virtual HRESULT __stdcall Compact(void) = 0 ;
    virtual HRESULT __stdcall GetFileData(const System::WideChar * pszPath, /* out */ tagDELETEDITEM &lpData) = 0 ;
    virtual HRESULT __stdcall GetItemCount(/* out */ __int64 &lpCount) = 0 ;
    virtual HRESULT __stdcall GetUsedSpace(/* out */ __int64 &lpUsedSpace) = 0 ;
    virtual HRESULT __stdcall IsEmpty(void) = 0 ;
    virtual HRESULT __stdcall PurgeAll(_di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall PurgeItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall SuspendUpdating(BOOL fSuspend) = 0 ;
    virtual HRESULT __stdcall RecycleItem(const System::WideChar * lpstrItem, const unsigned dwAttrs, const __int64 iFileSize, /* out */ _di_IShellItem &psi) = 0 ;
    virtual HRESULT __stdcall RestoreItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall IsRecycled(const System::WideChar * pszPath, PBOOL lpRecycled) = 0 ;
    virtual HRESULT __stdcall EnumItems(unsigned dwFlags, /* out */ _di_IEnumRecycleItems &EnumRecycleItems) = 0 ;
    virtual HRESULT __stdcall WillRecycle(const System::WideChar * pszPath) = 0 ;
};

__interface IRecycleBin;
typedef System::DelphiInterface<IRecycleBin> _di_IRecycleBin;
__interface  INTERFACE_UUID("{F964AD97-96F4-48AB-B444-E8588BC7C7B3}") IRecycleBin  : public System::IInterface 
{

public:
    virtual HRESULT __stdcall Compact(void) = 0 ;
    virtual HRESULT __stdcall GetFileData(const System::WideChar * pszPath, /* out */ tagDELETEDITEM &lpData) = 0 ;
    virtual HRESULT __stdcall GetItemCount(/* out */ __int64 &lpCount) = 0 ;
    virtual HRESULT __stdcall GetUsedSpace(/* out */ __int64 &lpUsedSpace) = 0 ;
    virtual HRESULT __stdcall IsEmpty(void) = 0 ;
    virtual HRESULT __stdcall PurgeAll(_di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall PurgeItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall SuspendUpdating(BOOL fSuspend) = 0 ;
    virtual HRESULT __stdcall RecycleItem(const System::WideChar * lpstrItem, const unsigned dwAttrs, const __int64 iFileSize, /* out */ _di_IShellItem &psi) = 0 ;
    virtual HRESULT __stdcall RestoreItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall IsRecycled(const System::WideChar * pszPath, PBOOL lpRecycled) = 0 ;
    virtual HRESULT __stdcall EnumItems(unsigned dwFlags, /* out */ _di_IEnumRecycleItems &EnumRecycleItems) = 0 ;
    virtual HRESULT __stdcall WillRecycle(const System::WideChar * pszPath) = 0 ;
    virtual HRESULT __stdcall Initialize(const tagRECYCLEBIN_TYPE rbType, const System::WideChar * pszID) = 0 ;
    virtual HRESULT __stdcall GetTypeID(/* out */ tagRECYCLEBIN_TYPE &rbType, System::WideChar * &pszID) = 0 ;
    virtual HRESULT __stdcall GetIDList(/* out */ Winapi::Shlobj::PItemIDList &ppidl) = 0 ;
    virtual HRESULT __stdcall GetLocation(System::WideChar * pszPathBuffer, unsigned cchMax) = 0 ;
    virtual HRESULT __stdcall GetMaxCapacityRange(/* out */ __int64 &lpMin, /* out */ __int64 &lpMax) = 0 ;
    virtual HRESULT __stdcall GetMaxCapacity(/* out */ __int64 &lpCapacity) = 0 ;
    virtual HRESULT __stdcall SetMaxCapacity(const __int64 lpCapacity) = 0 ;
    virtual HRESULT __stdcall GetPurgeOnDelete(/* out */ BOOL &fNukeOnDelete) = 0 ;
    virtual HRESULT __stdcall SetPurgeOnDelete(const BOOL fNukeOnDelete) = 0 ;
};

__interface IRecycleBinManager;
typedef System::DelphiInterface<IRecycleBinManager> _di_IRecycleBinManager;
__interface  INTERFACE_UUID("{5869092D-8AF9-4A6C-AE84-1F03BE2246CC}") IRecycleBinManager  : public System::IInterface 
{

public:
    virtual HRESULT __stdcall Compact(void) = 0 ;
    virtual HRESULT __stdcall GetFileData(const System::WideChar * pszPath, /* out */ tagDELETEDITEM &lpData) = 0 ;
    virtual HRESULT __stdcall GetItemCount(/* out */ __int64 &lpCount) = 0 ;
    virtual HRESULT __stdcall GetUsedSpace(/* out */ __int64 &lpUsedSpace) = 0 ;
    virtual HRESULT __stdcall IsEmpty(void) = 0 ;
    virtual HRESULT __stdcall PurgeAll(_di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall PurgeItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall SuspendUpdating(BOOL fSuspend) = 0 ;
    virtual HRESULT __stdcall RecycleItem(const System::WideChar * lpstrItem, const unsigned dwAttrs, const __int64 iFileSize, /* out */ _di_IShellItem &psi) = 0 ;
    virtual HRESULT __stdcall RestoreItems(const System::WideChar * lpstrItems, _di_IFileOperation pfo) = 0 ;
    virtual HRESULT __stdcall IsRecycled(const System::WideChar * pszPath, PBOOL lpRecycled) = 0 ;
    virtual HRESULT __stdcall EnumItems(unsigned dwFlags, /* out */ _di_IEnumRecycleItems &EnumRecycleItems) = 0 ;
    virtual HRESULT __stdcall WillRecycle(const System::WideChar * pszPath) = 0 ;
    virtual HRESULT __stdcall DelayCompaction(const BOOL fDelay) = 0 ;
    virtual HRESULT __stdcall GetRecycleBinCount(/* out */ int &iCount) = 0 ;
    virtual HRESULT __stdcall GetRecycleBinAt(const int index, const GUID &iid, /* out */ void *ppv) = 0 ;
    virtual HRESULT __stdcall GetRecycleBin(const System::WideChar * pszPath, const GUID &iid, /* out */ void *ppv) = 0 ;
    virtual HRESULT __stdcall Refresh(void) = 0 ;
};

//-- var, const, procedure ---------------------------------------------------
extern PACKAGE GUID IID_IEnumRecycleItems;
extern PACKAGE GUID IID_IRecycle;
extern PACKAGE GUID IID_IRecycleBin;
extern PACKAGE GUID IID_IRecycleBinManager;
extern PACKAGE GUID CLSID_RecycleBinManager;

}   /* namespace Urecyclebinstuff */
#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_URECYCLEBINSTUFF)
using namespace Urecyclebinstuff;
#endif
#pragma pack(pop)
#pragma option pop

#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif  // UrecyclebinstuffHPP

If you compare the .hpp file's IRecycleBinManager to your manual IRecycleBinManager , there are some discrepancies in your code. 如果将.hpp文件的IRecycleBinManager与手动IRecycleBinManager ,则您的代码中会有一些差异。 Such as, you have the RecycleItem() and IsRecycled() methods named as PurgeItems() and RestoreItems() instead, and you have two RestoreItems() methods. 例如,您有RecycleItem()名为PurgeItems()RestoreItems()RecycleItem()IsRecycled()方法,并且有两个RestoreItems()方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM