Direct-Xのプログラムの変更についての参考書と資料はどこで見つけることができますか?

このQ&Aのポイント
  • Direct-Xのプログラムを変更するための参考書や資料が見当たらない状況です。
  • 使用言語はC++ Builderで、現在カメラから画像を読み込むプログラムの改造を行おうとしています。
  • 既存の参考書やサイトでは、CLSID_FilterGraphの説明だけでなく、その他のパラメーターや機能について詳しく説明しているものが見つかりません。MSDNも理解に苦しんでいます。何かおすすめの参考書やサイトはありますか?
回答を見る
  • ベストアンサー

先人が作成したDirect-Xのプログラムを変更したいのですが、良い参

先人が作成したDirect-Xのプログラムを変更したいのですが、良い参考書が無くて困っています。 使用言語はC++ Builderです。 今、カメラから画像を読み込むプログラムの改造を行おうとしています。 何冊か参考書を読みましたが、例題とコマンドの英文を日本語にしただけの様なもので、何をして居るかは分かりますが改造をしようとするには役に立ちません。 例えば CoCreateInstance(CLSID_FilterGraph); の構文がある時、例題に述べられているCLSID_FilterGraphの説明のみ書かれている参考書はありますが、その他にこのパラメーターにはどの様なものがあり、その機能はどの様なものであるかが記述された参考書が見当たりません。ここに記載可能なパラメーターとその意味が列挙してあるだけでも参考に成ると思っているのですが、その様な資料が見つかりません。 戻り値についてはやっとwinerr.hに書かれている事が分かりました。そのレベルの者です。 MSDNも参照していますが、良く分かりません。 何か良い参考書、参考と成るサイトがありましたらご紹介下さい。 よろしくお願いします。

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

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

この質問のポイントは何処でしょうか? 1.CoCreateInstance()関数の引数について知りたい。 2.CLSID_FilterGraphについて知りたい。 3.CoCreateInstance()に、CLSID_FilterGraph以外にどんなCLSIDが指定出来るか知りたい。 あるいは、他の何かでしょうか?

TinyPine
質問者

お礼

PCトラブルでお礼が遅れてすみません。 要点はどのようにしたらDirect-X 特に旧Direct-Show関連を理解出来る様に成るかと言う事です。 例えばC言語の入門書ならCの関数に関していろいろ書かれていますので理解出来ます。 しかし、Direct-Xの参考書でその様に関数やパラメーターに関して書かれているものが見つからなかつたので質問させて頂きました。

