自分のお店を開く時の心構えとは? >>

Microsoft visual studio2005のC言語(ウインドウアプリケーション)で動画呼び出しのプログラムを作成して、ビルドもできたのですが開始すると動画が表示せず、
真っ白なウインドウが表示しただけになってしまいます。

呼び出される動画は、Debugフォルダに入れています。
mciSendString( _T("open homerun2.avi type avivideo alias test"), NULL, 0, NULL ); このように命令しているのですが…

動画はWMPで作動するAVIファイルです。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

> 早速media player起動で試しましたが圧縮プログラムvids:mp42が見つからないためビデオを利用できません、と表示されました。



それはMicrosoft MPEG4 v2 ですね。MSMPEG4V2は Windows 標準では、DirectShow用コーデックしか入っていませんので、

そのAVIファイルは、DirectShow用のコーデックが入ってるのでWindows Media Player では再生できるが、
Video for Windows 用のコーデックが入っていないため、そのままでは MCI では再生できない、
ということになります。

対策ですが、
・MCI で再生するのはやめて、DirectShow もしくは ActiveX(Windows Media Playerコンポーネント)で再生するようなプログラムにする
・Video for Windows 用のコーデックをインストールする
のどちらかになります。

前者の場合、プログラムの手間(難易度)は高くなりますが、
「VfWコーデックしか入っていないAVIファイルも、VfW経由でDirectShowでも再生できる」ので、データの対応範囲が広くなります。

後者の場合、mp42を再生できるVfWコーデックもいろいろありますが、ffdshow なんかが便利だと思います。
http://cowscorpion.com/Codec/ffdshow.html

これを入れて、Media Player(mplay32.exe)で問題のAVIファイルが再生できるようになったことを確認してから、
改めて MCI によるムービー再生にチャレンジしてみてください。
    • good
    • 0
この回答へのお礼

directshowを入れてみました。
あと、mpgファイルの動画だと表示することができました。
詳しい説明、ありがとうございました。

お礼日時:2008/10/22 15:23

> _T("open homerun2.avi type avivideo alias test"),


_T("open homerun2.avi alias test"),
としてみてはいかがでしょう

当方の環境ですとこれで『Video for windows』として再生しましたが
WinXP SP3 + VC2005
    • good
    • 0

 こんばんは。



 私も同じくWMPでは再生出来ましたが、プログラムからは再生出来ませんでした。
 別のAVIファイルにした所、再生出来ました。
 以下の様にエラー値を確認してみて下さい。

const DWORD dwResult = ::mciSendString( _T("open homerun2.avi type avivideo alias test"), NULL, 0, NULL );
const DWORD dwHi = HIWORD(dwResult);
const DWORD dwLo = LOWORD(dwResult);
if(dwLo == MCIERR_INVALID_FILE)
{
/*受け付けない*/
}
::mciSendString( _T("play test"), NULL, 0, NULL);

 「MCIERR Return Values」
 http://msdn.microsoft.com/en-us/library/ms709467(VS.85).aspx
    • good
    • 0

