DirectPlay8Peer の初期化ができません

このQ&Aのポイント
  • DirectPlay8の初期化方法について困っています。
  • 使用するヘッダーファイルはDplay8.h、Wtypes.h、Objbase.hです。
  • COMオブジェクトの使用方法がわからず、DirectXのサンプルも理解できません。助けてください。
回答を見る
  • ベストアンサー

DirectPlay8Peer の初期化ができません

はじめまして。 すみません。大変困ってます。助けてください。 DirectPlay8の初期化をするのに HRESULT hr; hr = CoCreateInstance( CLSID_DirectPlay8Peer, NULL, CLSCTX_INPROC_SERVER,IID_IDirectPlay8Peer, (LPVOID*) &g_pDP ); hr = g_pDP->Initialize( NULL, DirectPlayMessageHandler, 0 ); だけではできないのですが、どうしたらいいですか? ヘッダーファイルが足りないだけでしょうか。 ヘッダーは Dplay8.h Wtypes.h Objbase.h を使用しています。 COMオブジェクトの使用方法が間違っているのかもしれません。 (COMをあまり理解していないため・・・) DirectXのサンプルをみても全く理解できずに苦しんでいます。 すみません。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.1

初期化というか、hr が FAILED になるのは何を呼び出した時でしょうか? その時の hr の値から判断するしかありません。 あとは、サンプルから削ったものを地道に調べる。 CoInitializeEx を呼び出すのを忘れていたりする事があります。

michacha
質問者

お礼

返答ありがとうございます. 初期化をするのを忘れていたようです. hrの初期化ですが,CoInitializeExとCoInitializeとの違いは何なんでしょうか. CoInitializeでは初期化ができるのですが,CoInitializeExでは コンパイルエラーがでてしまうんです.

その他の回答 (1)

noname#30727
noname#30727
回答No.2

>hrの初期化ですが,CoInitializeExとCoInitializeとの違いは何なんでしょうか. あまり正確には知らないのですが、CoInitialize は COM で、CoInitializeEx は DCOM という事でしょうか。 ローカルな特性としては、CoInitialize は、CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) と同じだと思います。 COINIT_MULTITHREADED は全てのスレッドから無制限にアクセスできるようになって、COINIT_APARTMENTTHREADED はインスタンスを作成したスレッドだけが、そのインスタンスのメソッドを実行できるようにして、速度を稼いでいるものだと思います。 >コンパイルエラーがでてしまうんです. objbase.h をインクルードした時点で _WIN32_DCOM が定義されていないとエラーになります。 サンプルのプロジェクトを見てもらえばわかるのですが、通常は、 プロジェクト → 設定 → C/C++タブのプリプロセッサ定義の中に追加します。

michacha
質問者

お礼

ありがとうございます. すごく参考になりました! objbase.hをインクルードするだけではだめなんですね. CoInitializeExを使用することは断念したんですけど, 同じことができるのならば CoInitializeを突き通します! ありがとうございました!

