我爱我的家园!

成功在于你是否努力,希望在于你是否相信自己!

 

DLL 实践说明 (DllMain的使用)

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 <stdio.h>
#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一上来就被调用了)。
到地是为什么? 再查,再查。。。。。。

posted on 2008-02-25 16:11 死神 阅读(7799) 评论(5)  编辑  收藏 所属分类: Windows编程

评论

# re: DLL 实践说明 (DllMain的使用) 2009-05-23 13:57 trypsin

检测到 LoaderLock
Message: DLL“C:\WINDOWS\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll”正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。


你好,我碰到了这样的一个问题,我是编程新手,不知能不能帮我解释一下上面的这个问题。

Gmail:
iamnortheastern@gmail.com

谢谢  回复  更多评论   

# re: DLL 实践说明 (DllMain的使用) 2009-12-01 00:06 高翔

写的很好.音乐更好.  回复  更多评论   

# re: DLL 实践说明 (DllMain的使用) 2011-09-13 10:31 johnyabc

请问这是什么曲?  回复  更多评论   

# re: DLL 实践说明 (DllMain的使用) 2011-09-13 10:32 johnyabc

不错!这是什么钢琴曲?  回复  更多评论   

# re: DLL 实践说明 (DllMain的使用) 2012-04-11 16:00 jackong

路过...
背景音乐:http://www.touchingchina.com/IMissYou.mp3  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

导航

统计

公告

欢迎大家来到我的个人世界!

常用链接

留言簿(3)

随笔分类(5)

随笔档案(9)

文章分类(37)

文章档案(41)

相册

语音技术

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