このページは『[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