5
BOOL (WINAPI *gmse)(LPMEMORYSTATUSEX) = GetProcAddress(
                kernel32, "GlobalMemoryStatusEx");

これは .cpp ファイルにあります。上記のコードをコンパイルしているときに、以下のエラーが発生します。

error C2440: 'initializing' : cannot convert from 'FARPROC' to 'BOOL (__cdecl *)(LPMEMORYSTATUSEX)'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast

GetProcAddress関数を何にキャストする必要があるのか​​ わからないようです。誰かが私を正しい方向に向けることができますか?

ありがとう

4

3 に答える 3

7

関数ポインタ型にキャストする必要があります。簡単にするtypedefために、関数ポインター型にa を使用します。

typedef BOOL (WINAPI *gmse_t)(LPMEMORYSTATUSEX);

gmse_t gmse = (gmse_t)GetProcAddress(kernel32, "GlobalMemoryStatusEx");

MSDNのGetProcAddress()リファレンス ページにサンプル コードが記載されています。

于 2013-03-28T11:00:37.647 に答える
2

から取得した一般的なポインターをキャストする必要がありますGetProcAddress

したがって、現在の代わりに

BOOL (WINAPI *gmse)(LPMEMORYSTATUSEX) = GetProcAddress(
            kernel32, "GlobalMemoryStatusEx");

行う

auto const gmse = reinterpret_cast<BOOL (WINAPI*)(LPMEMORYSTATUSEX)>(
   GetProcAddress( kernel32, "GlobalMemoryStatusEx" )
   );

それを追加することに加えてconst、その関数ポインターにはより自己文書化された名前を使用しGLobalMemoryStatusExます。

于 2013-03-28T11:10:01.900 に答える
0

もう1つの、まだエレガントなソリューション(これは、Cheers'とhmjdの回答を組み合わせた洗練されたバージョンです)は次のとおりです。

typedef BOOL (WINAPI *gmse_t)(LPMEMORYSTATUSEX);
gmse_t gmse;
gmse = reinterpret_cast<gmse_t>(
   GetProcAddress( kernel32, "GlobalMemoryStatusEx" )
   );
于 2018-09-10T08:10:19.540 に答える