WINCE7.0 获取CPU,MEMORY等硬件和系统信息

  • Post author:
  • Post category:其他

PC环境:WIN7(32)

开发板:TCC8925+WINCE7.0

       在开发板上做应用程序时,需要获取CPU,内存,系统等信息,首先想到GetSystemInfo函数,但是信息明显不够具体。于是打开开发板控制面板,再打开System面板,有很详细的设备系统信息,正好可以参考一下。

但是,对WINCE源码目录不够清楚,不知道这些代码在哪里,怎么办?

1.找到目标应用程序

打开VS中的远程工具,进程查看器,

找到了,就是这个CTLPNL.EXE了。

2.查找应用程序源码

老办法,直接在WINCE安装目录查找CTLPNL,很傻很有用。很快就找到了源码目录。

为了方便,直接用史上最牛逼的代码查看工具SOURCE INSIGHT将整个APP目录添加进去,以后还可以找别的代码用。

3.查找目标文件

直接无脑搜索,SOURCE INSIGHT同步完成后,直接在项目中搜索应用程序中,也就是图片上的关键字,如Processor Type

第一个结果就可以明显的看出,正是我们要找的东西,和程序面板上完全吻合。

到了这里,估计我们需要的代码,就在Cplmain.cpp中了。

打开这个结果,查看具体信息。

这个已经够明显了,连对话框,包含的控件,显示的文字,全部都有,例如显示CPU信息的CSTATIC控件为IDC_STATIC_PROCESSOR。

4.查找关键代码

直接用IDC_STATIC_PROCESSOR来查找,肯定能找到所有获取并设置CPU信息的代码,也就是我们最终的目标代码。

很明显,前面我猜测的目标代码在Cplmain.cpp中,完全错误,伤心。

打开关键文件System.cpp就可以看到关键代码了,搞定。

OSVERSIONINFO osvi;
		    TCHAR szTemp[190];

			osvi.dwOSVersionInfoSize = sizeof(osvi);
			GetVersionEx(&osvi);

			if (osvi.dwBuildNumber > 0) {
	 			StringCbPrintf(szTemp, sizeof(szTemp), CELOADSZ(IDS_SYSTEM_VER_WITH_BUILD), 
							osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber);
			} else {
	 			StringCbPrintf(szTemp, sizeof(szTemp), CELOADSZ(IDS_SYSTEM_VER_WITHOUT_BUILD), 
								osvi.dwMajorVersion, osvi.dwMinorVersion);
			}
			SetDlgItemText(hDlg, IDC_STATIC_VER_SYS, szTemp);
			
			// set Processor type
			SYSTEM_INFO sys_info;
			ZEROMEM(&sys_info);
			GetSystemInfo(&sys_info);

			PROCESSOR_INFO pro; 
			DWORD count;
			KernelIoControl(IOCTL_PROCESSOR_INFORMATION, NULL, 0, &pro, sizeof(PROCESSOR_INFO), &count);
			lstrcpy(szTemp, pro.szVendor);
			if(pro.szVendor[0] != NULL && (pro.szProcessCore[0] != NULL || pro.szProcessorName[0] != NULL)) {
				lstrcat(szTemp, TEXT(", "));
			}
			lstrcat(szTemp, pro.szProcessCore);
			if(pro.szProcessCore[0] != NULL && pro.szProcessorName[0] != NULL){
				lstrcat(szTemp, TEXT("-"));
			}
			lstrcat(szTemp, pro.szProcessorName);

			SetDlgItemText(hDlg, IDC_STATIC_PROCESSOR, szTemp);
			PostMessage(GetDlgItem(hDlg, IDC_STATIC_PROCESSOR), EM_SETSEL, 0, 0);

			// set RAM size
			DWORD PageSize, TotPages, StoreUsed, RamUsed, StorePages;
			GetMemoryInfo(PageSize, TotPages, StoreUsed, RamUsed, StorePages);
			StringCbPrintf(szTemp, sizeof(szTemp), CELOADSZ(IDS_SYSTEM_RAMSIZE), TotPages*PageSize);
			SetDlgItemText(hDlg, IDC_STATIC_RAM, szTemp);

			// set PNP card info
			ShowPNPInfo(hDlg);

			// set User & Company do this on WM_PAINT as it can change
			OWNER_PROFILE OwnerProfile;
			GetOwnerInfo(&OwnerProfile, NULL);

			// Truncate the strings and append ellipses is they are too long
			SetTextWithEllipsis(DI(IDC_STATIC_USER), OwnerProfile.szName);
			HWND hUserCompany = DI(IDC_STATIC_USER_COMPANY);
			if (hUserCompany)
				SetTextWithEllipsis(hUserCompany, OwnerProfile.szCompany);

			// Create the tooltip window for long strings
			g_hToolTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL,
			                            WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
			                            CW_USEDEFAULT, CW_USEDEFAULT,
			                            CW_USEDEFAULT, CW_USEDEFAULT,
			                            hDlg, NULL, g_hInst, NULL);

			if (g_hToolTip)
			{
				TOOLINFO ti = {0};
				ti.cbSize = sizeof(ti);
				ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS | TTF_TRANSPARENT;
				ti.hwnd = hDlg;
				ti.lpszText = LPSTR_TEXTCALLBACK;
				ti.uId = (UINT) GetDlgItem(hDlg, IDC_STATIC_PROCESSOR);
				SendMessage(g_hToolTip, TTM_ADDTOOL, NULL, (LPARAM) &ti);

				g_wndProcTT = (WNDPROC) SetWindowLong(g_hToolTip, GWL_WNDPROC,
				                                      (LONG) SYS_ToolTipProc);
				ASSERT(g_wndProcTT);
				SetWindowLong(g_hToolTip, GWL_USERDATA, (LONG) hDlg);
			}

            AygInitDialog( hDlg, SHIDIF_SIPDOWN );

			SetFocus(GetDlgItem(hDlg, IDC_EXPANSION_CMB));

