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

您需要将其转换为函数指针类型。为简化起见,使用 atypedef作为函数指针类型:

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

另一个优雅的解决方案(它只是 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 回答