DLL的一些背景知识

  1.  

DLL的背景知识

 

  1.  

  2. 静态链接和动态链接

     

当前链接的目标代码(.obj)如果引用了一个函数却没有定义它,链接程序可能通过两种途径来解决这种从外部对该函数的引用:

  •  

  • 静态链接

     

链接程序搜索一个或者多个库文件(标准库.lib),直到在某个库中找到了含有所引用函数的对象模块,然后链接程序把这个对象模块拷贝到结果可执行文件(.exe)中。链接程序维护对该函数的所有引用,使它们指向该程序中现在含有该函数拷贝的地方。

  •  

  • 动态链接

     

链接程序也是搜索一个或者多个库文件(输入库.lib),当在某个库中找到了所引用函数的输入记录时,便把输入记录拷贝到结果可执行文件中,产生一次对该函数的动态链接。这里,输入记录不包含函数的代码或者数据,而是指定一个包含该函数代码以及该函数的顺序号或函数名的动态链接库。

当程序运行时,Windows装入程序,并寻找文件中出现的任意动态链接。对于每个动态链接,Windows装入指定的DLL并且把它映射到调用进程的虚拟地址空间(如果没有映射的话)。因此,调用和目标函数之间的实际链接不是在链接应用程序时一次完成的(静态),相反,是运行该程序时由Windows完成的(动态)。

这种动态链接称为加载时动态链接。还有一种动态链接方式下面会谈到。

  1.  

  2. 动态链接的方法

     

链接动态链接库里的函数的方法如下:

  •  

  • 加载时动态链接(Load_time dynamic linking)

     

如上所述。Windows搜索要装入的DLL时,按以下顺序:

应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。

  •  

  • 运行时动态链接(Run_time dynamic linking)

     

程序员使用LoadLibrary把DLL装入内存并且映射DLL到调用进程的虚拟地址空间(如果已经作了映射,则增加DLL的引用计数)。首先,LoadLibrary搜索DLL,搜索顺序如同加载时动态链接一样。然后,使用GetProcessAddress得到DLL中输出函数的地址,并调用它。最后,使用FreeLibrary减少DLL的引用计数,当引用计数为0时,把DLL模块从当前进程的虚拟空间移走。

  1.  

  2. 输入库(.lib):

     

    输入库以.lib为扩展名,格式是COFF(Common object file format)。COFF标准库(静态链接库)的扩展名也是.lib。COFF格式的文件可以用dumpbin来查看。

    输入库包含了DLL中的输出函数或者输出数据的动态链接信息。当使用MFC创建DLL程序时,会生成输入库(.lib)和动态链接库(.dll)。

     

  3. 输出文件(.exp)

     

    输出文件以.exp为扩展名,包含了输出的函数和数据的信息,链接程序使用它来创建DLL动态链接库。

     

  4. 映像文件(.map)

     

    映像文件以.map为扩展名,包含了如下信息:

    模块名、时间戳、组列表(每一组包含了形式如section::offset的起始地址,长度、组名、类名)、公共符号列表(形式如section::offset的地址,符号名,虚拟地址flat address,定义符号的.obj文件)、入口点如section::offset、fixup列表。

     

  5. lib.exe工具

     

    它可以用来创建输入库和输出文件。通常,不用使用lib.exe,如果工程目标是创建DLL程序,链接程序会完成输入库的创建。

    更详细的信息可以参见MFC使用手册和文档。

     

  6. 链接规范(Linkage Specification )

     

    这是指链接采用不同编程语言写的函数(Function)或者过程(Procedure)的链接协议。MFC所支持的链接规范是“C”和“C++”,缺省的是“C++”规范,如果要声明一个“C”链接的函数或者变量,则一般采用如下语法:

    #if defined(__cplusplus)

    extern "C"

    {

    #endif

     

    //函数声明(function declarations)

    //变量声明(variables declarations)

    #if defined(__cplusplus)

    }

    #endif

    所有的C标准头文件都是用如上语法声明的,这样它们在C++环境下可以使用。

     

  7. 修饰名(Decoration name)

     

“C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原型时生成的字符串。有些情况下使用函数的修饰名是必要的,如在模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C++”函数等。

修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。

    1.  

    2. 调用约定

       

调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定:

  1.  

  2. _cdecl

     

    按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。

    如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。

    这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。

     

  3. _stdcall

     

    按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。

    所有的Win32 API函数都遵循该约定。

     

  4. _fastcall

     

    头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右到左的顺序压入栈。由被调用者把参数弹出栈,对于“C”函数或者变量,修饰名以“@”为前缀,然后是函数名,接着是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是@func@12。对于“C++”函数,有所不同。

    未来的编译器可能使用不同的寄存器来存放参数。

     

  5. thiscall

     

    仅仅应用于“C++”成员函数。this指针存放于CX寄存器,参数从右到左压栈。thiscall不是关键词,因此不能被程序员指定。

     

  6. naked call

     

    采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。

    naked call不是类型修饰符,故必须和_declspec共同使用,如下:

    __declspec( naked ) int func( formal_parameters )

    {

    // Function body

    }

     

  7. 过时的调用约定

     

原来的一些调用约定可以不再使用。它们被定义成调用约定_stdcall或者_cdecl。例如:

