限定しりとり

動画再生プログラムを作成したのですが、実行するとファイルから選択して動画を再生という形になっています。
ここでやりたいこととしては、実行するとプログラム内で指定したファイルがすぐ再生できるようなプログラムに改良したいと思っています。
どこを改良したらよいかわからないので、どなたか教えていただけませんでしょうか?以下が作成したプログラムです。
#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 ;
}

A 回答 (3件)

自分で作ったのであればわかる気がしますが、


ファイル名を尋ねる部分を削除して、filenameにファイル名を入れたらいいですね。

この回答への補足

アドバイス通りにやってみましたが、ビルドしてもエラーが出てきます。
具体的にどこを変えればいいのでしょうか?

補足日時:2007/11/15 19:49
    • good
    • 0
この回答へのお礼

説明不足で申し訳ないんですが、このプログラムは本に載っているものを使いました。
なので、ほとんどわからない状況なのです。
よければ具体的に教えていただきたいと思います。
よろしくお願いします。

お礼日時:2007/11/15 13:39

>そこはちゃんと読みました。


結局、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に読み込みたいファイルパスを指定すれば読み込みできると
いうことになります。
    • good
    • 0

>具体的にどこを変えればいいのでしょうか?


『ファイル名を尋ねる部分』って#1さんが書いていると思いますが
自分で調べてみましたか?GetOpenFileNameという関数が何をしているのかとか、「//ファイル名の変換」や「//再生するファイルを指定」
のコメントも読めないですか?
調べれば直ぐに分かりそうなものですが。。。

>このプログラムは本に載っているものを使いました。
>なので、ほとんどわからない状況なのです。
本に載ってるならそこに説明があるでしょうに。。。
何故読まずに質問するのか。。。本が勿体無い。。。
分からないうちにコードを修正するのは良くありませんよ。
別のところで分からなくなったら、また人に聞かないと
何も出来ないわけですから。

#それと行数を稼ぐ為かどうか分かりませんが、
#むやみに改行を削除すると、折角のコメントが嘘になりますよ。
    • good
    • 0
この回答へのお礼

そこはちゃんと読みました。
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

そこで本を参考にしてもわからないため、聞いてみたんです。
何にも読まずに質問はしていません。
申し訳ありませんがご指摘お願いします。

お礼日時:2007/11/15 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!