VC++.NET中定义和使用MFCDLL

VC++.NET中定义和使⽤MFCDLL
什么是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⽂件已经做好了。
在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环境变量中的⼀系列⽬录。
  在测试DLL按钮添加下⾯代码:
翻译论坛void CDemoTestDLLDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//声明DLL函数
typedef void (_cdecl *GETHOSTNAME)(LPTSTR strHostName);
typedef void (_cdecl *GETSYSTEMTYPE)(char * strSystemType);
typedef void (_cdecl *GETIPADDRESSLIST)(char ** lpIPList,DWORD *lpNumber);
//声明函数句柄
HMODULE hTestDLL = NULL;
GETHOSTNAME GetHostName = NULL;
GETSYSTEMTYPE GetSystemType = NULL;
GETIPADDRESSLIST GetIpAddressList = NULL;
// 加载动态链接库
hTestDLL = LoadLibrary("TestDLL.dll");
if(hTestDLL == NULL)/
{
printf("cannot load LCDDLL.dll/n");
exit(0);
}
/*** 到每个函数的⼊⼝ ****/
//系统名称
GetHostName = (GETHOSTNAME)GetProcAddress(hTestDLL,"GetHostName");
if(GetHostName==NULL)
{
printf("cannot load process GetHostName/n");
FreeLibrary(hTestDLL);
exit(1);
}
//操作系统类型
GetSystemType = (GETSYSTEMTYPE)GetProcAddress(hTestDLL,"GetSystemType");
if(GetSystemType==NULL)
{
printf("cannot load process GetSystemType/n");
FreeLibrary(hTestDLL);
exit(1);
}
//IP地址列表
GetIpAddressList = (GETIPADDRESSLIST)GetProcAddress(hTestDLL,"GetIPAddressList"); if(GetSystemType==NULL)
{
printf("cannot load process GetIpAddressList/n");
FreeLibrary(hTestDLL);
exit(1);
}
/*** 使⽤LPTSTR和使⽤char*定义的效果是⼀样的 ***/
//取机器名称
LPTSTR szHostName = new char[1024];
(*GetHostName)(szHostName);
//取操作系统类型海尔老总
char* szSystemType = new char[1024];
四君子汤加减
(*GetSystemType)(szSystemType);
//IP Address List
DWORD ipListNumber = 0;
//声明⽅式⼀
//LPTSTR* lpAddress = new LPTSTR[256];
//声明⽅式⼆
char** lpAddress = new char*[256];
for(int i=0;i<256;i++)
{
lpAddress[i] = NULL;
}
(*GetIpAddressList)(lpAddress,&ipListNumber);
//显⽰在界⾯
m_setHostName.SetWindowText(szHostName);
m_setSystemType.SetWindowText(szSystemType);
//将IP添加到list 中
for(int i=0;i<ipListNumber;i++)
{
m_IPList.AddString(lpAddress[i]);
}
}
  编译运⾏的结果如上图所⽰。

本文发布于:2024-09-23 20:11:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/137426.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   程序   添加   本机   获取   选择   输出   机器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议