VC++.NET中定义和使用MFC DLL(一)

什么是DLL?

  DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库。DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。

  在下面我们将通过一个具体的例子来说明如何利用VC.Net定义一个DLL文件,并且在VC.Net的应用程序中调用,这个例子的主要功能是通过DLL获取系统的机器名、操作系统类型和IP地址。

  在VC.Net中定义DLL文件

  选择VC.Net菜单项,选择文件->新建->项目,在弹出的新建项目的对话框中,选择项目类型为Visual C++ 项目,类别为MFC的工程,在右边的模板中,选择MFC DLL模板,给项目取名为TestDLL,选择好项目的位置,按确定健,进入应用程序设置。
 

  在应用程序设置中,我们可以看到,有三种DLL类型,它们依次对应着三类DLL。

  静态DLL与共享DLL的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的共享DLL所有输出的函数应该以如下语句开始(用于正确切换MFC模块状态): AFX_MANAGE_STATE(AfxGetStaticModuleState( )) 扩展DLL用来建立MFC的派生类,只被用MFC类库所编写的应用程序调用。常规DLL(包括静态与动态)的一个特点是在源文件里有一个继承CWinApp的类(从CWinApp派生,但没有消息循环),被导出的函数是C++类或者C++成员函数,调用常规DLL的应用程序不必一定是MFC应用程序。扩展DLL和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,编译器默认了一个DLL入口函数DLLMain()作为对DLL的初始化。

  另外还可以添加两个附加功能:自动化和windows套接字,如果选择了这两项,程序会做一些初始化,在这里我们就不做讨论了。

  在这个例子里,我们选择“使用共享的MFC DLL”。

  添加代码:

  1、在工程中导入systeminfo.cpp和systeminfo.h文件,这两个文件用来获取本机的机器名,操作系统版本和本机IP列表,具体的定义,请参考源文件。

  在TestDLL.h头文件中,引入systemInfo.h头文件

#include "systemInfo.h"

  添加变量:

CSystemInfo m_SystemInfo;

  2、在CTestDLLApp类中添加三个函数用户获取信息:

程序代码:
//机器名
char* GetHostName(void);
//系统类型
char* GetSystemType(void);
//IP地址
void GetIPAddressList(char ** lpIPList,DWORD *lpNumber);  函数定义如下:程序代码:
//机器名
char* CTestDLLApp::GetHostName(void)
{
char* lpsz = new char[1024];
m_SystemInfo.GetHostName(lpsz);
return lpsz;
}
//系统类型
char* CTestDLLApp::GetSystemType(void)
{
char* lpsz = new char[1024];
m_SystemInfo.GetlSystemType(lpsz);
return lpsz;
}
//IP地址
void CTestDLLApp::GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
{
m_SystemInfo.GetIPAddressList(lpIPList,lpNumber);
}
  3、添加输出函数:

  打开TestDLL工程中的“TestDLL.cpp”文件,在: // 唯一的一个 CTestDLLApp 对象
CTestDLLApp theApp;

的后面添加输出的DLL函数,函数定义如下:

程序代码:
/******************* 在这里添加输出函数 ***************************/
/********************************************
函数名称:GetHostName
功能:获取本机的机器名称
返回:strHostName-本机机器名称
*********************************************/
extern "C" _declspec(dllexport) void GetHostName(LPTSTR strHostName )
{
//如果是传递字符串需要使用strcpy拷贝字符串的地址,而不能直接等于。
strcpy(strHostName,theApp.GetHostName());
}
/********************************************
函数名称:GetSystemType
功能:获取本机操作系统版本
返回:strSystemType-本机操作系统版本
*********************************************/
extern "C" _declspec(dllexport) void GetSystemType(char * strSystemType)
{
strcpy(strSystemType,theApp.GetSystemType());
}
/********************************************
函数名称:GetIPAddressList
功能:获取本机的IP地址
返回:lpIPList-本机的IP地址数组,lpNumber IP地址个数
*********************************************/
extern "C" _declspec(dllexport) void GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
{
theApp.GetIPAddressList(lpIPList,lpNumber);
}

最后编译工程文件,生成TestDLL.dll文件。

  至此,一个DLL文件已经做好了。

时间: 2024-10-08 08:02:42

VC++.NET中定义和使用MFC DLL(一)的相关文章

VC++.NET中定义和使用MFC DLL(二)

