1

我正在尝试使用 IFileSystemImage2 接口使用 Imapi2 创建具有多个引导记录的 ISO。

为此,我应该能够使用类型的put_BootImageOptionsArray传入SAFEARRAY*VT_DISPATCHIBootOptions每个引导选项配置的 COM 类型指针。作为一个简短的演示,我有以下代码(IBootOptions在这种情况下我只创建了一个):

SAFEARRAYBOUND bounds[1];
bounds[0].cElements = 1;
bounds[1].lLbound = 0;
IBootOptions* BootOptionsArrayData = NULL;


SAFEARRAY* Array = SafeArrayCreateEx(VT_DISPATCH, 
                                     1, 
                                     bounds, 
                                     (void*) &IID_IBootOptions);
hr = SafeArrayAccessData(Array, 
                         reinterpret_cast<void**>(&BootOptionsArrayData));

BootOptionsArrayData = BootOptions; // BootOptions = IBootOptions*
hr = SafeArrayUnaccessData(Array);

hr = IsoImage->put_BootImageOptionsArray(Array);

但是,每次我打电话put_BootImageOptionsArray都会被E_NOINTERFACE退回。

如您所料,正在创建 IsoImage:

hr = CoCreateInstance(CLSID_MsftFileSystemImage, 
                      NULL, 
                      CLSCTX_ALL, 
                      __uuidof(IFileSystemImage2), 
                      (void**) &IsoImage);

使用IFileSystemImage2任何继承的功能都IFileSystemImage可以正常工作。同样,我也可以CoCreateInstanceaIFileSystemImage代替,这个界面可以很好用。

我已经在 WinDbg 中附加到我的进程并在 中设置了一个断点CMsftFileSystemImage::put_BootOptionsArray,但是,这个函数(底层实现)根本没有被调用。

因此,我的问题很简单:实现似乎在那里,但我似乎无法调用它。有没有人有使用这个特殊功能的经验,如果有,你是如何让它工作的?

4

1 回答 1

2

文档规定SAFEARRAY 必须是一个包含 IDispatch 接口指针的VARIANT 数组,因此您可以执行以下操作(我使用的是更简单的智能指针......):

CComPtr<IFileSystemImage2> image;
CComPtr<IBootOptions> options;

image.CoCreateInstance(CLSID_MsftFileSystemImage);
options.CoCreateInstance(CLSID_BootOptions);

// set various options here...
options->put_Manufacturer(CComBSTR(L"joe"));

// create a SAFEARRAY of VARIANT
CComSafeArray<VARIANT> a(1);

// create a VARIANT of type VT_UNKNONW (or VT_DISPATCH)
CComVariant v(options);

// put it in the array
a.SetAt(0, v);

HRESULT hr = pImage->put_BootImageOptionsArray(a.m_psa);
于 2013-05-17T12:31:14.353 回答