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环境变量中的一系列目录。

  在测试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-08-03 06:28:55

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

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

什么是DLL? DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库.DLL是建立在客户/服务器通信的概念上,包含若干函数.类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL. 在下面我们将通过一个具体的例子来说明如何利用VC.Net定义一个DLL文件,并且在VC.Net的应用程序中调用,这个例子的主要

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