Впервые работая с COM из C ++, раньше использовал C # и Delphi.
Итак, вот код
HRESULT Result;
Result = CoInitialize(nullptr);
if (!SUCCEEDED(Result))
return Result;
IShellDispatch* API;
Result = CoCreateInstance(CLSID_Shell, nullptr, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&API);
if ((!SUCCEEDED(Result)) || (nullptr == API))
goto Cleanup;
VARIANT Source1, Source2, Destination, Options;
VariantInit(&Destination);
Destination.vt = VT_BSTR;
Destination.bstrVal = SysAllocString(OutFile.c_str());
Folder* PDestination;
Result = API->NameSpace(Destination, &PDestination);
if (!SUCCEEDED(Result))
goto Cleanup;
VariantInit(&Source1);
VariantInit(&Source2);
Source1.vt = VT_BSTR;
Source2.vt = VT_BSTR;
Source1.bstrVal = SysAllocString(InFile1.c_str());
Source2.bstrVal = SysAllocString(InFile2.c_str());
VariantInit(&Options);
Options.vt = VT_I4;
Options.lVal = FOF_NO_UI;
PDestination->CopyHere(Source1, Options);
Sleep(1000);
PDestination->CopyHere(Source2, Options);
Sleep(1000);
PDestination->Release();
API->Release();
Cleanup:
CoUninitialize();
return Result;
OutFile, InFile1 и InFile2 имеют тип wstring, так как программа(в основном) C ++.Мне удалось создать пустой файл ZIP, это не проблема.Проблема в том, что я получаю исключение, утверждающее, что PDestination имеет значение nullptr.
Если это помогает, кажется, что сами варианты работают.Изучение их в отладчике дает пути, которые я указал.Я заметил, однако, как NameSpace-вызов возвращает S_FALSE.Кто-нибудь знает, что я могу с этим сделать?
Использование библиотеки не совсем работает, это корпоративный код, и есть некоторые действительно драконовские правила, когда речь идет о связывании внешнего кода, поэтому использование Windows API является самым простым способом.