无法从'FARPROC'转换为'BOOL(__ cdecl *)(LPMEMORYSTATUSEX)'

时间:2013-03-28 10:57:42

标签: c++ winapi

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函数转换为什么。 有人可以指出我正确的方向吗?

由于

3 个答案:

答案 0 :(得分:7)

您需要将其强制转换为函数指针类型。为简化起见,请对函数指针类型使用typedef

typedef BOOL (WINAPI *gmse_t)(LPMEMORYSTATUSEX);

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

MSDN上的GetProcAddress()参考页提供了示例代码。

答案 1 :(得分:1)

您需要转换从GetProcAddress获得的通用指针。

所以,而不是当前的

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

DO

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

除了添加const之外,我还会为该函数指针使用更自我记录的名称,比如,调用它GLobalMemoryStatusEx呢?

答案 2 :(得分:0)

另一种优雅的解决方案(这只是Cheers和hmjd答案的完美结合)可以是:

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