このページは『[VC] IMAPI v1(その2)』記事のサンプルコードです。
誤っている箇所がありましたら、記事のコメント欄に連絡願います。
//-----------------------------------------------------------------------------
// main.cpp - IMAPAv1サンプル2 データCD作成
// 
// 2007/02/09 … VC2005用サンプル
//-----------------------------------------------------------------------------
#define WIN32_LEAN_AND_MEAN
#include <atlbase.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>       // _tsetlocale()
#include <conio.h>        // _getch()
#include <comdef.h>       // COM support.
#include <imapi.h>        // IMAPI support.
#include <imapierror.h>   // IMAPI error.

// IMAPI Interface Smart Pointers:
_COM_SMARTPTR_TYPEDEF(IDiscMaster           , __uuidof(IDiscMaster)           );
_COM_SMARTPTR_TYPEDEF(IEnumDiscMasterFormats, __uuidof(IEnumDiscMasterFormats));
_COM_SMARTPTR_TYPEDEF(IEnumDiscRecorders    , __uuidof(IEnumDiscRecorders)    );
_COM_SMARTPTR_TYPEDEF(IDiscRecorder         , __uuidof(IDiscRecorder)         );
_COM_SMARTPTR_TYPEDEF(IJolietDiscMaster     , __uuidof(IJolietDiscMaster)     );

// プロトタイプ
void CreateJolietDisc(IDiscMasterPtr& master);
bool SelectDrive(IDiscMasterPtr& master);

//-----------------------------------------------------------------------------
// エントリーポイント
//-----------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    IDiscMasterPtr master;
    HRESULT hr;

    _tsetlocale( LC_ALL, _T("jpn") );

    // COM初期化
    hr = ::CoInitialize(NULL);
    ATLASSERT(SUCCEEDED(hr));

    // インスタンス作成
    hr = master.CreateInstance( CLSID_MSDiscMasterObj );
    ATLASSERT(SUCCEEDED(hr));

    // IMAPIへのアクセスを開始
    hr = master->Open();
    ATLASSERT(SUCCEEDED(hr));

    // データCDの作成
    CreateJolietDisc( master );

    // IMAPIへのアクセス終了
    master->Close();

    _tprintf_s(_T("...何かキーを押すと終了します"));
    _gettch();

    master = NULL;
    ::CoUninitialize();
    return 0;
}


//-----------------------------------------------------------------------------
// データCDの作成
//-----------------------------------------------------------------------------
void CreateJolietDisc(IDiscMasterPtr& master)
{
    IJolietDiscMasterPtr juliet;
    IStoragePtr root;
    HRESULT hr;

    // Jolietフォーマットを指定
    hr = master->SetActiveDiscMasterFormat(
            IID_IJolietDiscMaster, reinterpret_cast<void**>(&juliet) );
    ATLASSERT(SUCCEEDED(hr));

    // 使用するレコーダーを指定
    if( !SelectDrive( master ) ){
        _tprintf_s(_T("Error! レコーダーの指定に失敗\n"));
        return;
    }

    // ルートとなる構造化ストレージを作成
    hr = StgCreateStorageEx( L"root",
             STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
             STGFMT_STORAGE,
             0, NULL, NULL,
             IID_IStorage,
             reinterpret_cast<void**>(&root) );
    ATLASSERT(SUCCEEDED(hr));

    // メディアに記録するストレージオブジェクトの追加
    //   フォルダの追加は、IStorage::CreateStorage()
    //   ファイルの追加は、IStorage::CreateStream(), IStream::Write()
    {
        _tprintf_s(_T("==ファイル/フォルダの追加==\n"));

        IStoragePtr folder;
        IStreamPtr  text1, text2;
        TCHAR szText[][256] = {{_T("サンプルデータ1")}, {_T("サンプルデータ2")}};
        ULONG len ,written; 

        // フォルダ(folder)追加
        _tprintf_s(_T("Add /folder\n"));
        hr = root->CreateStorage(
                L"folder",
                STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
                0, 0, &folder);
        ATLASSERT(SUCCEEDED(hr));

        // ルートの下にファイル(text1.txt)追加
        _tprintf_s(_T("Add /text1.txt\n"));
        hr = root->CreateStream(
                L"text1.txt",
                STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
                0, 0, &text1);
        ATLASSERT(SUCCEEDED(hr));
        len = lstrlen(szText[0]) * sizeof(TCHAR);
        text1->Write( CT2A(szText[0]), len, &written );

        // フォルダ(folder)の下にファイル(text2.txt)追加
        _tprintf_s(_T("Add /folder/text2.txt\n"));
        hr = folder->CreateStream(
                L"text2.txt",
                STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
                0, 0, &text2);
        ATLASSERT(SUCCEEDED(hr));
        len = lstrlen(szText[1]) * sizeof(TCHAR);
        text2->Write( CT2A(szText[1]), len, &written );
    }

    // 記録する構造化ストレージを指定
    hr = juliet->AddData( root, 0 );
    ATLASSERT(SUCCEEDED(hr));

    // ライティング開始
    _tprintf_s(_T("メディアに記録中...\n"));
    hr = master->RecordDisc( false, true );
    ATLASSERT(SUCCEEDED(hr));

    _tprintf_s(_T("処理完了!\n"));
}

//-----------------------------------------------------------------------------
// 使用するレコーダーを選択
// このサンプルでは、最初に検索されたドライブを使用する
//-----------------------------------------------------------------------------
bool SelectDrive(IDiscMasterPtr& master)
{
    IEnumDiscRecordersPtr recs;
    IDiscRecorderPtr      rec;
    ULONG   cFetched;
    HRESULT hr;

    hr = master->EnumDiscRecorders( &recs );
    ATLASSERT(SUCCEEDED(hr));

    if( recs->Next( 1, &rec, &cFetched ) != S_OK )
        return false;

    // TODO : メディアのチェック

    // 使用するレコーダーの指定
    // メディアが挿入されていないとエラーが発生するので注意
    hr = master->SetActiveDiscRecorder( rec );
    if( FAILED(hr) )
    {
        if(hr == EVENT_E_INVALID_EVENT_CLASS_PARTITION){
            _tprintf_s(_T("Error! EVENT_E_INVALID_EVENT_CLASS_PARTITION\n"));
        }else
        {    // その他エラー
            ATLASSERT(SUCCEEDED(hr));
        }
        return false;
    }
    return true;
}
今日のジャンク.txt