関連するQ&A

  • RENDERFILEについての質問です

    今現在、DIRECTSHOWで動画でいろいろしてみようと思ったのですが、壁に当たりました。 デバッグ無しで開始すると、 RenderFile hr 40258と表示されます。 ソースですが関連するところを書くと #include <windows.h> #include <string.h> #include <dshow.h> // DirectShowのヘッダファイル #include <qedit.h> // SampleGrabber用 #include <conio.h> // getch()用 #include <stdio.h> #include "list502.h" #pragma warning(disable:4996) void main( void ) { // インターフェース用のポインタ // フィルタグラフ用 IGraphBuilder *pigb = NULL; IMediaControl *pimc = NULL; IMediaSeeking *pims = NULL; // サンプルグラバ用 IBaseFilter *pF = NULL; ISampleGrabber *pGrab = NULL; // これらは後で解放すること。 IMG0 img00; // 表示ウィンドウ用の構造体 BYTE *buffer; // 外部バッファ AM_MEDIA_TYPE amt; WCHAR filename[ MAX_PATH ]; HRESULT hr; img00.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE ); img00.x = 100; img00.y = 100; gr_reg(); // 表示用ウィンドウの登録 CoInitialize(NULL); // COMの準備 // FilterGraphの初期化 CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pigb); // フィルタグラフのインターフェースを得る pigb -> QueryInterface( IID_IMediaControl, (void **)&pimc ); pigb -> QueryInterface( IID_IMediaSeeking, (void **)&pims ); // グラバフィルタを作りフィルタグラフに追加 CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&pF); pF -> QueryInterface( IID_ISampleGrabber, (void **)&pGrab ); pigb -> AddFilter( pF, L"SamGra" ); // グラバフィルタの挿入場所の特定のための設定 ZeroMemory( &amt, sizeof(AM_MEDIA_TYPE) ); amt.majortype = MEDIATYPE_Video; amt.subtype = MEDIASUBTYPE_RGB24; amt.formattype = FORMAT_VideoInfo; pGrab -> SetMediaType(&amt); OPENFILENAME fname; static char fn[256]; memset(&fname, 0, sizeof(OPENFILENAME)); fname.lStructSize = sizeof(OPENFILENAME); fname.lpstrFile = fn; // パス付きファイル名が格納されるアドレス fname.nMaxFile = sizeof(fn); fname.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if( ! GetOpenFileName( &fname ) ) return ; // ファイル名の変換 MultiByteToWideChar( CP_ACP, 0, fn, -1, filename, MAX_PATH ); // 再生するファイルを指定、この時点で使用するフィルタが決まる hr = pigb -> RenderFile( filename, NULL ); printf( "RenderFile hr %x\n", hr ); if(hr != 0) return; ポイント箇所は WCHAR filename[ MAX_PATH ]; hr = pigb -> RenderFile( filename, NULL ); printf( "RenderFile hr %x\n", hr ); hrが0だと、成功を意味していると思います。それ以外だとリターンで終了します。 強引にhr=0で強引に0にしてみたら Just-in-Timeで例外が発生しました。これは強引に0にしたからだと思います。 %xは16進数を意味しているはずです。 余談ですが、動画ファイル以外(テキストファイルなど)を開くと hr=80040625と出ます。 この数字(16進)はエラーコードなのでしょうか? どうかhrが40258になってしまう理由および解決策をお教え下さい。 お願いいたします。

  • directshowでAVIファイルが再生が出来ません…

    Directshowを用いて動画を再生しようと試みています。 Direct sdkとplarformの両方を入れて、インクルードパスとライブラリパスを通しました。 ビルドしてもエラーは無いので某所のシンプルなソースでデバッグ無しで開始をクリック。 すると、再生が終わらないようにメッセージBlock Executionが表示されるものの肝心の動画が映りません。 プログラムはしっかりと動いているはずですが、、 動画aviはMSMPEG4V2です。Directshowのコーデックで動くとのことです。何がおかしいのか、さっぱりです。 環境はwindowsXP visual studio2005 DirectxSDK2008 microsoft platform(しっかりDirectshowフォルダは存在します) ここまで来たなら設定ミスは無いとは思いますが、(設定ミスがあれば、開けない等エラーが出ると思いますので) どうかお願い致します。 サンプルソース ↓ #include <stdio.h> #include <dshow.h> #define FILENAME L"C:\\Documents and Settings\\057104\\My Documents\\homerun2.avi" int main() { IGraphBuilder *pGraphBuilder; IMediaControl *pMediaControl; // COMを初期化 CoInitialize(NULL); // FilterGraphを生成 CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (LPVOID *)&pGraphBuilder); // MediaControlインターフェース取得 pGraphBuilder->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl); // Graphを生成 pMediaControl->RenderFile(FILENAME); // 再生開始 pMediaControl->Run(); // 再生中にプログラムが終わってしまわないように MessageBox(NULL, "Block Execution", "Block", MB_OK); // 資源を解放 pMediaControl->Release(); pGraphBuilder->Release(); // COM終了 CoUninitialize(); return 0; }

  • C++ でWindowsAPIを使用する際

    WindowsAPIを使用しようとしているのですが、エラーが出てうまくいきません。 もし原因が分かる方がいらっしゃれば、教えていただけると幸いです。 エラーコード: error C2787:: IFileOperation :このオブジェクトに関連付けられたGUIDがありません。 問題箇所: HRESULT CopyItem(__in PCWSTR pszSrcItem, __in PCWSTR pszDest, PCWSTR pszNewName) { // // Initialize COM as STA. // HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { IFileOperation *pfo; // // Create the IFileOperation interface // hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));  //※ここでエラー発生  if (SUCCEEDED(hr)) { // // Set the operation flags. Turn off all UI from being shown to the // user during the operation. This includes error, confirmation, // and progress dialogs. // hr = pfo->SetOperationFlags(FOF_NO_UI); if (SUCCEEDED(hr)) { // // Create an IShellItem from the supplied source path. // IShellItem *psiFrom = NULL; hr = SHCreateItemFromParsingName(pszSrcItem, NULL, IID_PPV_ARGS(&psiFrom)); if (SUCCEEDED(hr)) { IShellItem *psiTo = NULL; if (NULL != pszDest) { // // Create an IShellItem from the supplied // destination path. // hr = SHCreateItemFromParsingName(pszDest, NULL, IID_PPV_ARGS(&psiTo)); } if (SUCCEEDED(hr)) { // // Add the operation // hr = pfo->CopyItem(psiFrom, psiTo, pszNewName, NULL); if (NULL != psiTo) { psiTo->Release(); } } psiFrom->Release(); } if (SUCCEEDED(hr)) { // // Perform the operation to copy the file. // hr = pfo->PerformOperations(); } } // // Release the IFileOperation interface. // pfo->Release(); } CoUninitialize(); } return hr; よろしくお願いします。

  • C++6.0における動画再生プログラムについて

    動画再生プログラムを作成したのですが、実行するとファイルから選択して動画を再生という形になっています。 ここでやりたいこととしては、実行するとプログラム内で指定したファイルがすぐ再生できるようなプログラムに改良したいと思っています。 どこを改良したらよいかわからないので、どなたか教えていただけませんでしょうか?以下が作成したプログラムです。 #include <windows.h> #include <string.h> #include <dshow.h> //DirectShowのさまざまな準備 #include <conio.h> //getch()用 #include <stdio.h>//インターフェース用のポインタ IGraphBuilder * pigb = NULL; IMediaControl * pimc = NULL; void main (){ OPENFILENAME fname; static char fn [256]; memset ( &fname, 0, sizeof (OPENFILENAME) ) ; fname.lStructSize = sizeof (OPENFILENAME) ; fname.lpstrFile = fn; fname.nMaxFile = sizeof (fn) ; fname.Flags= OFN_FILEMUSTEXIST |OFN_HIDEREADONLY; if ( !GetOpenFileName ( &fname ) ) return ; WCHAR filename [MAX_PATH] ; HRESULT hr; CoInitialize (NULL) ;//ファイル名の変換 MultiByteToWideChar ( CP_ACP, 0, fn, -1, filename, MAX_PATH ) ; //FilterGraphの初期化,GraphBuilderインターフェースを得る hr = CoCreateInstance ( CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &pigb) ; if (SUCCEEDED (hr) ){//MediaControlインターフェースを得る pigb -> QueryInterface ( IID_IMediaControl, (void**) &pimc ) ; //再生するファイルを指定 hr = pigb -> RenderFile ( filename, NULL ) ; if (SUCCEEDED ( hr ) ){//再生 pimc -> Run () ; printf ("\n 再生中です、再生終了後どれかキーを押してください.") ; getch() ; } } //FilterGraphの開放 if ( pigb )pigb -> Release () ; if ( pimc )pimc -> Release () ; CoUninitialize () ; return ; }

  • VC++からのocxの使用方法

    画面のないVC++(.NETではない)でocxを使用したいのですが、うまくいきません。 以下のようなソースを作成したのですが、デバイスのオープンで例外が発生します。 #import "C:\\xxx\\OposXXXXX.ocx" no_namespace named_guids rename("Release","ReleaseOposPenScanner") int main(int argc, char* argv[]) { HRESULT hResult; _DOposXXXXCO* device; _bstr_t deviceName("XXX"); ::CoInitialize(NULL); hResult = ::CoCreateInstance((REFCLSID)CLSID_OposXXXCO, 0, CLSCTX_INPROC_SERVER, (REFIID)DIID__DOposXXXXCO, (LPVOID*)&device; try{ device->Open(deviceName); }catch(_com_error &e){ return 0; } … Open()時に例外が発生します。 デバッグ出力したところ、 e.ErrorMessage() = 00169E68 e.Error() = -2147418113 e.ErrorInfo() = 00000000 とでましたが、ネットでも情報が見つけられませんでした。 解決策をご存知の方、よろしくお願いします。

  • C# COM DELL へコールバックを設定したい

    MFCとC# COM DELLのプログラムを行ってます。 今回、MFCからC#COM DLLへコールバック関数を設定して C# COM DLLからそのコールバックを呼び出したいですが、どうしてもうまくいきません。 コードを記述します。どうか助けてください。 ------------------------------------------------------------------ MFC C++ delegate bool CallBack(int hwnd, int lParam); class CMyDlg : public CDialog { Init() { cpi = NULL; CoInitialize(NULL); HRESULT hr = CoCreateInstance(CLSID_InterfaceImplementation, NULL, CLSCTX_INPROC_SERVER, IID_IManagedInterface, (LPVOID*)&cpi); retval = 0; if (FAILED(hr)) { printf("Couldn't create the instance!... 0x%x\n", hr); } else { CallBack^ myCallBack = gcnew CallBack(&Report); cpi->SetCallback( myCallBack ); } } static bool Report(int hwnd, int lParam) { return true; } } ; ------------------------------------------------------------------ C# COM DLL namespace DLL_COM_TEST { public delegate bool CallBack(int hwnd, int lParam); public interface IDLL_COM_TESTInterface { void Execute(); void SetCallback(CallBack funcCB); } public class IDLL_COM_TESTImplementation: IDLL_COM_TESTInterface { CallBack funcCB_E; public void SetCallback(CallBack funcCB) { funcCB_E = funcCB; } public void Execute() { funcCB_E(1111, 1); } } ------------------------------------------------------------------ エラー内容 error C3756: 'CallBack': デリゲートの定義が既存のシンボルと競合します。 'CallBack' の宣言を確認してください。 'myCallBack' : 定義されていない識別子です。 error C2061: 構文エラー: 識別子'CallBack' error C2065: 'myCallBack' : 定義されていない識別子です。

  • BHO-3

    いつもお世話になっています。 STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite) { HRESULT hr = S_OK; if (m_pSite != NULL){ m_pSite->Release(); m_pSite = NULL; } if (pUnkSite != NULL) { IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ////////////////////////////// // IWebBrowser2 へのポインタをキャッシュします。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } 上のコードの IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ですが、 HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); の部分で失敗します。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } が、上手く動くのでまねをしたのですが上手く行きません。 すみませんが、アドバイスお願いします。

  • Direct Show(x64)でのエラー

    お世話になります。 現在x64版のDirect Showを利用して、aviファイルから任意のフレーム画像を取得する プログラムを作成しております。 Direct Showは今まで使ったことが無かったのですが、ネットにあるサンプルなどを 参考に手探りで作業を進めております。最終的にはx64版を作る必要があるのですが、 メインで作業しているPCが32bit環境であるため、とりあえずx86版で作業を進め、 なんとか期待する動作をするものが出来ました。 最終的に処理する動画ファイルは1440x810のものと、3840x2160の2つがあり、 x86版ではどちらも期待する動作をしてくれるのですが、x64にてコンパイルし64bit環境で 動作させると1440x810の方は問題ないのですが、3840x2160の方はうまく動作しません。 なお、プログラムは以下のような流れでDirectShowを利用しております。 CoInitialize CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, &pIGB); pIGB->QueryInterface( IID_IMediaControl, &pIMC ); pIGB->QueryInterface( IID_IID_IMediaSeeking, &pIMS ); CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, &pIBF ); pIBF->QueryInterface( IID_ISampleGrabber, &pISG ); pIGB->AddFilter( pIBF, NULL ); pISG->SetMediaType(&stMT); // stMTはMEDIATYPE_Video,MEDIASUBTYPE_RGB24,FORMAT_VideoInfoを設定 pIGB->RenderFile( ファイル名, NULL ); : 調べてみると、RenderFileのところでx64の場合はVFW_E_NO_TRANSPORTが帰ってきているようです。なお、その64bit環境でx86コンパイルしたものを動かすと問題なく動作します。 なお、もともとDirect X SDK 9.0を使っていましたが、念のため最新版のものをダウンロードして 試してみましたが、症状は変わりませんでした。また、Videoドライバも変えてみましたが、同様に 変化なしです。 どんな原因が考えられるか、どなたかご助言頂ければ助かります。 なお、開発環境・動作環境は以下の通りです。 Windows 7 Pro 64bit版 VisualStudio 2010 Pro Direct X SDK 9.0 or Direct X Jun_2010 C++ (純粋なネィティブプログラム)

  • DirectXを用いたActiveXを用いてVistaで情報が取れない

    ActiveXからDirectXを叩いてOSやCPUなどの情報を 取得しようとしています。 XPでは問題なく情報が取れますが、Vistaでは 情報が取れる項目と取れない項目があります。 この現象について、教えてください。 APIは正常に終了しています。 OS(szOSExLongEnglish) → 正常取得 ベンダー(szSystemManufacturerEnglish) → n/a 型番(szSystemModelEnglish) → n/a CPU(szProcessorEnglish) → (空白) 物理メモリ(szPhysicalMemoryEnglish)  → 正常取得 IEのデフォルトの設定では上記のような状態ですが、 設定を変えて保護モードを外すと正常動作し、 すべての情報が取得できます。 しかし、保護モードが有効の状態で、 情報取得したいです。 以下にコードを書きます。 ※このコードはあるサンプルソースをほとんどそのまま使っています。 //////////////////////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::Init(void) { HRESULT hr; DXDIAG_INIT_PARAMS dxDiagInitParam; m_pDxDiagProvider = NULL; m_pDxDiagRoot = NULL; g_DxDiagInfo = NULL; g_DxSoundInfo = NULL; // COMライブラリを使用できるように初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return false; } hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider); if( FAILED(hr) || m_pDxDiagProvider == NULL) { return false; } // DXDIAG_INIT_PARAMSを初期化 ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; // WHQLを確認するかどうか // ネットを経由するので基本的にはfalseにしておく dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks; dxDiagInitParam.pReserved = NULL; hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) { return false; } hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot ); if( FAILED(hr) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// // DxDiag でSystem情報を取得 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::GetSyatemInfo( void ) { HRESULT hr; IDxDiagContainer* pObject = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; DWORD nCurCount = 0; // "DxDiag_SystemInfo" を取得 if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) ) { return false; } // 情報保存領域の確保 ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo)); if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) ) { SAFE_RELEASE( pObject ); return false; } SAFE_RELEASE( pObject ); return true; } よろしくお願いいたします。

  • directshow を使用して、mpegファイルを再生するには

    お世話になっております。 directshowを使用して、mpegファイルを再生させようとおもったのです、以下のエラーが発生して、コンパイル出来ません。 c:\Documents and Settings\User\My Documents\Visual Studio Projects\test1\test1Class.cpp(33): fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 何が原因かさっぱり分かりません。 何方かご教授お願い致します。 開発環境は、visualstudio2003(言語C++.net) です。 ソースも載せておきます。よろしくお願い致します。 #include <dshow.h> void main(void) { IGraphBuilder *pGraph; IMediaControl *pMediaControl; IMediaEvent *pEvent; CoInitialize(NULL); // フィルタグラフマネージャを作成し、インターフェイスをクエリする。 CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl); pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); // グラフを作成。重要: 使用システムのファイル文字列に変更すること。 pGraph->RenderFile(L"C:\\Hello_World.avi", NULL); // グラフの実行。 pMediaControl->Run(); // 終了を待つ。 long evCode; pEvent->WaitForCompletion(INFINITE, &evCode); // クリーン アップ。 pMediaControl->Release(); pEvent->Release(); pGraph->Release(); CoUninitialize(); }

専門家に質問してみよう