dll 实践说明 (dllmain的使用)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977290
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-09-20 16:17:57

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)的哦, 是应用程序一上来就调用的,不是用到该函数时才调用的!

好象有个问题:
下面的话来源:
采用隐式链接方式,程序员在建立一个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一上来就被调用了)。
到地是为什么? 再查,再查。。。。。。
阅读(11293) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图