//机器名 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); } |
// 唯一的一个 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); } |
为了让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]); } } |