・ファイル名・ファイルのパスはあっていますか?


 指定するファイルはカレントディレクトリを基準に参照されますが、
 Visual Studio でデバッグ実行している場合は、プロジェクトのあるフォルダがカレントディレクトリの状態で実行されます。
 (統合環境からではなく、Debug フォルダ下の実行ファイルを直接ダブルクリックで実行すれば、そのフォルダがカレントになるので、開けると思います。

・表示させたいムービーのコーデックは大丈夫ですか?
 Windows Media Player は、「DirectShow」で動画再生します。
 一方、MCI の場合、「Video for Windows」で動画再生します。
 再生システムが別物ですので、圧縮コーデックによっては「WMPでは再生できるが、MCIでは再生できないAVI」にもなりえます。

 MCI で再生できるムービーかどうかの確認方法ですが、
Windows に標準で付いている「MCI を使ったムービー再生プログラム」である、「Media Player」でそのムービーを開いてみてください。
C:\Windows\System32\mplay32.exe
これで見れないのであれば、MCI (Video for Windows)でムービー再生出来ないコーデックを使ったAVIファイルということになります。

この回答への補足

回答ありがとうございます。

早速media player起動で試しましたが圧縮プログラムvids:mp42が見つからないためビデオを利用できません、と表示されました。

今あるAVIファイルでは、厳しいのでしょうか…。

補足日時:2008/10/16 02:37
    • good
    • 0

mciSendString( _T("play test"), NULL, 0, NULL );


は書いてますか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q動画処理のライブラリについて

現在WindowsのVC++で動画ファイル(.avi)に画像処理を行いたいと思っています。

もう少し具体的に述べますと、.aviファイルを読み込み、その映像にエッジ抽出や差分画像抽出などの画像処理を施して、画像処理された新たな.aviファイルを出力するというものです。

しかし、1から画像処理プログラミングを行うほどの知識もなく、どうすれば…と思っていたところ、OpenCVなど画像処理ライブラリというものがあることを知りました。

それを用いて.bmpなどの静止画像のエッジを取ったりというような処理はなんとなくわかったのですが、.aviファイルなどの動画ファイルに対する画像処理の方法がよくわからないのです。

動画というものは静止画の集合なので、動画像処理は静止画像処理を連続的に行えばよいと耳にしたのですが、これは正しいのでしょうか?

もし正しいのであれば、.avi動画ファイルにたいして連続的な静止画処理を行い、また.aviファイルを出力するということはOpenCVを用いてできるのでしょうか?

また、そういったことが詳しく解説されている書籍や日本語サイトなどがあれば教えていただけませんでしょうか。

素人の質問ではありますが、皆様どうぞよろしくお願いいたします。

現在WindowsのVC++で動画ファイル(.avi)に画像処理を行いたいと思っています。

もう少し具体的に述べますと、.aviファイルを読み込み、その映像にエッジ抽出や差分画像抽出などの画像処理を施して、画像処理された新たな.aviファイルを出力するというものです。

しかし、1から画像処理プログラミングを行うほどの知識もなく、どうすれば…と思っていたところ、OpenCVなど画像処理ライブラリというものがあることを知りました。

それを用いて.bmpなどの静止画像のエッジを取ったりというような処理はなんと...続きを読む

Aベストアンサー

>上記のプログラムのどの部分を変更してVC++にコピーして実行すれば動くものなのでしょうか?

とりあえずOpenCVをダウンロードしてビルドしなければいけません。それでビルドが通ると"なんとか.lib"や"なんとか.dll"が生成されて、それをリンクして自分のプログラムを書く形になります。VCの人のためにビルド用プロジェクトが用意してあるのですが、私の環境(VC6)では一発でコンパイル通りませんでしたので、いろいろコメントアウトしながらだましだましやりました。とてもめんどくさいです。
下のソースの場合はhighgui.libとcvcam.libを同じフォルダにコピーしてきます。あとは”なんとか.dll”が無いよと言われるので、それも探してきて配置します。

>size.width = ***;
>size.height = ***;
に入力データのピクセルサイズを入れてやります。
>(double)***, // fps指定
のところは 30.0 とか書いとけばとりあえずOK.

ところで下のソース、致命的な欠点がありました。ファイル読み書きと再生はできるのですが、まともに画像処理ができませんでした。
imageの中にフレームのメタデータは入ってくるのですが、実画像データが入ってこないです(入れる場所はあるんだけどNULLになってる)。
なので試しにこれをOpenCVで画像変換しようとするとエラーになり、いまのところお手上げ系です。ビデオメモリの中にバッファを確保してる系かもしれません。

VFWはVCのデフォルト状態で
#include "vfw.h"
#pragma comment (lib, "vfw32.lib")
とするだけでいいので導入がすごく楽です。
あと、システムメモリ上にビットマップデータがちゃんと入ってきますので、あとはそれをOpenCV互換な形(IplImage構造体)に直してやります。

>動画処理やOpenCVに関するサイトや書籍
昨日見つけたんですがここ
http://chihara.naist.jp/people/2004/kenta-t/OpenCV/pukiwiki/pukiwiki.php?FrontPage

>上記のプログラムのどの部分を変更してVC++にコピーして実行すれば動くものなのでしょうか?

とりあえずOpenCVをダウンロードしてビルドしなければいけません。それでビルドが通ると"なんとか.lib"や"なんとか.dll"が生成されて、それをリンクして自分のプログラムを書く形になります。VCの人のためにビルド用プロジェクトが用意してあるのですが、私の環境(VC6)では一発でコンパイル通りませんでしたので、いろいろコメントアウトしながらだましだましやりました。とてもめんどくさいです。
下のソースの...続きを読む

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

QC言語win32api、エディットボックスから文字列を取得しメッセージ

C言語win32api、エディットボックスから文字列を取得しメッセージボックスへ出力
質問1
エディットボックスからフォーカスが外れると
その中の文字列を取得しメッセージボックスに出力したいのですが
思った通りに出力されません。
フォーカスが外れるとメッセージボックス自体は出てくるのですが
エディットボックスに入力した文字列が出力されません。
いろいろ試したんですが文字化けしたり文字列自体が表示されなかったします。
取得と出力の方法を教えていただけませんでしょうか。

kwt[3]=CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("EDIT"), NULL ,
WS_CHILD | WS_VISIBLE |WS_BORDER |ES_LEFT | ES_AUTOHSCROLL ,
90 , 85 , 110 , 25 ,
hAdd ,(HMENU)EDIT_ID02 ,((LPCREATESTRUCT)(lp))->hInstance , NULL);

