IMAPI2: не удается добавить файлы и папки

0

Я пытаюсь создать образ диска через IMAPI2. Код довольно прост:

#include <windows.h>
#include <iostream>
#include <fstream>
#include <shlwapi.h>
#include <cstdio>

#include <imapi.h>
#include <imapi2.h>
#include <imapi2fs.h>
#include <imapierror.h>
#include <imapi2error.h>
#include <imapi2fserror.h>

using namespace std;

int main() {
CoInitialize(NULL);

HRESULT res = 0;
IFileSystemImage* image = NULL;
IFileSystemImageResult* result = NULL;
IFsiDirectoryItem* root = NULL;
IStream* file = NULL;
IStream* r_i = NULL;

res = CoCreateInstance(CLSID_MsftFileSystemImage, NULL, CLSCTX_ALL, __uuidof(IFileSystemImage), (void**) &image);
printf("1 %08X\n", res);
res = image -> put_FileSystemsToCreate((FsiFileSystems)(FsiFileSystemJoliet | FsiFileSystemISO9660));
printf("2 %08X\n", res);
res = image -> put_VolumeName(L"Pictures");
printf("3 %08X\n", res);
res = image -> ChooseImageDefaultsForMediaType(IMAPI_MEDIA_TYPE_CDRW);
printf("4 %08X\n", res);

res = image -> get_Root(&root);
printf("5 %08X\n", res);
res = root -> AddTree(L"C:\\pictures", VARIANT_TRUE);
printf("6 %08X\n", res);
res = SHCreateStreamOnFileEx(L"C:\\main.cpp", STGM_READ | STGM_SHARE_DENY_NONE | STGM_DELETEONRELEASE, FILE_ATTRIBUTE_NORMAL, false, NULL, &file);
printf("7 %08X\n", res);
res = root -> AddFile(L"main.cpp", file);
printf("8 %08X\n", res);

res = image -> CreateResultImage(&result);
printf("9 %08X\n", res);
res = result -> get_ImageStream(&r_i);
printf("0 %08X\n", res);

STATSTG stg;
r_i -> Stat(&stg, 1);
char* data = new char[stg.cbSize.QuadPart];
ULONG junk;
r_i -> Read(data, stg.cbSize.QuadPart, &junk);

FILE* f = fopen("image.iso", "wb");
fwrite(data, stg.cbSize.QuadPart, 1, f);
fclose(f);

delete data;
r_i -> Release();
file -> Release();
root -> Release();
result -> Release();
image -> Release();

CoUninitialize();
printf("Completed.\n");
scanf("%d", &junk);
}

Команды 6 и 8 выходят из строя с 0xC0AAB101 (недопустимый параметр). Это происходит как на Win XP SP3, так и на Win 7 Pro SP1 x32. Остальное отлично работает, и я получаю пустой образ. Что мне не хватает? (PS Этот код был вдохновлен приложением с открытым исходным кодом. Он работает из коробки, но иногда возникает ошибка, когда я перестраиваю его на своей машине.)

Теги:
com
imapi

1 ответ

1
Лучший ответ

→ AddTree (и большинство методов COM-объектов) ожидают строку BSTR, которую вы можете создать и должны быть выпущены для предотвращения утечки памяти. Вы можете использовать что-то вроде...

// allocate a bstr string
BSTR bstrPictures = SysAllocString(L"C:\\Pictures");

// use it
res = root -> AddTree(bstrPictures, VARIANT_TRUE);
printf("6 %08X\n", res);

// free the bstr string
SysFreeString(bstrPictures);

Хотя BSTR можно использовать вместо "широкой строки символов", обратное не всегда верно. BSTR имеет дополнительные данные перед фактическими символьными данными, следовательно, функции, необходимые для их манипулирования.

Попытайтесь не попасть в плохую привычку использовать их вот так...

res = root -> AddTree(SysAllocString(L"C:\\Pictures"), VARIANT_TRUE);

так как у вас будет утечка памяти.

Повеселись.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню