DLL 学习1

一、孙鑫老师的讲解

资料:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0607/820674.html

 

二、动态链接库的使用

1)静态使用

1在工程中加入静态库,有两种方法:

方法一:项目设置中引用.lib,project-setting-link-object/library modules中添加.lib;(需要在tools/options设置正确的引用路径)

image

方法二:在项目中直接加入lib,project-add to project-files,选择正确的.lib。

2在工程中包括.h文件;(可能 需要在tools/options设置正确的引用路径)

3在工程中使用静态库中的函数.

2)动态使用

 

三、MFC库支持的DLL

MFC库支持两种DLL:扩展DLL和正规的DLL。

      扩展DLL动态链接到MFC库的DLL版本的代码,因此,扩展DLL要求客户程序被动态链接到MFC库,并且客户程序和扩展DLL要一致链接到MFCDLL的相同版本。扩展DLL可以导出整个类。

      正规DLL可以被任何编程环境装载,应该使用正规DLL。正规DLL可以导出C风格的函数,不能导出C++类。但,我们可以再内部使用C++类(特别是MFC库的类)。正规DLL可以选择静态链接和动态链接两种方式。

 

扩展DLL需要注意的事情:

1.必须把宏AFX_EXT_CLASS加到导出类声明中,如:

class AFX_EXT_CLASS CStudnet :public CObject

    对DLL工程中的H要修改,客户程序使用的H文件也一样要修改。

2.搜索顺序

EXE文件--扩展DLL--MFCDLL。如果资源ID在所有资源中式唯一的,MFC库将找到该资源。如果有重复的,将装入EXE资源。

搜索顺序的改变:

HINSTANCE hInstResourceClient = AfxGetResourceHandle();

AfxSetResourceHandle(::GetModuleHandle("mydllname.dll"));

CString strRes;

strRes.LoadString(IDS_MYSTRING);

AfxSetResourceHandle(hInstResourceClient);

扩展DLL使用:因为能导出整个类,所以可以直接使用。向使用自己的类一样。

 

正规DLL需要注意的事项:

1.使用AFX_MANAGE_STATE宏,如果使用静态链接可以不用。因为如果从一个正规MFC DLL中调用进入mfc42.dll,全局变量不同步,所以后果不可预知。需要在所有导出函数的开始处,加入

AFX_MANAGE_STATE(AfxGetStaticModuleState());

2.EXE资源函数装载自己的资源,DLL资源函数装载DLL自己的资源。exe想要装载DLL资源,可使用AfxGetResourceHandle进行改变。

原文地址:https://www.cnblogs.com/meetcomet/p/1587922.html