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