関連するQ&A

  • Windowsタスクバーにツールバーを作成(3)

    前回、以下サイトを紹介いただき、何とかデスクバンドを作成することができました。 http://eternalwindows.jp/shell/shellex/shellex13.html http://msdn.microsoft.com/en-us/library/aa969320.aspx 現在、他アプリから、デスクバンドの登録と解除を行っていますが、デスクバンドの表示と非表示を同様に他アプリから、行いたいと考えております。 上記参考URLでは以下のように記載されていたのですが、当方の環境(WIndows XP / Borland C++Builder 6 pro)では以下コードはそのまま使えません。 どなたか、ご教授をお願いします。 <参考コード、Vista以降です> CLSID clsid = {0x112143a6, 0x62c1, 0x4478, {0x9e, 0x8f, 0x87, 0x26, 0x99, 0x25, 0x5e, 0x2e}}; HRESULT hr; ITrayDeskBand *pTrayDeskBand; CoInitialize(NULL); hr = CoCreateInstance(CLSID_TrayDeskBand, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pTrayDeskBand)); if (FAILED(hr)) { CoUninitialize(); } pTrayDeskBand->ShowDeskBand(clsid); pTrayDeskBand->Release(); CoUninitialize();

  • 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++ (純粋なネィティブプログラム)

  • 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 ; }

  • VB .NETでのSocket間通信について

    すいません。Socket間通信のプログラムについて教えてもらえませんか。 System.Net.Socketsを使用してプログラムを作成するのだと思うのですが、 未熟なため困っております。 内容は以下の通りです。 ある機器がネットワークにぶら下がっております(IP Address : 192.168.1.99) その機器に対してネットワーク上のPCから次のようなコマンドを打ちます。 RQ A0,1,0 ---- 単なるパラメータなのでそのままテキストで送信 するとその機器は OK [バイナリデータ] として、バイナリデータは画像ファイルを送信してきます。 で、私がやろうとしていることはそのバイナリデータの画像ファイルをコマンド を投げたPCにファイルとして取得したい(例えば001.bmpなど)のです。 テキストとバイナリがごっちゃになっていて更にデータをダウンロードすると いうので実はパニッくっています。 少しのヒントでよいので、突破口になりそうなヒントや参考にしたらいいHPを教え てもらえると助かります。 ・・・MSDNは見ているのですが。。。理解力が乏しいので少しでもう少しわかりやすい HP等があればと思い投稿させていただきます。

  • windowsのコマンドプロンプト上でJAVACコマンド

    本日ですがJAVAの参考書を買ってきて早速つまずいてまして、皆様のお知恵をいただければと思います。 windowsのコマンドプロンプト上でjavacコマンドを入力するように参考書に書いてあり、javacコマンドを入力すると 'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てしまいます。メモ帳にて書いた構文に間違いはありませんでした。ちなみにwindows VISTAとwindows2000で試しましたが両方とも同じ出力が返ってきました。 なぜコマンドがうまく通らないのかわかる方回答お願いします。

  • 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; }

  • これから先人を好きになれるのかな。。。

    去年、友人を介して知り合った男性がいます。 私に好意を持ってくれたようで、2回ほど2人で会いました。私も彼に惹かれていたので、また会う約束をしました。しかしその後連絡は無くなり、4ヶ月程会いませんでした。私はもう彼を好きになってしまっていたので、自分から連絡を取り再び会いました。彼はその時一晩一緒にいたいようでしたが、私は帰りました。帰り際にキスをされ、「また会って欲しい」、「早く会いたい」と言われました。2人で会う時は、私に好意を抱く発言を何度も言われました。でも日頃特に連絡がある訳でもなく、私への好意は疑問でした。 再会後、3ヶ月ほどしてまた2人で会いました。 その時体の関係を持ってしまいました。 付き合っていないのに、また私への好意が疑問である以上そのような関係になってしまったことは、反省すべきであると思います。でも好きになってしまっていた私は、断ることができませんでした。 ここでけじめをつけてしまわないと後で苦しくなると思い、私は彼に自分の気持ちを伝え、彼の気持ちを確認しました。「好きではなかった。自分の気持ちが解らない」と言われました。 彼の自分の気持ちが解らないという発言は嘘ではなかったもしれません。また、彼なりに悩んで出した結論だったのかもしれません。でも私に好意を寄せる数々の発言等を考えると、結果的に私は自分の気持ちが彼の性欲処理のために利用された気がしました。 私が遊びだったら構いませんでした。でも私は彼を真っ直ぐに好きでした。私が本気で好きな以上、少なくともそれなりに私のことを考えてくれるものと思っていました。 彼に対する未練は全くありません。むしろ嫌悪感さえ感じます。ただ、人を好きになることが虚しく思えてきました。世の中このようなことは頻繁にあるのでしょうか?

  • 作成したプログラムを変更したいのですがどうすればいいのかわかりません。どなたか教えていただけないでしょうか?

    「商品コード」(10文字未満の文字列)、「商品名」(40文字未満の文字列)、「値段」(整数値)の3つのメンバをもつ構造体を宣言する。その構造体のデータを最大100個格納できる配列を定義し、ファイルgifts.datの最初の2行と同じ内容を、宣言と同時にそれらの変数の初期値として設定(ファイルから読み込むのではなく、プログラム中にデータを埋め込む)。さらに、次の形式で構造体配列の内容を画面に出力するプログラムを作成する。 商品コード:JZK-30 商品名:Jizake_tsumeawase 価格:4500 商品コード:BSP-15 商品名:Body_soup_set 価格:3000 上記のことを元に作成したものが下記のプログラムです。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct merchandise{ char code[12]; char name[40]; int price; }; void show_m(struct merchandise *mp, int n) { int i; for(i=0;i<n;i++,mp++){ printf("code: %s\n", mp->code); printf("name: %s\n", mp->name); printf("price: %d\n\n", mp->price); } } struct merchandise m_data[100] = { {"JZK-30","Jizake_tsumeawase",4500}, {"BSP-15","Body_soup_set",3000}, }; int main(void) { show_m(m_data, 2); return 0; } このプログラムをプログラム中にデータを読み込む代わりに、ファイルgifts.datから商品データを読み込み、すべてのレコードをこの構造体配列に格納するように(画面への出力も同様にすべてのレコードを出力)したいのですがどう変更すればいいのかわかりません。どなたか教えていただけないでしょうか?

  • BiilderとD-Show フレームレート変更

    現在、USB複数カメラのプログラムを開発して居ます。 問題は複数カメラを使用するとPICバスの帯域を越えてしまうので、フレームレートを低くしようとしていますが、うまく行って居ません。 調べた所、フレームレートを取得するのはAvgTimePerFrameがあり、こちらは実装出来てテストも終了して居ます。ただ、これは読み取り専用で書き込みが出来ません。 もう一つはGetOutputFPSで、これに対して書き込みにPutOutputFPSがあります。 この2つを実装したいと思っています。実装自体はLongSecret様のご助言で 一応出来ました。 下記のプログラムはフレームレートを読み出すプログラムで、前半はAvgTimePerFrameのものです。 関数の引数、Indexは現在使用しているカメラ、ロジクールC905Mの解像度23個のどれを選択しているかで、0から22が入って来ます。 AvgTimePerFrameの方はこのパラメーターに従って、選択した解像度のフレームレートを返して来ます。 (実際はレートでは無く、100nS単位のインターバル時間値ですが・・) これに対して、後半のGetOutputFPSはどの解像度でも15FPSしか返しません。 もっとも、後半のプログラムはどの解像度を選択されているか関数に伝わって居ないと思われるので当然でしょうけど。 実はこのプログラムは先人が作成し、私が少しずつ分かる範囲で今回の様に改造を加えて来たもので、現在は相談する人も無く困っております。 AvgTimePerFrameの追加は何とか私でも出来たのですが、GetOutputFPSから選択した解像度に従ったフレームレートを出させる事は出来ないでしょうか。 若しくは他の方法で選択された解像度のフレームレートの入手、変更は出来ないでしょうか。 宜しくお願い致します。 int __fastcall TWebCam::RedFPS( int Index ) { int iFrmSpd; //分解能コントロール IAMStreamConfig *pStreamConfig; //キャプチャピンに対してストリームコングィグをセット FCapture->FindInterface(&PIN_CATEGORY_CAPTURE, //キャプチャピン 0,//すべてのメディアタイプ FVideoCap, IID_IAMStreamConfig, (void **)&pStreamConfig ); AM_MEDIA_TYPE *pmt; VIDEO_STREAM_CONFIG_CAPS scc; //フォーマットリストの取得 HRESULT hr; // フォーマット機能の取得 機能番号はIndexに設定 hr=pStreamConfig->GetStreamCaps(Index,&pmt,(BYTE*)&scc); if(hr!=S_OK){ ShowMessage("Format change error(1)."); return 0; } // フォーマットの設定 hr = pStreamConfig->SetFormat(pmt); if(hr!=S_OK){ ShowMessage("Format change error(2)."); return 0; } VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)pmt->pbFormat; // ビットマップ情報を BITMAPINFO 構造体にコピーする // これはテスト用、今の所、選択されたカメラ、解像度番号のタイミングが入手出来ている様だ。 // 一方GetOutputFPSはどの解像度でも15が返ってくる。アクセス箇所位置が違う? iFrmSpd = pVideoHeader->AvgTimePerFrame; // フレームタイミング入手 // ここからGetOutputFPS用のプログラム IAMTimelineObj* pVideoGroupObj; IAMTimeline* pTimeLine; CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER, IID_IAMTimeline, (void**)&pTimeLine); pTimeLine->CreateEmptyNode(&pVideoGroupObj, TIMELINE_MAJOR_TYPE_GROUP); IAMTimelineGroup* pVideoGroup; pVideoGroupObj->QueryInterface(IID_IAMTimelineGroup, (void**)&pVideoGroup); double dTmp; pVideoGroup->GetOutputFPS(&dTmp); // 読み出しフレーム/秒 // pVideoGroup->GetOutputFPS(dTmp); // 書き込みフレーム/秒 pTimeLine->AddGroup( pVideoGroupObj ); pStreamConfig->Release(); return( (int) dTmp );

  • 先人について

    画像にある言葉は映画の中で。黒人の方がおっしゃっていたのですが、皆さんはこの言葉を読んで何を思いますか??

専門家に質問してみよう