在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]);
}
}
编译运行的结果如上图所示。