5.编写应用程序

5.1有了参考代码,照抄就容易多了,突然发现上班也是件开心的事情了。

于是包含头文件#include <Pkfuncs.h>,复制粘贴编译。

居然出错了,找不到头文件#include <Pkfuncs.h>,看来SDK中没有加入这个头文件。于是很暴力的把整个D:\WINCE700\public\COMMON\oak\inc里的文件
到D:\Program Files\Windows CE Tools\wce600\magellan\Include\Armv4i目录下,头文件找到了,结果却出现了一堆其他文件找不到的错误。回想一下,问题就很明显了,我装的是WINCE7.0的平台,用的SDK不是自己导出来的,是官方给的基于WINCE6.0的。

5.2更换SDK

     打开系统工程,之前已经编译过WINCE7.0的系统了,所以直接添加个SDK,编译,安装,很快搞定。

    测试SDK,用新的WINCE7.0SDK新建一个智能设备工程,直接编译,居然报错’lstrlenW’ : is not a member of ‘ATL,查了一个,是WINCE7和6的ATL等库的差别导致的,于是安装补丁VisualStudioDeviceWindowsEmbeddedCompact7.msi,记得用管理员权限装哦。下载地址:http://support.microsoft.com/kb/2468183。重启机器,错误还在,再谷哥,发现还有个地方要设置,在应用程序中,手动加入新的ATL目录文件。工程属性->c/c++->general->additional include directories增加D:\Program Files\Microsoft Visual Studio 9.0\VC\ce7\include和D:\Program Files\Microsoft Visual Studio 9.0\VC\ce7\atlmfc\include。这两个目录都是安装ATL补丁后产生的。错误果然没有了,除了一大堆警告,直接无视。

6.程序运行

      到这里,问题都解决了,自己程序中,也能正常获取信息了,以后有类似的需求,还可以用同样的方法,从系统自带的应用中找解决办法。


版权声明:本文为abc19abc91原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。