C/C++获取CPU等硬件信息&&屏幕截图
打算练习Socket的时候用用,最近有点小事情,没时间继续完善,先把写的这些代码贴上来,有空了再完善一下。
HardwareInfo.h
#include <stdio.h>
#include <windows.h>
#include <vfw.h> #pragma comment(lib,"Vfw32.lib")
#pragma comment(lib,"winmm.lib")
#ifndef VER_NT_WORKSTATION
#define VER_NT_WORKSTATION 1
#endif /*
// vc6.0需定义
typedef struct _MEMORYSTATUSEX {
DWORD dwLength; // 结构体数据大小 sizeof(_MEMORYSTATUSEX)
DWORD dwMemoryLoad; // 内存使用率
LONGLONG ullTotalPhys; // 物理内存总大小(单位:字节)
LONGLONG ullAvailPhys; // 物理内存可用大小(单位:字节)
LONGLONG ullTotalPageFile; // 总页面大小(物理内存总大小+硬盘划分的虚拟内存总大小)(单位:字节)
LONGLONG ullAvailPageFile; // 当前进程能获取的最大内存数(单位:字节)
LONGLONG ullTotalVirtual; // 当前进程最大内存寻址地址(默认2GB,开启大地址后就是4GB)
LONGLONG ullAvailVirtual; // 当前进程可用最大内存(单位:字节)
LONGLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
*/
typedef struct _OSVERSIONINFOEXA1 {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
CHAR szCSDVersion[];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEXA1, *POSVERSIONINFOEXA1, *LPOSVERSIONINFOEXA1; /*
屏幕截图
lpData:存放截图数据指针
hWnd :目标窗口,默认为桌面
成功返回截图数据大小,失败返回0.
*/
DWORD PrtScr(PCHAR *lpData, HWND hWnd = ); /*
是否有摄像头
有摄像头返回TRUE,否则返回FALSE
*/
BOOL HaveCameras(void); /*
获取CPU名称
成功返回CPU名称,失败返回NULL(VS2013不支持Debug模式下获取)
*/
LPSTR GetCPUName(void); /*
获取CPU制造商
成功返回CPU制造商,失败返回NULL(VS2013不支持Debug模式下获取)
*/
LPSTR GetCPUManufacturer(void); /*
获取声卡名字
成功返回声卡名字,失败返回NULL
*/
LPSTR GetSoundCarName(void); /*
获取磁盘容量信息
diskPath:盘符
used:已用空间
freed:剩余空间
total:总空间
成功返回TRUE,失败返回FALSE
*/
BOOL GetDiskSpaceInfo(LPSTR diskPath, float *used, float *freed, float *total); /*
获取运行内存总额
返回运存总额
*/
FLOAT GetSysRam(void); /*
获取运存已用比例
返回运存已用比例
*/
DWORD GetRamProportion(void); /*
获取系统启动时间
返回格式化文本字符串
*/
LPSTR GetSysStartTime(void); /*
获取系统信息
dwMajor:高版本位
dwMinjor:低版本位
bDesc:是否获取系统描述
bBit:是否获取位数
bSPVer:是否获取系统补丁包版本
bBuildVer:是否获取内部版本
成功返回系统信息字符串,失败返回NULL
*/
LPSTR GetSysInfo(DWORD *dwMajor = NULL, DWORD *dwMinjor = NULL, BOOL bDesc = FALSE, BOOL bBit = FALSE, BOOL bSPVer = FALSE, BOOL bBuildVer = FALSE);
HardwareInfo.cpp
#include "HardwareInfo.h" int main(void)
{ LPSTR lpCPUName = GetCPUName();
LPSTR lpCPUManu = GetCPUManufacturer();
LPSTR lpSoundCarName = GetSoundCarName();
printf("处理器: %s\n\n", lpCPUName);
printf("CPU制造商: %s\n\n", lpCPUManu);
printf("声卡: %s\n\n", lpSoundCarName);
float used, usable, total;
GetDiskSpaceInfo("D:", &used, &usable, &total);
printf("D盘 已用: %.1fG, 可用:%.1fG, 总大小:%.1fG\n\n", used, usable, total);
printf("运行内存: %.1fG, 已用%d%%\n\n", GetSysRam(), GetRamProportion());
LPSTR lpStartTime = GetSysStartTime();
printf("已开机: %s\n\n", GetSysStartTime());
LPSTR lpSysVer = GetSysInfo(, , , , );
printf("系统版本: %s\n\n", lpSysVer);
free(lpCPUName);
free(lpCPUManu);
free(lpSoundCarName);
free(lpStartTime);
free(lpSysVer); Sleep();
DWORD dwLen = ;
char *lpData = NULL; dwLen = PrtScr(&lpData);
FILE *wj = NULL;
fopen_s(&wj, "c:\\1.bmp", "wb");
fwrite(lpData, dwLen, , wj);
fclose(wj);
free(lpData);
system("c:\\1.bmp");
system("pause");
return ;
} DWORD PrtScr(PCHAR *lpData, HWND hWnd)
{
HDC hdcScreen, hdcMem;
RECT rc = { }, desRc = { };
HBITMAP hbmScreen = NULL;
BITMAP bmpScreen = { };
BITMAPINFOHEADER bitInfo = { };
BITMAPFILEHEADER bitHead = { };
DWORD dwBmpSize, dwSizeofDIB;
char *lpbitmap = NULL;
int width, height; if (!hWnd)
hWnd = GetDesktopWindow();
GetWindowRect(hWnd, &rc);
GetWindowRect(GetDesktopWindow(), &desRc); hdcScreen = GetDC(NULL);
hdcMem = CreateCompatibleDC(hdcScreen);
if (!hdcMem)
return ;
hbmScreen = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
if (!hbmScreen)
return ;
SelectObject(hdcMem, hbmScreen);
width = (rc.right > desRc.right) ? (desRc.right - rc.left) : (rc.right - rc.left);
height = (rc.bottom > desRc.bottom) ? (desRc.bottom - rc.top) : (rc.bottom - rc.top);
if (!BitBlt(hdcMem, , , width, height, hdcScreen, rc.left, rc.top, SRCCOPY))
return ;
GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen); bitInfo.biSize = sizeof(BITMAPINFOHEADER);
bitInfo.biWidth = width;
bitInfo.biHeight = height;
bitInfo.biPlanes = ;
bitInfo.biBitCount = ;
bitInfo.biCompression = BI_RGB; dwBmpSize = ((bmpScreen.bmWidth * bitInfo.biBitCount + ) / ) * * bmpScreen.bmHeight;
lpbitmap = (char *)malloc(dwBmpSize);
if (!lpbitmap)
return ;
GetDIBits(hdcScreen, hbmScreen, , (UINT)bmpScreen.bmHeight, lpbitmap, (BITMAPINFO *)&bitInfo, DIB_RGB_COLORS); dwSizeofDIB = dwBmpSize + sizeof(bitHead)+sizeof(bitInfo);
bitHead.bfOffBits = (DWORD)sizeof(bitHead)+(DWORD)sizeof(bitInfo);
bitHead.bfSize = dwSizeofDIB;
// 必须是字符BM或者十六进制代替0x4D42="BM"
bitHead.bfType = MAKEWORD('B', 'M'); *lpData = (char *)malloc(dwSizeofDIB);
if (!*lpData)
return ;
memmove(*lpData, &bitHead, sizeof(bitHead));
memmove(*lpData + sizeof(bitHead), &bitInfo, sizeof(bitInfo));
memmove(*lpData + sizeof(bitHead)+sizeof(bitInfo), lpbitmap, dwBmpSize);
free(lpbitmap);
DeleteObject(hbmScreen);
DeleteObject(hdcMem);
ReleaseDC(NULL, hdcScreen);
return dwSizeofDIB;
} BOOL HaveCameras(void)
{
char ver[] = { }, name[] = { };
UINT num = ; do
{
memset(name, , );
if (capGetDriverDescription(num, name, , ver, ))
{
num++;
}
} while (lstrlen(name));
return (num ? TRUE : FALSE);
} LPSTR GetCPUName(void)
{
LPSTR lpName = (LPSTR)malloc();
memset(lpName, , ); __asm{
PUSHAD
MOV EAX, 0x80000002
CPUID
MOV ESI, [EBP - 0x4]
MOV SS : [ESI], EAX
MOV SS : [ESI + 0x4], EBX
MOV SS : [ESI + 0x8], ECX
MOV SS : [ESI + 0xC], EDX
MOV EAX, 0x80000003
CPUID
MOV SS : [ESI + 0x10], EAX
MOV SS : [ESI + 0x14], EBX
MOV SS : [ESI + 0x18], ECX
MOV SS : [ESI + 0x1C], EDX
MOV EAX, 0x80000004
CPUID
MOV SS : [ESI + 0x20], EAX
MOV SS : [ESI + 0x24], EBX
MOV SS : [ESI + 0x28], ECX
MOV SS : [ESI + 0x2C], EDX
POPAD
}
return lpName;
} LPSTR GetCPUManufacturer(void)
{
LPSTR lpStr = (LPSTR)malloc();
memset(lpStr, , ); __asm{
PUSHAD
XOR EAX, EAX
CPUID
MOV EAX, DWORD PTR SS : [EBP - 0x4]
MOV DWORD PTR SS : [EAX], EBX
MOV DWORD PTR SS : [EAX + 0x4], EDX
MOV DWORD PTR SS : [EAX + 0x8], ECX
POPAD
} if (!lstrcmp("GenuineIntel", lpStr))
memmove(lpStr, "Intel Corporation.", );
else if (!lstrcmp("AuthenticAMD", lpStr))
memmove(lpStr, "Advanced Micro Devices.", );
else if (!lstrcmp("AMD ISBETTER", lpStr))
memmove(lpStr, "Advanced Micro Devices.", );
else if (!lstrcmp("Geode By NSC", lpStr))
memmove(lpStr, "National Semiconductor.", );
else if (!lstrcmp("CyrixInstead", lpStr))
memmove(lpStr, "Cyrix Corp., VIA Inc.", );
else if (!lstrcmp("NexGenDriven", lpStr))
memmove(lpStr, "NexGen Inc., Advanced Micro Devices.", );
else if (!lstrcmp("CentaurHauls", lpStr))
memmove(lpStr, "IDT\\Centaur, Via Inc.", );
else if (!lstrcmp("UMC UMC UMC ", lpStr))
memmove(lpStr, "United Microelectronics Corp.", );
else if (!lstrcmp("RiseRiseRise", lpStr))
memmove(lpStr, "Rise.", );
else if (!lstrcmp("GenuineTMx86", lpStr))
memmove(lpStr, "Transmeta.", );
else if (!lstrcmp("TransmetaCPU", lpStr))
memmove(lpStr, "Transmeta.", );
else
memmove(lpStr, "Unknown Manufacturer.", ); return lpStr;
} LPSTR GetSoundCarName(void)
{
WAVEOUTCAPS wav = { };
LPSTR lpName = (LPSTR)malloc(); waveOutGetDevCaps(, &wav, sizeof(wav)); // 有点电脑获取的数据不完整,缺失 " Audio)",为了美观获取不到的手动加入
if (wav.szPname[lstrlen(wav.szPname)-] != ')')
sprintf_s(lpName, , "%s Audio)", wav.szPname);
else
sprintf_s(lpName, , "%s", wav.szPname);
return lpName;
} BOOL GetDiskSpaceInfo(LPSTR diskPath, float *used, float *freed, float *total)
{
ULARGE_INTEGER a1, b1, c1;
LONGLONG a, b, c;
float v1, v2, v3;
if (!GetDiskFreeSpaceEx(diskPath, &a1, &b1, &c1))
return FALSE; a = (LONGLONG)a1.QuadPart;
b = (LONGLONG)b1.QuadPart;
c = (LONGLONG)c1.QuadPart;
c = b - a; v1 = (float)(a / ( * * 1024.0));
v2 = (float)(b / ( * * 1024.0));
v3 = (float)(c / ( * * 1024.0)); memmove(used, &v3, sizeof(float));
memmove(freed, &v1, sizeof(float));
memmove(total, &v2, sizeof(float)); return TRUE;
} FLOAT GetSysRam(void)
{
typedef BOOL(WINAPI *func)(LPMEMORYSTATUSEX);
MEMORYSTATUSEX stMem = { }; func GlobalMemoryStatusEx = (func)GetProcAddress(LoadLibrary("Kernel32.dll"), "GlobalMemoryStatusEx");
stMem.dwLength = sizeof(stMem);
GlobalMemoryStatusEx(&stMem);
return (FLOAT)(stMem.ullTotalPhys / ( * * 1024.0));
} DWORD GetRamProportion(void)
{
typedef BOOL(WINAPI *func)(LPMEMORYSTATUSEX);
MEMORYSTATUSEX stMem = { }; func GlobalMemoryStatusEx = (func)GetProcAddress(LoadLibrary("Kernel32.dll"), "GlobalMemoryStatusEx");
stMem.dwLength = sizeof(stMem);
GlobalMemoryStatusEx(&stMem);
return stMem.dwMemoryLoad;
} LPSTR GetSysStartTime(void)
{
LPSTR lpStr = (LPSTR)malloc(sizeof(char)* );
DWORD dwStart = GetTickCount();
DWORD day, hou, min, sec; day = dwStart / ( * * * );
hou = dwStart / ( * * ) - day * ;
min = dwStart / ( * ) - day * * - hou * ;
sec = dwStart / () - day * * * - hou * * - min * ; sprintf_s(lpStr, , "%d天%d小时%d分钟%d秒", day, hou, min, sec);
return lpStr;
} LPSTR GetSysInfo(DWORD *dwMajor, DWORD *dwMinjor, BOOL bDesc, BOOL bBit, BOOL bSPVer, BOOL bBuildVer)
{
OSVERSIONINFOEXA1 osvi = { };
SYSTEM_INFO si = { };
BOOL bWow64 = FALSE;
DWORD dwType = , dwBuild = ;
char strSys[] = { }, strVer[] = { }; osvi.dwOSVersionInfoSize = sizeof(osvi);
typedef BOOL(WINAPI *fun)(LPOSVERSIONINFOEXA1);
fun GetVersionEx1 = (fun)GetProcAddress(LoadLibrary("Kernel32.dll"), "GetVersionExA");
if (GetVersionEx1(&osvi))
{
dwBuild = osvi.dwBuildNumber;
GetSystemInfo(&si); typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS IsWow64Process1 = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process");
IsWow64Process1((void *)-, &bWow64); typedef void (WINAPI *func)(DWORD *, DWORD *, DWORD *);
func RtlGetNtVersionNumbers = (func)GetProcAddress(LoadLibrary("ntdll.dll"), "RtlGetNtVersionNumbers");
RtlGetNtVersionNumbers(&osvi.dwMajorVersion, &osvi.dwMinorVersion, &osvi.dwBuildNumber); if (dwMajor)
*dwMajor = osvi.dwMajorVersion;
if (dwMinjor)
*dwMinjor = osvi.dwMinorVersion; if (osvi.dwMajorVersion == )
{
if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 10" : "Windows Server 2016"), );
}
}
else if (osvi.dwMajorVersion == )
{
if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows Vista" : "Windows Server 2008"), );
}
else if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 7" : "Windows Server 2008 R2"), );
}
else if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8" : "Windows Server 2012"), );
}
else if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8.1" : "Windows Server 2012 R2"), );
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
lstrcpyn(strSys, "Windows 2000", );
if (osvi.wProductType == )
{
lstrcpyn(strVer, "Professional", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strVer, "Datacenter Server", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strVer, "Advanced Server", );
}
else
{
lstrcpyn(strVer, "Server", );
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
lstrcpyn(strSys, "Windows XP", );
if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strVer, "Home Edition", ); // 家庭版
}
else
{
lstrcpyn(strVer, "Professional", ); // 专业版
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
if (GetSystemMetrics() != )
{
lstrcpyn(strSys, "Windows Server 2003 R2, ", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strSys, "Windows Storage Server 2003", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strSys, "Windows Home Server", );
}
else if (osvi.wProductType == && si.wProcessorArchitecture == )
{
lstrcpyn(strSys, "Windows XP Professional x64 Edition", ); // XP专业版64位系统
}
else
{
lstrcpyn(strSys, "Windows Server 2003, ", );
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
lstrcpyn(strSys, "Windows 98", );
}
else if (osvi.dwMajorVersion >= )
{
typedef BOOL(WINAPI *pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD);
pGetProductInfo RtlGetProductInfo = (pGetProductInfo)GetProcAddress(LoadLibrary("Kernel32.dll"), "RtlGetProductInfo");
RtlGetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, , , &dwType); switch (dwType)
{
case : // 旗舰版
lstrcpyn(strVer, "Ultimate Edition", );
break;
case : // 家庭普通版
lstrcpyn(strVer, "Home Basic Edition", );
break;
case : // 家庭高级版
lstrcpyn(strVer, "Home Premiu Edition", );
break;
case : // 企业版
lstrcpyn(strVer, "Enterprise Edition", );
break;
case : // 商业版
lstrcpyn(strVer, "Business Edition", );
break;
case : // 服务器标准版
lstrcpyn(strVer, "Standard", );
break;
case : // 服务器企业版
lstrcpyn(strVer, "Datacenter Edition", );
break;
case : // 小型服务器
lstrcpyn(strVer, "Small Business Server", );
break;
case : // 服务器企业版(完整的安装)
lstrcpyn(strVer, "Enterprise Edition", );
break;
case : // 入门版
lstrcpyn(strVer, "Starter Edition", );
break;
case : // 服务器数据中心版(核心安装)
lstrcpyn(strVer, "Datacenter Edition (core installation)", );
break;
case : // 服务器标准版(核心安装)
lstrcpyn(strVer, "Standard Edition (core installation)", );
break;
case : // 服务器企业版(核心安装)
lstrcpyn(strVer, "Enterprise Edition (core installation)", );
break;
case : // 一个企业级的平台
lstrcpyn(strVer, "Enterprise Edition for Itanium-based Systems", );
break;
case : // 商用公司版
lstrcpyn(strVer, "Business N", );
break;
case : // Web服务器(完整安装)
lstrcpyn(strVer, "Web Server (full installation)", );
break;
case : // 服务器群集版
lstrcpyn(strVer, "HPC Edition", );
break;
case : // 2008 R2 储存服务器版
lstrcpyn(strVer, "Windows Storage Server 2008 R2 Essentials", );
break;
case : // 服务器快速储存版
lstrcpyn(strVer, "Storage Server Express", );
break;
case : // 服务器标准储存版
lstrcpyn(strVer, "Storage Server Standard", );
break;
case : // 服务器储存组
lstrcpyn(strVer, "Storage Server Workgroup", );
break;
case : // 服务器储存企业版
lstrcpyn(strVer, "Storage Server Enterprise", );
break;
case : // 小型商业服务器
lstrcpyn(strVer, "Small Business Server Premium Edition", );
break;
case : // 专业版
lstrcpyn(strVer, "Professional", );
break;
}
}
}
if (lstrlen(strSys) < )
{
sprintf_s(strSys, , "获取失败,请检查版本:%d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
return NULL;
}
else
{
LPSTR lpStr = (LPSTR)malloc(sizeof(char)* ); lstrcpyn(lpStr, strSys, lstrlenA(strSys) + );
if (bDesc)
{
lstrcatA(lpStr, " ");
lstrcatA(lpStr, strVer);
}
if (bBit)
lstrcatA(lpStr, (bWow64 ? " x64 " : " x86 "));
if (bSPVer)
lstrcatA(lpStr, (LPCSTR)&osvi.szCSDVersion);
if (bBuildVer)
sprintf_s(lpStr,, "%s,Build:%d", lpStr, dwBuild);
return lpStr;
}
return NULL;
}
效果图
C/C++获取CPU等硬件信息&&屏幕截图的更多相关文章
- Android获取cpu和内存信息、网址的代码
android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...
- C#获取当前主机硬件信息
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#获取CPU等硬件ID(转载)
System.Management命名空间提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统.设备和应用程序设置检测点有关的.应用程序和服 ...
- 获取CPU使用情况信息(转)
获取了内存使用情况,也可以使用PHP的 getrusage()获取CPU使用情况,该方法在windows下不可用. print_r(getrusage()); /* 输出 Array ( [ru ...
- 【C#】 获取计算机的硬件信息
添加引用:System.Management /// <summary> /// 获取本机的MAC地址 /// </summary> /// <returns>&l ...
- C# 获取计算机的硬件信息
/// <summary> /// 获得CPU编号 /// </summary> /// <returns></returns> public stri ...
- PowerShell 获取系统的硬件信息
1.获取系统的BIOS的信息: Get-WMIObject -Class Win32_BIOS 2.获取内存信息: Get-WMIObject -Class Win32_PhysicalMemory ...
- 使用python获取CPU和内存信息的思路与实现(linux系统)
linux里一切皆为文件,在linux/unix的根文件夹下,有个/proc文件夹,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc&qu ...
- Android自动化测试-自动获取cpu和内存信息
CpuInfo.java package com.dtest; import java.io.BufferedReader; import java.io.FileWriter; import jav ...
随机推荐
- 前端之CSS——盒子模型和浮动
一.CSS盒子模型 HTML文档中的每个元素都被描绘成矩形盒子,这些矩形盒子通过一个模型来描述其占用空间,这个模型称为盒子模型. 盒子模型通过四个边界来描述:margin(外边距),border(边框 ...
- CSS设计模式之三权分立模式篇 ( 转)
转自 海玉的博客 市面上我们常常会看到各种各样的设计模式书籍,Java设计模式.C#设计模式.Ruby设计模式等等.在众多的语言设计模式中我唯独找不到关于CSS设计模式的资料,即使在网上找到类似内容, ...
- bind 事件名称 命名空间
1.通过在事件名称后面添加以点号分隔的后缀来为事件名称指派命名空间 $("#button").bind("click.editMode",function(){ ...
- 【代码笔记】Java连连看项目的实现(1)——JTable 、TableModel的使用
javax.swing.table.TableModel和javax.swing.JTable JTable .TableModel是Java里面画表格的包. TableModel:为Table提供显 ...
- javascript实现数据结构与算法系列
1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...
- spring---FactoryBean与BeanFactory的区别
1.BeanFactory BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,例如DefaultListableBeanFactory, ...
- 关于String s = new String("xyz");创建了几个字符串对象?的问题
引用自这位朋友:http://blog.sina.com.cn/s/blog_6a6b14100100zn6r.html 首先让我们了解几个概念: 栈:由JVM分配区域,用于保存线程执行的动作和数据引 ...
- Mantis查看问题列表的列名修改_"P","#"两列
在使用mantis的时候,点击菜单上的“查看问题”进去,就会罗列出当前的bug列表,可是列表的标题上存在着“P”和“#”的显示,个人觉得这两列在这里完全没有意义,或者说现有的显示使人觉得疑惑,究竟代表 ...
- 虚拟机配置静态 IP 以后无法连接的解决办法
问题描述 将虚拟机内部 IP 地址从动态获取改成静态 IP 以后,远程连接失败. 问题分析 Azure 虚拟机的内部 IP 默认为动态分配, 由 DHCP 服务自动分配, 在虚拟机的生命周期内, 该 ...
- YouTube 1080P高清视频下载方法
在国内在线视频网站还停留在1080P蓝光的时候,YouTube早已经支持4K和8K分辨率的极清视频.虽然4K和8K的清晰度比1080P高了许多档次,但是大部分人的电脑播放4K视频还是很卡的,所以目前来 ...