我无法弄清楚这个 typedef 以及 WINAPI(stdcall) 宏在那里做了什么
typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
进一步描述了以下内容:
LPFN_ISWOW64PROCESS fnIsWow64Process;
void x_32_64(list <info> &gqlist)
{
BOOL bIsWow64 = FALSE;
//IsWow64Process is not available on all supported versions of Windows.
//Use GetModuleHandle to get a handle to the DLL that contains the function
//and GetProcAddress to get a pointer to the function if available.
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
list <info> ::iterator it;
for (it = gqlist.begin(); it != gqlist.end(); ++it)
{
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(OpenProcess(PROCESS_QUERY_INFORMATION, false, it->num_PID), &bIsWow64))
{
it->x_bit = 9;
}
}
///////////
}
目前尚不清楚这里发生了什么:
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
为什么它fnIsWow64Process
开始表现得像一个函数?
让我们从它是什么开始
typedef
。粗略地说,从一个变量声明,这个词构成了一个类型声明。让我们用参数传递约定和返回值声明一个函数 -
LPFN_ISWOW64PROCESS
、 fromHANDLE
和:PBOOL
WINAPI
BOOL
指向某事物的指针是如何声明的?归因于
*
。因此,您可以
LPFN_ISWOW64PROCESS
像这样指向那个可怕的函数:需要括号以便编译器理解
*
.并且
typedef
它不会LPFN_ISWOW64PROCESS
创建指向此类函数的指针,而是指向它的指针类型。那些。这现在
LPFN_ISWOW64PROCESS
可以用作类型名称。那些。现在
fnIsWow64Process
- 指向上述如此糟糕的函数的指针。全部。仍然需要为其赋值并像使用常规函数一样工作 - 因为函数的名称和指向它的指针是可以互换的。
PS为什么,具有如此完整的互换性,有必要使用一个指针,而不仅仅是一个名字
typedef
——好吧,就像让大师在标准中解释这一点......