#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
是一个指针?
答案 0 :(得分:2)
DWORD
定义为机器上具有两个单词大小的整数。 C99§6.3.2.1左值,数组和函数指示符
函数指示符是具有函数类型的表达式。除非它是
sizeof
运算符或一元&
运算符的操作数,一个函数指示符 type''function returns type''转换为类型为''指针的表达式 函数返回类型''。
此外,你可以使用*
指向函数的指针,你得到函数指示符作为结果。使用它,你可以稍微玩一下:
#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