Visual C++ 6.0でマルチメディアタイマーを使う方法

このQ&Aのポイント
  • Visual C++ 6.0でダイアログベースでマルチメディアタイマーを使用する方法について教えてください。
  • CTimeCounterクラスでコールバック関数のアドレスを取得しようとすると、エラーが発生します。
  • エラーC2664: 'AttachAD' : 1 番目の引数を 'void (unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' から 'void (__stdcall *)(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' に変換できません。
回答を見る
  • ベストアンサー

マルチメディアタイマー

初めて質問させていただきます。 Visual C++ 6.0でMFCのダイアログベースでマルチメディアタイマーを使おうとしてるのですが、 class CTimeCounter { public: LPTIMECALLBACK lpTimeCallback; UINT TimerID; UINT uPeriod; UINT uDelay; void GetPeriod(); void AttachAD(LPTIMECALLBACK lpProc); CTimeCounter(); virtual ~CTimeCounter(); }; void CTimeCounter::AttachAD(LPTIMECALLBACK lpProc) { TimerID = uPeriod = NULL; GetPeriod(); //最小分解能を取得し、uPeriodに代入 this->uDelay = uPeriod; this->lpTimeCallback = lpProc; } としてCTimeCounter ctcを宣言したのですが、OnInitDialogのTODOの箇所でコールバック関数のアドレスを取得しようとして ctc.AttachAD(this->TimerProc); とすると error C2664: 'AttachAD' : 1 番目の引数を 'void (unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' から 'void (__stdcall *)(unsigned int,unsigned int,unsign ed long,unsigned long,unsigned long)' に変換できません。 というエラーを返されます。これはどう対処すればいいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

えと、そもそも最終的に this->TimerProc をWin32APIに渡そうとしているんですよね? メンバー関数をコールバック関数に使うことは、それが staticなものでなければ ちょっとした回避策をとらないとできませんよ。 その辺はどうなっていますか?

chocolat69
質問者

お礼

>えと、そもそも最終的に this->TimerProc をWin32APIに渡そうとしているんですよね? おそらく、そういうことになると思います。 >メンバー関数をコールバック関数に使うことは、それが staticなものでなければ 確認してみたらコールバック関数を扱うクラス側での定義が、 void CALLBACK TimerProc(UINT, UINT, DWORD, DWORD, DWORD); だけでしたので、staticをつけたらうまくいきました。 ご回答、どうもありがとうございます。

関連するQ&A

  • SDKでのエラーなのですが。

    はじめまして。 SDKの勉強で猫でもわかる~のHPの第37章のサンプルを実行したのですが、 --------------------構成: 037 - Win32 Debug-------------------- コンパイル中... main.cpp D:\SDK\037\main.cpp(230) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 D:\SDK\037\main.cpp(248) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー 037.exe - エラー 2、警告 0 というようなエラーが出てしまいました。 このエラーを回避するにはどのようにすればいいのでしょうか?

  • 関数のポインタ

    現在マルチスレッドアプリケーションを作成しています。 ところが、 CreateThread(NULL, 0, listenThread, this, 0, &m_listenThreadId); この行でエラーが出ます。 エラー内容は、 3番目の引数を'unsigned long (void *)' から 'unsigned long (__stdcall *)(void *)' に変換できません。 です。関数のポインタについてもまだよく理解していないので、このエラーの意味が良く分かりません。 どなたか、エラーの意味と解決方法を教えて頂けませんか? コンパイラはVisual C++6.0です。 どうぞ宜しくお願いします。

  • プッシュボタンができなくなってる

    LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) ・・・・・・ hCtrlBx[0]= CreateWindow("BUTTON","ok",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, i_cw,2*i_ch,8*i_cw,2*i_ch,hW,2,((LPCREATESTRUCT)lP)->hInstance,NULL); によってプッシュボタンを作ろうとしたのですが エラー E2034 ok.cpp 134: 'int' 型は 'HMENU__ *' 型に変換できない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) エラー E2342 ok.cpp 134: パラメータ 'hMenu' は HMENU__ * 型として定義されているので int は渡せない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) となり作れませんでした hWの後の2が0のときはokですが1以上のときはoutです 以前はできたやり方なのにどうしたのでしょう 対処の仕方を教えてください

  • プロジェクトを作った際のエラー

    VisualC++ 2005 Express Editionを使用してます win32コンソールアプリケーション - アプリケーション設定 - windowsアプリケーション この新しく作ったプロジェクトを何もいじらずにビルドすると __imp__EndPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__BeginPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DefWindowProcW@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DestroyWindow@4 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DialogBoxParamW@20 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__EndDialog@8 が関数 "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) で参照されました。 C:\C++test\test\Debug\test.exe : fatal error LNK1120: 外部参照 19 が未解決です。 というエラーが出てしまいます 800文字オーバーしてしまうのでエラーの前半部分を消してあります この原因と解決方法を教えてください よろしくお願いします

  • マルチメディアタイマーの使用方法

    お世話になります、fujitomoです。 今回お聞きしたいのはマルチメディアタイマーのプログラムの使用方法についてです。現在下記のようなコードを作成して、マルチメディアタイマーを動作させたいと思っていますが、なぜか処理が固まってしまいます。 プログラムはVisual Studio2005のVisual C++のダイアログベースのプログラムで、CStatic派生クラスをメインダイアログクラスにてサブクラス化した際の動作を示しています。 //CStatic派生のクラスCSampleクラスのヘッダーファイル //CSample.h class CSample : public CStatic { static void CALLBACK TimerProc(UINT uTimerID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2); static UINT TimerID; } //CSample.cpp void CSample::PreSubclassWindow() { TIMECAPS timercaps; MMRESULT mmresult; //分解能を取得 mmresult = timeGetDevCaps(&timercaps,sizeof(TIMECAPS)); if(mmresult != TIMERR_NOERROR){ AfxMessageBox(_T("分解能取得失敗")); return; } else period = timercaps.wPeriodMin; //最小タイマー分解能の設定 mmresult = timeBeginPeriod(period); if(mmresult != TIMERR_NOERROR){ AfxMessageBox(_T("分解能設定失敗")); return; } //タイマー処理の呼び出しの設定と開始 mmresult = ::timeSetEvent(500,period,TimerProc,0,TIME_PERIODIC|TIME_CALLBACK_FUNCTION); if(mmresult == NULL){ AfxMessageBox(_T("タイマー処理失敗")); return; } else TimerID = (UINT)mmresult; } void CALLBACK CSample::TimeProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) { if(uTimerID == TimerID){ ; } } というコードです。自分の予想ではTimerProcにブレークポイントを置いて、デバックを開始すると500msecでTimerProcにとぶと思っているのですが、実際はtimeSetEvent()を呼び出した後にプログラムの動作が止まってしまいます。 これは何が原因なのかわかりますでしょうか? timesetEvent()を使用するのが初めてで、なかなか使い方が分からず初歩的な質問なのかもしれませんが、どうかご意見を宜しくお願い致します。 尚、開発環境は Visual Studio 2005 Windows CE 6.0 です。宜しくお願い致します。

  • WindowsAPIでサブクラス化に挑戦しています。

    WindowsAPIでサブクラス化に挑戦しています。 C++での記述を意識していて、サブクラス化の要であるWNDPROC変数をクラス内にstaticで宣言したんですが error LNK2001: 外部シンボル ""public: static long (__stdcall* DialogSet::subInfoProc)(struct HWND__ *,unsigned int,unsigned int,long)" (?subInfoProc@DialogSet@@2P6GJPAUHWND__@@IIJ@ZA)" は未解決です。 というエラーが出力されて実行できないでいます。 CallWindowProc関数の第一引数にしてあるメンバ変数です。 静的なメンバにしたんですが、このエラーの解決方法をご存じならば是非、教えていただきたいです。

  • VC6でDLL(COM+)作成中にエラーが出ました。

    VC6でATL COM AppWizardでDLLを作成しています。 インターフェースメソッドを追加したところ、 (1)の場合はうまくいきましたが、(2)の場合は、エラーと警告が2つ出ました。 理屈がわかっていないので対処方法がわからないのですが、何が原因なのでしょうか? やりたいことは、戻り値1つでなく、3つの戻り値が必要で、 引数4つのうち、最初は関数へ計算の元となる文字列を送り、残りの3つはint型ポインタを与えて、関数内で結果をセットし、呼び出し元でも使えるようにしたいので、このようにしました。通常のC?ではうまくいっていました。 あと読んだ方が良い書籍も探しています。 COM+?について詳しい方、教えてください。 ※COM+というのはVB2005やC#でも健在なのでしょうか? (1) 戻り値のタイプ: HRESULT メソッド名: Test1 パラメータ: なし (2) 戻り値のタイプ: HRESULT メソッド名: Test2 パラメータ: [in] char* a, [in,out] int* b, [in,out] int* c, [in,out] int* d →※ここが間違い? ===== エラー内容 ===== error C2259: 'CComObject<class CTest>' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中 warning C4259: 'long __stdcall ITest::Test2(unsigned char *,int *,int *,int *)' : 純粋仮想関数は定義されていません。 'Test2' の宣言を確認してください。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中 error C2259: 'CComObject<class CTest>' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中 warning C4259: 'long __stdcall ITest::Test2(unsigned char *,int *,int *,int *)' : 純粋仮想関数は定義されていません。 'Test2' の宣言を確認してください。 クラス テンプレートのメンバ関数 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CTest> >::CreateInstance(void *,const struct _GUID &,void ** )' のコンパイル中

  • C#からVC++DLLの呼び出しに失敗する

    VS.NET2005のC#からVC++6.0で作成したDLLを呼び出しています。 VCのデバッガでデバッグしてみると呼び出した関数は正常に動作しているようなのですが、最後のreturnを実行しC#に戻るところでエラーが出てしまいます。 C#側では「'System.ExecutionEngineException' のハンドルされていない例外が ConsoleApplication1.exe で発生しました。」となります。 C#での宣言は、 [DllImport("test.dll")] public static extern uint TestFunc(ref byte[] moji, ref uint nagasa); です。 VC++の宣言は、 __declspec(dllexport) unsigned long __stdcall TestFunc(unsigned char* moji, unsigned long* nagasa) です。 C#へ値を返さない関数は問題ないのですが、値を返そうとすると起きるようです。不備などあればご指摘いただけないでしょうか。 ちなみにVB6からは問題なく動作できました。

  • C++ memory.dllサンプルが実行できない

    http://www.vector.co.jp/soft/win95/prog/se358509.html のmemory.dllを用いてプロセスメモリを弄るソフトを作ってみようと思い まず同梱されているサンプルをVisual Studio 2010 Professionalでコンパイルしてみようとしたのですが (サンプルの場所はダウンロードしたZIP内の\サンプル集\C言語\ のsample.cpp Memory.hです。) 1>sample.obj : error LNK2019: 未解決の外部シンボル _WriteMemory@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 1>sample.obj : error LNK2019: 未解決の外部シンボル _ReadMemory@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 1>C:\Users\hogehoge\Documents\Visual Studio 2010\Projects\testtesttest\Debug\testtesttest.exe : fatal error LNK1120: 外部参照 2 が未解決です。 と出力され、コンパイルされません。 何か問題があると思い、Google検索で色々調べたのですが分かりません・・・ 宜しければご助言を頂きたいです。お願い致します。

  • Visual Windows for BC++ のサンプルプログラムがエラーになる

    Visual Windows for BC++ をインストールした直後に、新しいプロジェクトをwindows型でつくり、サンプルプログラムをビルドしたところ、うまく実行ファイルができ、正常に動作しました。 次に、OpenCVを http://nautilus.cs.miyazaki-u.ac.jp/~yoshi/pukiwiki/index.php を参考にダウンロードして、 インクルードファイルの検索パスに3つ: C:\Program Files\OpenCV\cv\include、C:\Program Files\OpenCV\cxcore\include、C:\Program Files\OpenCV\otherlibs\highgui ライブラリファイルの検索パスに1つ:C:\Program Files\OpenCV\lib を追加しました。 OpenCVのサンプルプログラムをビルドしようとしたのですがエラーになり先に進みません。それどころか、インストール直後にビルドできたサンプルプログラムもエラーが出るようになってしまいました。 エラーが発生したため、brc32.exe を終了します。 となります。 コンパイルも、以下の警告が出るようになってしまいました。 私の設定が悪いのでしょうか、それとも、Visual Windows for BC++では、OpenCVは扱えない ということでしょうか? よろしくお願いします。 Visual Windows for BC++, Copyright (c) 2003-2007 M. Yasue: proj1.exe ビルド実行中..... Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland ..\hello.cpp: 警告 W8060 ..\hello.cpp 30: おそらく不正な代入(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 ..\hello.cpp 41: パラメータ 'hPrevInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 ..\hello.cpp 41: パラメータ 'lpCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 ..\hello.cpp 95: パラメータ 'message' は一度も使用されない(関数 __stdcall OnPaint(HWND__ *,unsigned int,unsigned int,long) ) 警告 W8057 ..\hello.cpp 95: パラメータ 'wParam' は一度も使用されない(関数 __stdcall OnPaint(HWND__ *,unsigned int,unsigned int,long) ) 警告 W8004 ..\hello.cpp 130: 'wmEvent' に代入した値は使われていない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) 警告 W8057 ..\hello.cpp 183: パラメータ 'lParam' は一度も使用されない(関数 __stdcall About(HWND__ *,unsigned int,unsigned int,long) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland リソースファイルコンパイル・リンク実行中..... Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. 終了.....

専門家に質問してみよう