Я хочу преобразовать из использования shfileoperation в ifileoperation , но для каждого файла для каждого файла требуется ifileoperation . Я не хочу создавать фактические iShellitem s, потому что я хочу, чтобы оболочка обрабатывала случаи ошибок, в которых они не существуют, и отображает соответствующий пользовательский интерфейс. Я могу предоставить ifilesystembinddata ShcreateitemfromsingName через контекст Bind, но насколько точным должен быть его результат? Например, если я не знаю, относится ли путь к файлу или каталогу, какими должны быть его атрибуты? А как насчет размера файла? Этот образец SDK устанавливает размер на -1, даты нуля и атрибут fail_attribute_normal . Это работает с ifileoperation ? Сколько это имеет значение, если я их ошибаюсь? < /P>
Пример кода: < /p>
#include
#include
HRESULT FileOperation(PCTSTR pszSrc, PCTSTR pszDst)
{
struct : IFileSystemBindData
{
DWORD _dwAttributes;
STDMETHODIMP QueryInterface(REFIID iid, PVOID* ppv)
{
if ( iid == __uuidof( IUnknown )
|| iid == __uuidof( IFileSystemBindData ) )
{
*ppv = this;
return( S_OK );
}
*ppv = NULL;
return( E_NOINTERFACE );
}
STDMETHODIMP_(ULONG) AddRef (VOID) { return( 1 ); }
STDMETHODIMP_(ULONG) Release (VOID) { return( 1 ); }
STDMETHODIMP SetFindData(CONST WIN32_FIND_DATA*)
{
return( E_NOTIMPL );
}
STDMETHODIMP GetFindData(LPWIN32_FIND_DATA pfd)
{
*pfd = { _dwAttributes };
return( S_OK );
}
} FileSysBindData;
IBindCtx* pbc;
IShellItem* psiSrc, *psiDst;
IFileOperation* pfo;
CreateBindCtx( 0, &pbc );
pbc->RegisterObjectParam(
(LPOLESTR)STR_FILE_SYS_BIND_DATA, &FileSysBindData );
FileSysBindData._dwAttributes = 0;
SHCreateItemFromParsingName(
pszSrc, pbc, IID_PPV_ARGS( &psiSrc ) );
FileSysBindData._dwAttributes = FILE_ATTRIBUTE_DIRECTORY;
SHCreateItemFromParsingName(
pszDst, pbc, IID_PPV_ARGS( &psiDst ) );
CoCreateInstance( CLSID_FileOperation,
NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS( &pfo ) );
pfo->CopyItem( psiSrc, psiDst, NULL, NULL );
return( pfo->PerformOperations( ) );
}
INT wWinMain(HINSTANCE, HINSTANCE, PTSTR, INT)
{
CoInitialize( 0 );
FileOperation( TEXT( "C:\\Non existent source" ),
TEXT( "C:\\Non existent destination" ) );
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... have-to-be