__cdeclのコンパイルエラー

[戻る]
OIT 2007/01/31(水) 16:15:11
初めまして。
初心者なんで基本的な質問してしまうかもしれませんがお願いします。

error C2664: 1 番目の引数を 'void (DWORD,PVOID,PVOID)' から 'void (__cdecl *)
(DWORD,PVOID,PVOID)' に変換できません。
というエラーが出ます。

プログラムの内容としては
IDPCOM::RegisterHandler( void (*p_func)(DWORD, PVOID, PVOID), PVOID 
in_pvUserContext )
{
 …
}
って書いてあるライブラリがあって
IDPCOM    g_DPCOM;
if(g_DPCOM.RegisterHandler(DPCOM_MsgReceiveHandler, NULL )==false)
  return false;

CMainFrame::DPCOM_MsgReceiveHandler(DWORD dwMessageType, PVOID pMsgBuffer, 
PVOID pvUserContext)
{
 …
}
って感じです。
過去ログの同じような質問を参考にして、DPCOM_MsgReceiveHandlerの宣言の時に 
__cdecl をつけてみましてがエラーは直りませんでした。

どのようにしたらいいのでしょうか?
ご教授願います。

Blue 2007/01/31(水) 16:47:40
とりあえず、
>DPCOM_MsgReceiveHandler
の宣言側はどうなっているのでしょうか?

OIT 2007/01/31(水) 17:12:31
宣言側っていうとヘッダーの宣言のことかな?
それだともともとは
void DPCOM_MsgReceiveHandler(DWORD dwMessageType, PVOID pMsgBuffer, PVOID 
pvUserContext);
と書いてました。
これをここの過去ログを参考にして
void __cdecl DPCOM_MsgReceiveHandler(DWORD dwMessageType, PVOID pMsgBuffer, 
PVOID pvUserContext);
としてみましたがエラーの内容は変わりませんでした。

Blue 2007/01/31(水) 17:20:16
ん〜?

>CMainFrame::DPCOM_MsgReceiveHandler
からクラスのメソッドのように見えるのですが、CMainFrameというnamespaceなのでしょ
うか?

クラスのメソッドであるとき static がついていないと
>1 番目の引数を 'void (DWORD,PVOID,PVOID)' から 'void (__cdecl *)
ではなく__thiscallがうんたらというメッセージになると思ったんだけど。


それと、開発環境は必ず明記しておきましょう。
OS,VCのバージョン,プロジェクトの種類(MFCかCRLかそれ以外か)

OIT 2007/01/31(水) 17:46:12
失礼しました。
開発環境ですけどOSはXPでバージョンは2003.NETで種類はMFCです

CMainFrameはクラスでDPCOM_MsgReceiveHandlerはメソッドであってます。

Blue 2007/01/31(水) 17:49:50
> CMainFrameはクラスでDPCOM_MsgReceiveHandlerはメソッドであってます。
焦点は、

DPCOM_MsgReceiveHandlerにstaticがついているか?

です。
付けないと __thiscall になってしまいます。

参考
ロベールのC++教室 - 第57章 メンバ関数ポインタ天国 -
http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03057.html

OIT 2007/01/31(水) 17:59:14
[[解決]]
まだまだ勉強不足だったようですね。
このサイト見ながらがんばってみます。
ありがとうございました。

古いスレッドには追加発言できません。