动态链接库(DLL)

  • 它们是包含许多函数的独立文件,这些函数可以被应用程序和其它DLL调用以完成某些特定的工作。
  • 动态链接库一般不能直接执行,而且它们一般也不接收消息。
  • 一个动态链接库只有在另外一个模块调用其所包含的函数时才被启动。
  • “静态链接”是在程序开发过程中发生的,用于把一些文件链接在一起创建一个Windows可执行文件。动态链接则发生在程序运行时。
  • 只有扩展名为.DLL的动态链接库才能被Windows操作系统自动加载。
  • 对象库是一个扩展名为.LIB的文件,这个文件中的代码在运行链接器进行静态链接时被添加到程序的.EXE文件中。
  • 导入库是一种特殊形式的对象库文件,链接器用它来解析源代码中的函数调用。导入库不包含任何代码,它们只给链接器提供信息,以建立.EXE文件中用于动态链接的重定位表格。
  • 当Windows在运行程序前加载DLL模块的时候,该库文件必须存放在.EXE程序所在目录下,或在当前目录、Windows系统目录、Windows目录、MS-DOS环境下的PATH字符串中的某一目录下。
  • vc中的客户区(workspace)为vs中的solution
  • EXPORT标识符是用以确保函数名称被添加到.LIB中的关键字(使得链接器在链接使用这些函数的应用程序时可以正确解析该函数名),并确保这些函数在EDRLIB.DLL中可见。如果头文件由C++模式编译,则EXPORT标识符会包含存储类关键字_declspec(dllexport)和extern "C",防止编译器对C++函数名进行名称重整,从而使得C和C++程序都能使用该DLL。
  • 1 int WINAPI DllMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)

    第一个参数是库的实例句柄,fdwReason参数可以是四个值中的一个,用来说明Windows调用DllMain函数的原因。最后一个参数是系统保留参数。

  • 当库第一次开始时和终止时。DllMain函数都会被调用。
  • 一个程序可以被多次加载,并在Windows环境下同时运行。每一次程序加载都可以被认为是一个独立的进程。
  • 当fdwReason值为
    • DLL_PROCESS_ATTACH,表明动态链接库已经被映射到一个进程的地址空间。这相当于一个初始化信号,让库针对所服务进程的后续请求进行初始化工作。
    • DLL_PROCESS_DETACH,意味着这个进程不在需要该DLL了。
    • DLL_THREAD_ATTACH:意味着一个关联的进程创建了一个新的线程。
    • DLL_THREAD_DETACH:线程仍然存在,它甚至还可以在此过程发送线程消息,但它不应该在使用PostMessage,因为该线程可能在消息被收取之前就消失了。
  • 如果初始化成功,DllMain应该返回非0值。返回0将导致Windows无法运行该程序。
  • DLL所做的任何事情都代表应用程序的行为。如所有有它分配的的内存由应用程序拥有。
  • 多个进程可以共享动态链接库中相同的代码,且互不干扰。
  • Windows会为所有库模块维护一个“引用计数”,LoadLibrary让引用计数递增,当Windows加载使用某个动态库的任何程序时,该动态库的引用计数也会递增。FreeLibrary让引用计数减1,终止一个引用该动态库的程序的案例也会使该动态库的引用计数减1.当引用计数降到0,Windows会把这个动态库从内存中卸载。
  • 动态库不一定非导出函数(资源库)

猜你喜欢

转载自www.cnblogs.com/Toya/p/11061506.html