Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165028
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 22
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-26 12:56
文章分类

全部博文(84)

文章存档

2015年(83)

2014年(1)

我的朋友

分类:

2015-05-25 16:35:27

原文地址:DLL 实践说明 (DllMain的使用) 作者:g_hk

DllMain的使用:
DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数 DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。下面是一个框架 DLLMain函数的例子。

如果我们在DllMain中写入下面的代码(在原来的gandll.c中添加下面的代码):
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);

    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            printf("Process attach. \n");
            break;

        case DLL_PROCESS_DETACH:
            printf("Process detach. \n");
            break;

        case DLL_THREAD_ATTACH:
            printf("Thread attach. \n");
            break;

        case DLL_THREAD_DETACH:
            printf("Thread detach. \n");
            break;
    }

    return (TRUE);
}

同时将dlltest\dlltest.c修改为:
#include
#include "dlltest.h"

int main(int argc, char **argv)
{
    printf("Simple DLL test start. \n");

    printf("Call DLL function: \n");
    printf("Test DLL values: %d \n", add2(1, 2));
    printf("Call DLL function end. \n");

    printf("Simple DLL test end. \n");

    return (0);
}

我简单的测试一下输出结果为:
C:\gandll\dlltest>dlltest
hModule.10000000 lpReserved.0012FD30
Process attach.
Simple DLL test start.
Call DLL function:
Test DLL values: 3
Call DLL function end.
Simple DLL test end.
hModule.10000000 lpReserved.00000001
Process detach.
也就是说DLL加载和应用程序退出的使用都会调用该函数(DllMain)的哦, 是应用程序一上来就调用的,不是用到该函数时才调用的!

好象有个问题:
下面的话来源:http://waiguai.blogdriver.com/waiguai/989918.html
采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对 DLL函数的动态链接。

我们看他说的“当应用程序运行过程中需要加载DLL文件时”, 我做的实验测试的是,在输出
Simple DLL test start.
Call DLL function:
这两行应该是不需要DLL的啊, 怎么应用程序在前面输出了:
hModule.10000000 lpReserved.0012FD30
Process attach.
这个呢? 这就说明其实应用程序一上来就调用了DLL的(还有一种可能就是他是正确的,由于编译器优化的原因使的该DLL一上来就被调用了)。
到地是为什么? 再查,再查。。。。。。
阅读(1032) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~