4

xp 32ビットでは、この行は問題なくコンパイルされますが、vista 64ビットでは、この行は次のようになります。

m_FuncAddr = ::GetProcAddress (somthing);

次のエラーが発生します

エラーC2440:'=':'FARPROC'から'int(__cdecl *)(void)'に変換できません

GetProcAddressは次のように定義されます

WINBASEAPI FARPROC WINAPI GetProcAddress (somthing)

そしてm_FuncAddras

int (WINAPI *m_FuncAddr)();

私が理解していることから、両方ともstdcallのものです。

エラーを避けるために私は入れなければなりませんでした

m_FuncAddr = (int (__cdecl *)(void))::GetProcAddress(somthing);

私の質問:

m_FuncAddrとGetProcAddressの両方にstdcall呼び出し規約がある場合、なぜcdeclで「呼び出す」必要があるのですか?

VSプロジェクト設定のデフォルトの呼び出し規約(cdeclに設定されている)が上記の割り当てステートメントを上書きする可能性はありますか?

前もって感謝します!

[編集]

質問を明確にするために:

方程式の片側(たとえば側1)に私は

int __stdcall * m_FuncAddr

反対側(サイド2)

INT_PTR far __stdcall GetProcAddress

では、両方がstdcallである場合、サイド2をcdeclでキャストする必要があるのはどうしてですか?それとも私は何かを得ていませんか?

4

2 に答える 2

3

戻り値のタイプはINT_PTR(64ビットビルドでは64ビット値)である必要があります。このエラーを回避するべきではありません。コンパイラは、何かが間違っていることを通知しようとしています。

WinDef.hから:

#ifdef _WIN64
typedef INT_PTR (FAR WINAPI *FARPROC)();

したがって、m_FuncAddrの宣言は次のようになります。

INT_PTR (WINAPI *m_FuncAddr)();
于 2008-10-17T01:38:39.607 に答える
2

32ビットで正しくコンパイルされるのは偶然です。正しい構文は次のとおりです。

typedef int (WINAPI *FFuncType)();
FFuncType m_FuncAddr;
m_FuncAddr = (FFuncType)::GetProcAddress (somthing);

::GetProcAddressの結果を適切な関数シグネチャに明示的にキャストする必要があります。32ビットでは、FARPROCはたまたまあなたが持っている署名で動作しますが、おそらく64ビットでは動作しません。

編集:はい、実際、windef.hを見ると、戻り型は64ビットのINT_PTRであるため、コンパイラエラーが発生しました。ただし、FARPROCのプレースホルダーと一致しない関数については、上記のように関数シグネチャにキャストする必要があるため、一般的には上記のように行う必要があります。

于 2008-10-17T01:36:12.250 に答える