在VC.Net中使用DLL文件 新建一个基于对话框的VC.Net工程DemoTestDLL,界面如下图(运行结果图): 为了让DemoTestDLL能够调用TestDLL.dll程序,需要让前者能够"看见" DLL程序.我们将TestDLL.dll文件考到DemoTestDLL的Debug目录下,一个Windows程序定位DLL的次序是: 1. 包含EXE文件的目录. 2. 进程的当前工作目录. 3. Windows系统目录. 4. Windows目录. 5. 列在Path环境变量中的

VC类中定义静态常量

在C++类中定义常量,有以下两种方法:1.在类定义体内定义枚举常量; 例如: class A { public: enum { THREAD_NUM = 100, MEM_BLOCK_SIZE = 1024, PORT = 8080 }; }; 这样定义出来的常量值在程序运行过程中是不能被修改的,编译的时候就已经确定了这些常量的值; 2.在类定义体中声明使用static const来修饰成员常量,然后在类定义体外对这些成员进行初始化;也就是说在类定义体内定义const类型的静态成员常量; 例如:

在vc.net2005中如何定义一个抽象类?

问题描述 我在vc.net2005中定义了一个Node抽象类,并定义了一个ProgramNode类继承这个Node类,在ProgramNode中实现了display()方法,但是一编译就提示一堆错误,希望高手解答publicrefclassNode{public:virtualvoiddisplay()=0;};#include"Node.h"refclassProgramNode:publicNode{public:ProgramNode(void){}overridevoiddis

VC++动态链接库(DLL)非MFC DLL介绍

  4.1一个简单的DLL 第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数. 如图6,在VC++中new一个Win32 Dynamic-Link Library工程dllTest(单击此处下载本工程附件).注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是第5.6节要讲述的MFC 动态链接库. 图6 建立一个非MFC DLL 在建立的工程中添加lib.h及lib.cpp文件,源

Win32 DLL和MFC DLL 中封装对话框

现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题.这里我们从Win32   DLL和MFC   DLL两个方面来分析并解决这个问题.           1.Win32   DLL               在Win32   DLL中使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件.然后使用DialogBox或者CreateDialog这两个函数(或相同作用的其它函数)来创建对话框,并定义

ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义 .的分析解决办法

  很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Library) 连结,以及关于 MSVC 与 CRT 之间的种种恩怨情仇. 如果你使用的作业系统是 Linux.Mac 或其他非 Windows 平台,你可以忽略这篇文章:如果你使用的作业系统是 Windows 平台,但没有用 Microsoft Visual Studio C++(以下简称为 MSVC)软体撰写 C++ 程式的话,这篇文章对你的帮助可能很有限:但如果你的作业系统是 Windows,而且你使用的程式整合开发环

关于mfc对话框移植到vc.net中的问题

问题描述 我在vc6.0中作了一个dll里面有一个函数,这个函数用于显示一个模式对话框,即用domodal形式显示的,但是当我在vc2005中调用(用clr编译)这个函数时竟然报错,请问如何解决 解决方案 解决方案二:你这样说,谁能帮的了你?解决方案三:如何做一个在vc.net中显示一个由VC6.0创建的模式对话框的程序?这样说可以吗?解决方案四:是用MFC的对话框?那肯定不行了,C++的lib是不同编译器不能互相使用的就算都是VC不同版本也不通用.解决方案五:我已经知道方法是什么了,谢谢大家的

怎样在MFC中调用C#编写的DLL

一.使用 /clr 编译 MFC 可执行文件或规则 DLL 1.打开"项目属性"对话框,方法是右键单击"解决方案资源管理器"中的项目并选择"属性". 2.展开"配置属性"旁边的节点并选择"常规".在右侧窗格中的"项目默认值"下,将"公共语言运行库支持"设置为"公共语言运行库支持 (/clr)". 3.在相同的窗格中,确保将"MFC 的使用

线程-mfc中定义大量宏的问题

问题描述 mfc中定义大量宏的问题 我定义了大量的宏,在cmainframe和一个共有类(用于存放一些静态函数和变量,主要是为了线程函数中使用全局变量)中里面的一个函数中需要使用到,我直接把它们放在一个头文件中然后include,就报了error LNK2005: ""struct Zeni_MTS_Rolypon_InOut InOutRoly"" (?InOutRoly@@3UZeni_MTS_Rolypon_InOut@@A) already defined