4
#include <windows.h>

DWORD WINAPI Main(LPVOID lpParam) {
    MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
    return S_OK;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch(fdwReason) {
        case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hinstDLL);
        CreateThread(NULL, 0, &Main, NULL, 0, NULL);
        break;

        case DLL_PROCESS_DETACH:
        break;

        case DLL_THREAD_ATTACH:
        break;

        case DLL_THREAD_DETACH:
        break;
    }

    return TRUE;
}

为什么我可以替换CreateThread(NULL, 0, &Main, NULL, 0, NULL);CreateThread(NULL, 0, Main, NULL, 0, NULL);并且它仍然可以工作?是因为在 C 中,如果我传递一个方法,它会将其简化为指向该方法的指针吗?还是因为DWORD是指针?

4

1 回答 1

2
  1. 从技术上讲,在 C 中,一切都是通过值传递的,而不是通过引用传递的。当指针作为参数传递时,它看起来就像通过引用传递。
  2. 最有可能DWORD被定义为机器上两个字大小的整数。
  3. 编译器会自动将函数名转换为指向函数的指针。

C99 §6.3.2.1 左值、数组和函数指示符

函数指示符是具有函数类型的表达式。除非它是运算sizeof符或一元&运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式。

此外,您可以使用*指向函数的指针,得到函数指示符作为结果。使用它,您可以稍微玩一下:

#include <stdio.h>

typedef void (*func_ptr)(void);
void foo(void)
{
    printf("hello\n");
}

int main(void)
{
    func_ptr p;
    p = &foo;   //function pointer
    p();
    p = foo;    //function name is converted to function pointer
    p();
    p = *foo;   //legal
    p();
    p = *****************foo;  //still legal
    p();
    return 0;
}

输出:

hello
hello
hello
hello
于 2013-10-20T02:47:14.633 回答