早教吧 育儿知识 作业答案 考试题库 百科 知识分享

Vc++#pragmacomment(linker,"/DELAYLOAD:WS232.dll")typedefint(WINAPI*PFNPOPMSGBOX)(void);#pragmacomment(linker,"/DELAYLOAD:WS232.dll")在软件里面有这个东西!

题目详情
Vc++ #pragma comment(linker,"/DELAYLOAD:WS2_32.dll")
typedef int (WINAPI *PFN_POPMSGBOX)(void);
#pragma comment(linker,"/DELAYLOAD:WS2_32.dll")
在软件里面有这个东西!
▼优质解答
答案和解析
楼上的乱解释,我简单给你解释一下什么是DELAYLOAD吧
一般情况下,直接用#pragma comment(linker,"WS2_32.lib"),连接器在连接的时候,直接把该LIB对应的DLL加入到EXE的模块导入表中,这个表是在EXE执行之前由NTDLL模块去初始化的,各个模块的DLLMAIN会被执行,然后才轮到EXE代码执行;这里会有一个问题,如果这个DLL在EXE里并不一定会使用到,那么在初始化的时候就会浪费一些时间去初始化了
为了解决上述的问题,DELAYLOAD主出现了,注意它的用法是直接指定DLL名,而不是指定LIB名,使用了DELAYLOAD后,当且仅当你的EXE第一次调用到DLL里的函数的时候,这个DLL才会被LoadLibrary加载进EXE进程空间里,这个时候才进行DLL初始化;简单地说,DELAYLOAD就是用到的时候才加载,如果你的程序里走了其它分支,没有使用到ws2_32的API的时候,这个DLL是根本不会加载到进程空间里的