1

IFileSystemImage2 インターフェイスを使用して、Imapi2 を使用して複数のブート レコードを持つ ISO を作成しようとしています。

これを行うには、タイプのput_BootImageOptionsArray受け渡しを使用できる必要があります。つまり、各ブート オプション構成のタイプの COM ポインターです。短いデモとして、次のコードがあります (この場合は 1 つだけ作成しました)。SAFEARRAY*VT_DISPATCHIBootOptionsIBootOptions

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動作します。同様にCoCreateInstanceIFileSystemImage代わりにこのインターフェイスを使用することもできます。

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 に答える