- 締切済み
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 ; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- aris-wiz
- ベストアンサー率38% (96/252)
>そこはちゃんと読みました。 結局、GetOpenFileNameという関数が何をしているのか、 調べてみましたか? とりあえず、ひとつずつさかのぼっていきます。 //再生するファイルを指定 hr = pigb -> RenderFile ( filename, NULL ) ; filenameが指定されています。宣言を見ると。 WCHAR filename [MAX_PATH]; ワイドキャラクタ文字列であることがわかります。 指定される前にfilenameを変換指定しているところを見ると。 //ファイル名の変換 MultiByteToWideChar( CP_ACP, 0, fn, -1, filename, MAX_PATH ); MultiByteToWideChar関数の引数をみるとfnが指定されています。 fnをみるとファイル名を入れているものが見当たりませんが、 fname.lpstrFile = fn; fname.nMaxFile = sizeof (fn) ; とあります。 ここでGetOpenFileName関数を調べると 最終的にはGetOpenFileName関数で開いたダイアログで指定された ファイルのパスが、OPENFILENAME構造体のlpstrFileに指定された 領域に格納されます。 #詳しく知りたければ自分で調べてください。 つまり、ワイド文字列の変換はそのままにして fnに読み込みたいファイルパスを指定すれば読み込みできると いうことになります。
- aris-wiz
- ベストアンサー率38% (96/252)
>具体的にどこを変えればいいのでしょうか? 『ファイル名を尋ねる部分』って#1さんが書いていると思いますが 自分で調べてみましたか?GetOpenFileNameという関数が何をしているのかとか、「//ファイル名の変換」や「//再生するファイルを指定」 のコメントも読めないですか? 調べれば直ぐに分かりそうなものですが。。。 >このプログラムは本に載っているものを使いました。 >なので、ほとんどわからない状況なのです。 本に載ってるならそこに説明があるでしょうに。。。 何故読まずに質問するのか。。。本が勿体無い。。。 分からないうちにコードを修正するのは良くありませんよ。 別のところで分からなくなったら、また人に聞かないと 何も出来ないわけですから。 #それと行数を稼ぐ為かどうか分かりませんが、 #むやみに改行を削除すると、折角のコメントが嘘になりますよ。
- shirayukix
- ベストアンサー率43% (90/207)
自分で作ったのであればわかる気がしますが、 ファイル名を尋ねる部分を削除して、filenameにファイル名を入れたらいいですね。
お礼
説明不足で申し訳ないんですが、このプログラムは本に載っているものを使いました。 なので、ほとんどわからない状況なのです。 よければ具体的に教えていただきたいと思います。 よろしくお願いします。
補足
アドバイス通りにやってみましたが、ビルドしてもエラーが出てきます。 具体的にどこを変えればいいのでしょうか?
お礼
そこはちゃんと読みました。 filenameのところを自分の再生させたいファイル名に変えて実行すると以下のような結果が出ます。 -------------------構成: Douga - Win32 Release-------------------- コンパイル中... douga.cpp C:\Program Files\Microsoft Visual Studio\Douga\douga.cpp(40) : error C2664: 'MultiByteToWideChar' : 5 番目の引数を 'char [7]' から 'unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照)指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 C:\Program Files\Microsoft Visual Studio\Douga\douga.cpp(51) : error C2664: 'RenderFile' : 1 番目の引数を 'char [7]' から 'const unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照)指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー Douga.exe - エラー 2、警告 0 そこで本を参考にしてもわからないため、聞いてみたんです。 何にも読まずに質問はしていません。 申し訳ありませんがご指摘お願いします。