![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?e8efa67)
動画再生プログラムを作成したのですが、実行するとファイルから選択して動画を再生という形になっています。
ここでやりたいこととしては、実行するとプログラム内で指定したファイルがすぐ再生できるようなプログラムに改良したいと思っています。
どこを改良したらよいかわからないので、どなたか教えていただけませんでしょうか?以下が作成したプログラムです。
#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 ;
}
No.1ベストアンサー
- 回答日時:
自分で作ったのであればわかる気がしますが、
ファイル名を尋ねる部分を削除して、filenameにファイル名を入れたらいいですね。
説明不足で申し訳ないんですが、このプログラムは本に載っているものを使いました。
なので、ほとんどわからない状況なのです。
よければ具体的に教えていただきたいと思います。
よろしくお願いします。
No.3
- 回答日時:
>そこはちゃんと読みました。
結局、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に読み込みたいファイルパスを指定すれば読み込みできると
いうことになります。
No.2
- 回答日時:
>具体的にどこを変えればいいのでしょうか?
『ファイル名を尋ねる部分』って#1さんが書いていると思いますが
自分で調べてみましたか?GetOpenFileNameという関数が何をしているのかとか、「//ファイル名の変換」や「//再生するファイルを指定」
のコメントも読めないですか?
調べれば直ぐに分かりそうなものですが。。。
>このプログラムは本に載っているものを使いました。
>なので、ほとんどわからない状況なのです。
本に載ってるならそこに説明があるでしょうに。。。
何故読まずに質問するのか。。。本が勿体無い。。。
分からないうちにコードを修正するのは良くありませんよ。
別のところで分からなくなったら、また人に聞かないと
何も出来ないわけですから。
#それと行数を稼ぐ為かどうか分かりませんが、
#むやみに改行を削除すると、折角のコメントが嘘になりますよ。
そこはちゃんと読みました。
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
そこで本を参考にしてもわからないため、聞いてみたんです。
何にも読まずに質問はしていません。
申し訳ありませんがご指摘お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サポートされたファイル形式お...
-
Visual Basic.NETの、Form 間で...
-
連続的に画像を受け取り、画像...
-
wmvの縦横サイズ
-
PDFファイルの倍率を変えて保存...
-
エクセルで「特定の文字を含む...
-
【VBA】マクロの入ったファイル...
-
個別に違う添付ファイルを付け...
-
Googleマップに保存した地点が...
-
e-taxで送信ファイルの拡張子が...
-
2枚、マイクロSDカードを入...
-
ガラケーからPCへの写真の取り込み
-
イベントログの保存先の変更方法
-
ビデオファイルのプロパティの...
-
ポーカーの手の判断
-
スマホでtxtファイルを編集する...
-
PC内で速度を遅くした音源をCD...
-
情けない話ですが成田エクスプ...
-
カラーの背景に透過GIFを貼り付...
-
HTMLでアンカーをはりPowerPoin...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
サポートされたファイル形式お...
-
Visual Basic.NETの、Form 間で...
-
連続的に画像を受け取り、画像...
-
音楽の再生ってどうやるの?
-
VIDEOタグでPC上のローカルファ...
-
VBSで動画ファイルの時間を読み...
-
動画編集ソフト自作について。
-
Visual C++のWindowsMediaPlaye...
-
WIN32APIで動画を読み...
-
ライブストリーミング動画の再...
-
楽天RMS PC用販売説明文に動画...
-
Chromeのaudioタグでwave再生で...
-
初期動画再生を音声無しでアッ...
-
ASPページで動画の再生
-
flashにflvの動画を埋め込んだ...
-
助けてgoo !! FLASH の再生に...
-
javaを使ってMP4を再生させるには
-
動画をホームページに公開する...
-
swf部分の抽出について
-
C++6.0における動画再生プログ...
おすすめ情報