LPSTR testtex=NULL;

LRESULTCALLBACK SubProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{

LPSTR testtex=NULL;

switch(msg)
{
case WM_COMMAND:

switch(LOWORD(wp))
{

case EDIT_ID02:

if(HIWORD(wp)==EN_KILLFOCUS) //フォーカスが外れたら次の処理をする。
{

strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保

if(testtex) //testtexがゼロでなければ次の処理をする
{
GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所
MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所
}
free(strText); //メモリを解放

return 0;
}

return 0;
}

return 0;
}

return (CallWindowProc(SubP1, hWnd, msg, wp, lp));
}

質問2
エディットボックスに0~9と「.」(ドット)のみを入力できるようにしたいのですが
ウインドウスタイルでES_NUMBERを指定すると「.」が入力できなくなってしまいます。
どのように回避したらいいのでしょうか。

質問3
win32apiとは直接関係ありませんが、たとえば計算結果が1000億を超えるような場合
int型とかの変数ではとても入りきれません。
こういった場合どのようにするのでしょう。

C言語win32api、エディットボックスから文字列を取得しメッセージボックスへ出力
質問1
エディットボックスからフォーカスが外れると
その中の文字列を取得しメッセージボックスに出力したいのですが
思った通りに出力されません。
フォーカスが外れるとメッセージボックス自体は出てくるのですが
エディットボックスに入力した文字列が出力されません。
いろいろ試したんですが文字化けしたり文字列自体が表示されなかったします。
取得と出力の方法を教えていただけませんでしょうか。