#define CALLBACK __stdcall

#define WINAPI __stdcall

#define WINAPIV __cdecl

#define APIENTRY WINAPI

#define APIPRIVATE __stdcall

#define PASCAL __stdcall

 

表7-1显示了一个函数在几种调用约定下的修饰名(表中的“C++”函数指的是“C++”全局函数,不是成员函数),函数原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。

表7-1 不同调用约定下的修饰名

 

调用约定

extern “C”或.C文件

.cpp, .cxx或/TP编译开关

_cdecl

_test

?test@@ZAXXZ

_fastcall

@test@0

?test@@YIXXZ

_stdcall

_test@0

?test@@YGXXZ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: uxtheme.dll是一个与Windows 7 64位系统相关的动态链接库文件。它主要用于实现Windows主题的应用程序编程接口(API)和用户界面(UI)元素的定制化。 Windows主题是用户界面的一个重要组成部分,它决定了窗口外观、颜色、字体、图标等。uxtheme.dll文件在Windows 7 64位系统中起到了关键作用,它允许用户自定义和更改系统的外观和风格,例如更换壁纸、窗口样式和任务栏样式等。通过修改uxtheme.dll文件,用户可以实现自己喜欢的界面风格,提高系统的个性化和用户体验。 然而,为了确保系统的稳定性和安全性,修改uxtheme.dll文件需要小心谨慎。不正确的修改可能会导致系统崩溃或运行异常。因此,在对uxtheme.dll进行任何修改之前,建议备份原始文件,并确保从可信的来源获取修改的文件。 总而言之,uxtheme.dllWindows 7 64位系统的一个重要文件,它允许用户定制系统界面的外观和风格。但是,对于普通用户来说,谨慎操作、备份原始文件、从可信来源获取修改的文件是非常重要的。 ### 回答2: uxtheme.dllWindows操作系统中的一个动态链接库文件,它在用户界面设计方面起到关键作用。它的作用是允许用户通过更改视觉样式和主题来个性化他们的Windows系统。在Windows 7的64位版本中,uxtheme.dll文件也存在。使用uxtheme.dll for win7 64,你可以通过安装第三方的视觉样式、主题和皮肤来扩展Windows 7的外观和个性化选项。 安装uxtheme.dll for win7 64的过程相对简单。你需要下载合适的第三方视觉样式或主题文件,确保它们被正确地编写和兼容于Windows 7 64位版本。然后,将这些文件复制到系统文件夹中替换原有的uxtheme.dll文件。在替换之前,你应该创建一个uxtheme.dll的备份,以便需要恢复时使用。在替换完成后,重新启动计算机,以使更改生效。现在,你可以打开个性化设置菜单,在主题选项中看到你所安装的第三方视觉样式或主题。 使用uxtheme.dll for win7 64可以让你的Windows 7系统更加个性化,并为你提供更多的界面定制选项。不过需要注意的是,安装第三方视觉样式或主题可能会导致系统不稳定或出现兼容性问题,因此在安装之前要确保从可靠的来源下载,并仔细阅读用户评论和评价。另外,它也需要你有一定的计算机知识和技巧来进行操作。如果你对此不熟悉或担心可能出现问题,建议不要随意更改系统文件。 总结起来,uxtheme.dll for win7 64为Windows 7 64位系统提供了更多的个性化界面选项,让用户能够通过安装第三方视觉样式或主题来改变系统的外观。这可以使你的Windows 7系统与众不同,适应个人的品味和喜好。 ### 回答3: uxtheme.dllWindows操作系统中的一个动态链接库文件,主要用于支持用户界面的主题样式和外观。在Windows 7 64位版本中,uxtheme.dll文件的作用是允许用户安装和使用自定义主题。 Windows的默认主题通常比较简单和基础,但通过使用uxtheme.dll文件,用户可以轻松地安装并应用各种自定义主题,以改变Windows界面的外观和风格。这对于那些喜欢个性化操作系统外观的用户来说是非常有用和重要的。 安装和使用uxtheme.dll文件需要一些步骤。首先,用户需要获得所需的自定义主题文件,这些主题文件通常以.theme文件格式提供。然后,用户需要将uxtheme.dll文件替换为系统目录中的原始文件,以启用自定义主题的支持。这需要管理员权限才能完成。 一旦uxtheme.dll被替换,用户可以通过简单地双击.theme文件来应用自定义主题。应用主题后,Windows的界面将立即改变,包括窗口边框、任务栏、图标和颜色等。用户还可以根据个人喜好和需求进一步调整和自定义主题,例如更改背景图片、音频等。 然而,需要注意的是在安装和使用自定义主题时,用户需要谨慎选择和下载可靠的主题文件,以避免潜在的安全风险和不稳定性问题。此外,如果不小心替换了错误的uxtheme.dll文件,可能会导致系统出现问题,因此在操作之前最好备份原始文件。 总的来说,uxtheme.dll对于Windows 7 64位版本的用户来说是一个有用且重要的文件,它允许用户安装和使用各种自定义主题,使操作系统界面更加个性化和吸引人。但在操作之前,用户需要了解相关步骤和注意事项,以确保安全和稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值