`

VC++6.0 DLL

 
阅读更多

一、静态连接库:.LIB;

动态链接库:.DLL;


二、动态链接库的好处:

2.1、主要是代码的共享;


三、Win32 DLL 的创建和使用

文件->新建->工程:Win32 Dynamic-Link Library

PS:中间碰到一个很奇怪的问题,我新建一个cpp文件后,怎么编译在Debug文件夹下都没有dll文件,重新建立工程2次都没有。但是后来又成了。我估计是我的文件名称写错了,将cpp写成app了!浪费了一个半小时!!!!


3.1、从DLL中导出函数

a、在函数前面加"_declspec(dllexport)"。例如 _declspec(dllexport) int add(int a, int b){};

b、用命令dumpbin命令查看dll文件导出的函数。例如 dumpbin DLL1.dll;


四、隐式链接方式加载DLL

4.1、利用extern声明外部函数

例如:extern int add(int a, int b); 在这句代码的后面,EXE程序就可以调用add函数了。

4.2、dumpbin 命令不只可以查看dll的导出函数,也可以查看exe调用的函数。例如:dumpbin -imports DllTest.exe。可以查看EXE程序调用了哪些dll函数(即上面4.1提到的用extern声明的外部函数);

4.3、Depands工具

该工具是实现了dumpbin同样功能的一个可视化工具。用其打开一个EXE,可查看该EXE调用的DLL和该DLL的导出函数。如果用来查看DLL,可以查看该DLL导出的函数;

4.4、利用_declspec(dllimport)声明外部函数

用"_declspec(dllimport)"可以和“extern”实现同样的功能,例如:

_declspec(dllimport) int add(int a, int b);

但是,如果调用的是动态库的话,"_declspec(dllimport)"命令可以是"编译器"生成“效率更高”的代码。

Q:为什么"_declspec(dllimport)"会令编译器生成效率更高的代码呢?

A:暂时不知!


五、从DLL中导出C++类

5.1、导出C++类的方法

class_declspec(dllexport) 类名{};

5.2、导出C++类中的函数的方法

例如:

class /*DLL1_API*/ Point
{
public:
void DLL1_API output(int x, int y);
void test();

};

此段代码就是讲类Point中的output函数导出,而test函数没有导出。在用命令dumpbin -exports DLL文件名 查看时,发现只导出类output函数,没有导出Point类。


六、解决名字改编问题

6.1、利用限定符:extern “C" 可以解决C++和C语言之间相互调用时函数命名的问题。但是这种方法有一个缺陷,就是不能用于导出一个类的成员函数,只能导出全局函数这种情况;

PS:如果再DLL需要导出的函数前面加上extern ”C"那么,C++写的DLL就可以被C写的客户端调用;

6.2、DEF文件的方式,可以让_stdcall的函数名称不改变,并且可以设定函数名称。包括类函数的名称。但是能不能定义类的名称暂时不知道。


七、显示加载方式加载DLL

简单介绍:主要通过

HMODULE LoadLibrary(LPCTSTR lpFileName);

FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);

两个函数来实现动态加载的。不需要在工程->设置->连接 里面设置lib。

静态加载在程序启动的时候就已经被加载到内存中了,而动态加载会在程序启动以后,调用时再加载到程序当中。节约内存,并且动态加载DLL的EXE,用工具或命令无法查看到相关调用信息。

7.1、根据函数名称动态加载DLL。函数名称,或者是名字改编的字符串(即用dumpbin -exports 命令查看的函数名称字符串);

72.、 也可以根绝序号调用DLL的函数,这样无论DLL的函数名称是否改编,只要知道需要可参数结构就可以调用。需要用到宏MAKEINTRESOURCE。例如:

MAKEINTSOURCE(1)表示需要为1的函数。

7.3、DllMain函数

7.4、MFC DLL

7.5、当动态加载链接库使用完毕后,最好能将DLL释放掉。用函数:

BOOL FreeLibrary(HMODULE hModule);


PS:有很多都很模糊,以后补充。



分享到:
评论

相关推荐

    vc++ 6.0 DLL 示例

    使用vc++ 6.0创建(动态链接库)并在其他语言中调用其中的函数

    vc++ 6.0使用dbghelp.dll生成dmp内存转储文件

    vc++ 6.0使用dbghelp.dll生成dmp内存转储文件,包含h、lib和dbghelp.dll文件,仅供参考。

    VC++6.0 win10(免安装,修复打开bug,MFC的dll的bug)

    VC++6.0经典软件(免安装,修复打开bug,MFC的dll的bug) 亲测win10可用

    在vc++6.0下如何生成Dll

    在vc++6.0下如何生成Dll 附各种生成dll和应用dll的 源码 和 说明文档

    VC++6.0仅供使用

    提供VC++6.0仅供使用提供VC++6.0仅供使用提供VC++6.0仅供使用提供VC++6.0仅供使用

    vc++6.0下使用GDI+

    该资源主要针对VC++6.0下GDI+的配置,文件包括GDI+函数的中文翻译、VC++6.0下的配置说明(本人使用过,绝对管用),GDI+的所有.h文件、lib文件、gdiplus.dll等资源。

    解决VC++6.0和Office2007冲突

    VC++6.0和Office2007有冲突,导致VC++6.0中的打开文件按钮不可用。用压缩包里边的FIleTool.dll文件配合操作步骤,即可以解决问题。

    VC++6.0插件

    VC++6.0插件,直接解压,在双击安装,把VA_X_path 目录下得Dll文件,复制到安装目录下就可以了,必须先安装VC++6.0软件!

    VC++6.0和Office2007不兼容问题解决办法(过程详细均有截图)

    VC++6.0中点击打开按钮或向工程中添加... 这是VC++6.0和Office2007不兼容问题造成的,本压缩包中的word文档描述了详细的解决办法,每步均有截图;压缩包中还提供了解决该问题需要的FileTool.dll,免去上网搜索和下载。

    win7下vc++6.0打开文件崩溃

    本dll文件专门为解决在win7操作系统下安装VC++6.0后无法在软件内使用打开文件功能,以及优化vc6,让vc6在win7下正常那个运行。

    VC++6.0写的一个DES加密解密模块

    华为一同学做的一个DES加密解密的dll 。没有测试过,但是可以做参考。

    Vc++6.0Vb6.0WS2010调用Vc写的DLL

    vc++6.0 制作MFCDLL,接口有 (1) int 传参赋值和取值 (2) 结构体传参 (3) 堆内存的分配和释放 二、VcCallvcDll vc++6.0 LoadLibrary方式调用HeapDLL.dll,测试HeapDLL.dll 的对外接口(含int传参、结构体传参、堆内存...

    vc++6.0 快速功能插件

    可在vc++6.0中应用可添加到工具栏。添加方式如下:在vc++应用环境中,鼠标右键“自定义”选择“附加项和宏定义”,浏览选中本文件(addinvc.dll)并打开。再在附加项和宏定义中勾选规范代码的插件。

    可用于VC++6.0与VS的GMP和MPFR大数库

    提供了可以在VS2008和VC++6.0上使用大数运算库GMP-6.1.1(提供C和C++接口),以及支持高精度浮点计算的MPFR-3.1.4(只含C接口)。 包含文件: gmp.h、gmpxx.h、mpfr.h、mpf2mpfr.h; libgmp-10.lib、libgmpxx-4.lib...

    VC++6.0_visual assist

    使用说明: 1.首先请确认你已经卸载了此程序旧的版本! 2.运行Setup目录中的程序安装原版程序!...3.复制CR目录中的VA_X.dll文件到安装目录并覆盖同名文件! 4.用鼠标双击CR目录中的VA_X.reg导入注册表! 5.恭喜你,你成功了!

    mfc42ud.dll vc++6.0 UNICODE设置

    将lib放于vc安装目录下的VC98\MFC\Lib中 dll文件分32位操作系统与64位操作系统: 64位放于:C:\Windows\SysWOW64 32位放于:C:\Windows\System32

    第一个VC++ 6.0的ADO编程示例(非ADO控件编程!)

    环境:Windows XP SP3、VC++ 6.0、Windows 2003 Server SDK、MS SQL Server 2000 使用步骤: 1、下载解压之后,先运行工程目录中的上课教学For SQL Server.sql脚本,在数据库中创建所需要的表 2、注意:如果你的...

    VC++6.0绿色版(支持MFC以及ATL)

    备注:如果编译出来的程序运行时出现为找到什么dll文件的, 说明你的系统缺少运行库,可以使用静态编译的方法来编译 或者下载那些缺少的dll文件,可以在这个地址下载 http://download.csdn.net/source/2209236 把缺少的...

    VC++6.0 通过ADO连接Access

    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF") 2.在ADODLG.cpp中加入 void CADODlg::OnBtnQuery() { CoInitialize(NULL); // 初始化COM环境 _...

    vc++6.0调试方法 还包括一些编译基础知识

    在没有安装Visual C++6.0的机器上不能运行,因为缺MFC42D.DLL等,除非选择use static dll when link。 4、ASSERT和VERIFY有什么区别 ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然编译,但不再判断...

Global site tag (gtag.js) - Google Analytics