kwt[3]=CreateWindowEx(W...続きを読む

Aベストアンサー

回答No.3の補足です。

////////// BEGIN{ midugane さんのコード } //////////

strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保

if(testtex) //testtexがゼロでなければ次の処理をする
{
GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所
MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所
}
free(strText); //メモリを解放

////////// END{ midugane さんのコード } //////////

////////// BEGIN{ 修正後 } //////////

LPTSTR strText = (LPTSTR)calloc((GetWindowTextLength(hwnd) + 1), sizeof(TCHAR)); // 文字数 + 終端 null 文字分のメモリを確保
// GetWindowTextLength( ) の戻り値は TCHAR 単位の文字数で返ってくるので、
// TCHAR = wchar_t となる Unicode 環境では注意が必要です。
// 確保したメモリは最初からゼロクリアしておいたほうが何かと便利なので、
// calloc( ) を使っています。
// VC++ では、calloc( ) は最適化されていますので、malloc( ) と比較しても
// 速度面のオーバーヘッドは気にしなくても良いレベルです。

if(strText) // strText が NULL でなければ次の処理をする
{
GetWindowText(hwnd, strText, (GetWindowTextLength(hwnd) + 1)); // エディットのテキストを取得。長さには終端 null 文字分を含めます。
MessageBox(hwnd, strText, TEXT(""), MB_OK); // 取得したテキストをメッセージボックスで出力。
}
free(strText); // メモリを解放

////////// END{ 修正後 } //////////

回答No.3の補足です。

////////// BEGIN{ midugane さんのコード } //////////

strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保

if(testtex) //testtexがゼロでなければ次の処理をする
{
GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所
MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所
}
free(strText); //メモリを解放

////////// END{ midugane さ...続きを読む

QDirectshow関連の書籍

11月から働く事になったのですが、会社から「Windows CE Direct show に関して勉強しておいて下さい、会社ではMichael Linetsky 著 "Programming Microsoft Directshow"を用意しておきます。」と言われました。

まず Windows CE とDirect show 多分別物ですよね。Window CEは小型パソコンのOSという事はわかりました。
Directshowについて日本語の書籍を買おうと思い(会社が用意するのは英語の本なので)、アマゾンでDirectshowで調べたら全部洋書でした。DirectshowはどうやらDirectXの仲間なようなので、DirectXなら日本語の本もたくさんあるのですがDirectXの本で大丈夫でしょうか?
自分は大学でC言語しか学んでいない初心者なのですが、アドバイスありましたらお願い致します。

Aベストアンサー

おそらく「Windows CE上でDirectShowを使ったアプリケーションの開発を行うので、その準備をしておけ」という意味合いかと思います。

Windows CEは主に超小型PCないしPDAで使われているOSです。DirectShowは、デスクトップPC(Windows XP等)の場合はDirectXの一部という位置付けですが、Windows CEの場合はことさらにDirectXという名称を前面には出していないようです。

いずれにしても、DirectShowはDirectXの一部でしかなく、またDirectXの主な機能はDirectDraw, Direct3D, DirectInputといった「ゲーム向け機能」と見なされることが多いので、DirectXの参考書でDirectShowを学ぶ役に立つかどうかは要確認です。目次を見て、DirectShowに関する記述がどのくらいあるかを確認しましょう。

書籍でない日本語の資料ですと、DirectX 8.0開発キット(デスクトップPC向け)の日本語版があります。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdx8_c/ds/default.asp

現在の最新である9.0より古く、またWindows CEを対象としたものでもありませんが、考え方は同じなので参考にはなるかと思います。

おそらく「Windows CE上でDirectShowを使ったアプリケーションの開発を行うので、その準備をしておけ」という意味合いかと思います。

Windows CEは主に超小型PCないしPDAで使われているOSです。DirectShowは、デスクトップPC(Windows XP等)の場合はDirectXの一部という位置付けですが、Windows CEの場合はことさらにDirectXという名称を前面には出していないようです。

いずれにしても、DirectShowはDirectXの一部でしかなく、またDirectXの主な機能はDirectDraw, Direct3D, DirectInputといった「ゲーム...続きを読む

QCoCreateInstanceでエラーになる。

こんにちわ。
いまVC++で開発している初心者です。
CoCreateInstanceという関数の箇所で,
戻り値が"0x80040154 (REGDB_E_CLASSNOTREG) "
となってしまいます。
調べると「指定されたクラスが登録データベースに登録されていないか、dwClsContextパラメータで指定されたサーバータイプが登録されていないか、レジストリのサーバータイプ値が不正です。」
ということなんですが,
具体的にはどのような箇所を確認すれば良いでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

COMについての質問ですね。
戻り値から見ての推測ですが
CoCreateInstanceしようとしているCOMオブジェクトが
レジストリに登録されていないのではないでしょうか。

例えば、そのCOMオブジェクトがDLLであれば
regsvr32コマンドをコマンドプロンプトから実行して
引数に登録したいDLLファイル名を指定します。
登録されました、とメッセージが表示されれば
レジストリにCOMが登録されます。

或いは、それが済んでいるのでしたら
COMオブジェクトが実装しなくてはならない
IUnknownインターフェイスが実装されておらず
CoCreateInstanceできない。。。
というオチかもしれません。

CLSID(COMを識別するGUID)が
レジストリに登録されてないんじゃないかと思います。
まずは前者のレジストリ登録をお試しください。

Q構造体の初期化方法について

こんばんわ。
何度も申し訳ありません。

VC++.NET 2003を用いてコンソールプログラミングを行っています。前回この掲示板を利用して複数回実行するプログラムを作成し、そこに構造体を用いたプログラムを作成しました。以下に概要を示します。

グローバルで構造体を宣言しているため、複数回実行を行うプログラムでは前回の値が格納されたままであると思い、毎回実行時に構造体の初期化を行いたいと思っています。

そこで、以下に示します構造体の初期化はどのように記述すればよいのでしょうか?0で初期化したいと思っています。

よろしくお願い致します。

#define MAX 2000
//グローバル
struct tag{
int Npkt;
int gettime;
int rPkt;
int lossPkt;
}rdata[MAX];

main(){
  //for文で複数回実行処理
  for(i=0;i<=5;i++){
  //ここで構造体の初期化を記述する
//例として、5回プログラムを実行する
  }
}

こんばんわ。
何度も申し訳ありません。

VC++.NET 2003を用いてコンソールプログラミングを行っています。前回この掲示板を利用して複数回実行するプログラムを作成し、そこに構造体を用いたプログラムを作成しました。以下に概要を示します。

グローバルで構造体を宣言しているため、複数回実行を行うプログラムでは前回の値が格納されたままであると思い、毎回実行時に構造体の初期化を行いたいと思っています。

そこで、以下に示します構造体の初期化はどのように記述すればよいのでしょうか?0で初...続きを読む

Aベストアンサー

★まとめ
・既に『memset』関数や、『ZeroMemory』関数の回答があるので構造体の全体、1部の
 初期化の記述例を紹介します。
・それと『#include <memory.h>』を記述しないとメモリ関係の関数が利用できません。
 『ZeroMemory』関数の場合は『#include <windows.h>』があればそのまま利用できます。

●構造体全体を初期化
ZeroMemory( rdata, sizeof(rdata) ); または、
memset( rdata, 0, sizeof(rdata) ); です。

●構造体一部を初期化
ZeroMemory( &rdata[i], sizeof(struct tag) ); または、
memset( &rdata[i], 0, sizeof(struct tag) ); です。
※rdata[i]の1データだけ初期化します。

余談:
・『ZeroMemory』関数は Win32 API と分類されていますが、実体は『memset』関数に
 『#define』されているだけです。でも、戻り値を『VOID』型にキャストされているので
 『memset』関数のリターン値を取得できません。→第一引数のアドレスが『memset』関数
 ではリターンします。
・以上。おわり。

参考URL:http://taka.no32.tk/tips/Win32/ZeroMemory.html

★まとめ
・既に『memset』関数や、『ZeroMemory』関数の回答があるので構造体の全体、1部の
 初期化の記述例を紹介します。
・それと『#include <memory.h>』を記述しないとメモリ関係の関数が利用できません。
 『ZeroMemory』関数の場合は『#include <windows.h>』があればそのまま利用できます。

●構造体全体を初期化
ZeroMemory( rdata, sizeof(rdata) ); または、
memset( rdata, 0, sizeof(rdata) ); です。

●構造体一部を初期化
ZeroMemory( &rdata[i], sizeof(struct tag) ); または、
m...続きを読む

QLRESULTとHRESULT

身近でよく見かけるものに限ってなかなか探しても見つからないものなのですよね。

よくC++のプログラムで見かける
LRESULT型
HRESULT型
いったいどの様な型なのでしょうか?
どの様な時に使うのか教えてください。

Aベストアンサー

もう少しだけ補足。

ATLは、COM実装等に使うことを意識したライブラリなのでHRESULTとはなじみが深い。

そして、HRESULT(LRESULTも)は特にC++固有ということはなく
「Microsoftが定義したWindows開発用APIの一部」です。

COMやActiveX等はWindowsにおいてC++以外にも使いうるものであって、
C/C++用ヘッダでもその型定義があるに過ぎませんし、
UNIX等ではC++だったとしてもそんな型はまぁ使いません。


人気Q&Aランキング

おすすめ情報