获取系统信息是很常见的需求,C++ 作为一门底层语言,自然是可以做到的。获取系统信息可以说需要获取的信息非常多,从最基础的 IP 地址、MAC 地址、操作系统版本等等,到更深层次的 CPU 类型、内存大小、文件系统结构等等。在这里,我们将分别来介绍如何获取 IP 地址和如何获取硬件信息。
获取 IP 地址
要获取 IP 地址,我们需要用到 Winsock2 库。示例代码如下:
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData; //初始化 Winsock
SOCKET socket;
char hostname[256];
hostent* host;
char* ip;
WSAStartup(MAKEWORD(2,2), &wsaData);
gethostname(hostname, sizeof(hostname)); //获取本地主机名
host = gethostbyname(hostname); //获取主机信息
ip = inet_ntoa(*(in_addr*)host->h_addr_list[0]); //将 IP 地址转化为点分十进制字符串
printf("Hostname: %s\n", hostname);
printf("IP Address: %s\n", ip);
WSACleanup(); //清理 Winsock
return 0;
}
上述代码首先初始化了 Winsock,然后获取了本地主机名,接着调用 gethostbyname 获取主机信息,最后将 IP 地址转化为点分十进制字符串并输出即可。值得注意的是,在这里我们使用了 inet_ntoa 函数,它可以将 IP 地址从二进制格式转化为点分十进制格式。
获取硬件信息
要获取硬件信息,我们需要用到 WMI(Windows Management Instrumentation)技术。WMI 是一种面向 Windows 的管理技术,它将操作系统、硬件设施、应用程序等全部封装成一组对象,使得开发人员可以直接基于对象来完成管理和监控工作。在 C++ 中,我们可以通过 WMI COM 接口来访问 WMI 服务,从而获取硬件信息。
以下是一个示例代码,它使用 WMI COM 接口获取了 CPU 信息:
#include <comutil.h>
#include <Wbemidl.h>
#include <iostream>
#pragma comment(lib, "wbemuuid.lib")
int main()
{
HRESULT hr;
IWbemLocator* pLoc = NULL;
IWbemServices* pSvc = NULL;
IEnumWbemClassObject* pEnumerator = NULL;
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
CoInitializeEx(0, COINIT_MULTITHREADED);
hr = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
while (pEnumerator)
{
hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn) //没有找到数据
{
break;
}
VARIANT vtProp;
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); //获取 CPU 名称
printf("CPU Name: %ws\n", vtProp.bstrVal);
VariantClear(&vtProp);
}
pLoc->Release();
pSvc->Release();
pEnumerator->Release();
CoUninitialize();
return 0;
}
上述代码首先初始化了 COM,然后连接了 WMI 服务器,并创建了一个查询条件,这里的查询条件是 Win32_Processor,它可以获取 CPU 的详细信息。最后,我们通过枚举对象来获取 CPU 名称,并将其输出即可。
综上所述,我们可以使用 Winsock2 库来获取 IP 地址、使用 WMI COM 接口来获取硬件信息。当然,获取系统信息的方法远不止这些,如果你还需要其他的系统信息,你可以根据自己的需求来查找相应的 API 或库。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++如何获取系统信息 C++获取IP地址、硬件信息等 - Python技术站