字体
第(2/4)页
关灯
   存书签 书架管理 返回目录
口函数,不需要编写自己的DLL

    入口函数,用这个默认的入口函数就能使动态链接库在被调用时初始化。如果应用程序的

    DLL 需要分配额外的内存或资源,即对每个进程或线程初始化和清除cāo作时,就需要在相应

    的DLL 工程的CPP 文件中对DllMain()函数按照下面的格式书写,代码如下:

    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

    {

    switch( ul_reason_for_call )

    {

    case DLL_PROCESS_ATTACH:

    .......

    case DLL_THREAD_ATTACH:

    .......

    case DLL_THREAD_DETACH:

    .......

    case DLL_PROCESS_DETACH:

    .......

    }

    return TRUE;

    }

    注意:函数名DllMain 是区分大小写的。许多编程人员有时调用的函数是DLLMain。这是一个非

    常容易犯的错误,因为DLL 这个词常常使用大写来表示。如果调用的进入点函数不是

    DllMain,而是别的函数,代码将能够编译和链接,但是其进入点函数永远不会被调用,

    DLL 永远不会被初始化。

    参数hinstDll 包含了DLL 的实例句柄。与(w)WinMain 函数的hinstExe 参数一样,这个

    值用于标识DLL 的文件映像被映shè到进程的地址空间中的虚拟内存地址。通常将这个参数保

    枫叶文学网www.fywxw.com

    Visual C++ 6.0 程序设计从入门到精通

    ·254·

    存在一个全局变量中,这样就可以在调用加载资源函数(如DialogBox 和LoadString)时使

    用它。最后一个参数是fImpLoad,如果DLL 是隐含加载的,那么该参数将是个非0 值,如

    果DLL 是显式加载的,那么它的值是0。

    参数fdwReason 用于指明系统为什么调用该函数。该参数可以使用

    DLL_PROCESS_ATTACH( 进程被调用)、DLL_THREAD_ATTACH( 线程被调用)、

    DLL_PROCESS_DETACH(进程被停止)、DLL_THREAD_DETACH(线程被停止)4 个值的

    其中之一,lpReserved 为保留参数。下面就具体介绍这4 个值的意义。

    1.DLL_PROCESS_ATTACH 通知

    当DLL 被初次映shè到进程的地址空间中时,系统将调用该DLL 的DllMain()函数,给它

    传递参数fdwReason 的值DLL_PROCESS_ATTACH。只有当DLL 的文件映像初次被映shè时,

    才会出现这种情况。如果线程在后来为已经映shè到进程的地址空间中的DLL 调用

    LoadLibrary(Ex) 函数, 那么cāo作系统只是递增DLL 的使用计数, 它不会再次用
上一页 目录 下一页