本文主要是介绍Microsoft Windows CE 的内存使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Microsoft Windows CE 的内存使用
John Murray
1997.9
1997.9
介绍
Microsoft®Windows® CE 是组件化的操作系统,它可根据目标设备或平台的不同特点进行定制。原始设备制造商(OEM)或嵌入系统开发者可以选择所需的系统模块和组件,将其提供给用于目标平台的操作系统。所选择的模块和组件确定了它的内存需求情况。
一个模块表示一个完整的功能区域,在系统软件中可将其表示出也可以不将其表示出。如果不需要该功能,那么可以将整个模块忽略。例如,用一个名为“serial”的简单的模块提供出所有串行端口的功能,可以将其包括在系统中也可以不包括。
一些大的模块可以进一步分成几个组件。这使得OEM厂商可以通过仅仅包含OEM设备的需要的组件,定制出这些模块更小的版本。例如,文件系统模块 包括RAM文件系统、ROM文件系统、注册表和数据库几个组件。OEM可以(按照一定的限制)组合这些文件系统的组件使之满足目标系统的需要。
为了帮助OEM和嵌入系统开发者做决定,这对于了解给定模块或组件的内存耗费情况是十分有用的。本文将讲述Windows CE 2.0操作系统是如何使用内存的,并列出对于所选的Windows CE系统配置中主要系统模块和组件的内存需求情况。同时也将讲述如何使用Windows CE工具查看其他配置情况下的内存需求情况。
对于Windows CE 2.0版,微软已经创建并测试了这些模块和组件的几种基本配置。这些配置代表了不同的几组系统性能,从仅带有最小用户输入并且没有显示能力的基本系统,到用于手持PC(H/PC)上的具有Microsoft Windows全部外观和感觉的完整系统。
每个配置都是建立在前一个配置的基础上的。下列表格列出了在本文中被讨论到的被测试过的配置。
一个模块表示一个完整的功能区域,在系统软件中可将其表示出也可以不将其表示出。如果不需要该功能,那么可以将整个模块忽略。例如,用一个名为“serial”的简单的模块提供出所有串行端口的功能,可以将其包括在系统中也可以不包括。
一些大的模块可以进一步分成几个组件。这使得OEM厂商可以通过仅仅包含OEM设备的需要的组件,定制出这些模块更小的版本。例如,文件系统模块 包括RAM文件系统、ROM文件系统、注册表和数据库几个组件。OEM可以(按照一定的限制)组合这些文件系统的组件使之满足目标系统的需要。
为了帮助OEM和嵌入系统开发者做决定,这对于了解给定模块或组件的内存耗费情况是十分有用的。本文将讲述Windows CE 2.0操作系统是如何使用内存的,并列出对于所选的Windows CE系统配置中主要系统模块和组件的内存需求情况。同时也将讲述如何使用Windows CE工具查看其他配置情况下的内存需求情况。
对于Windows CE 2.0版,微软已经创建并测试了这些模块和组件的几种基本配置。这些配置代表了不同的几组系统性能,从仅带有最小用户输入并且没有显示能力的基本系统,到用于手持PC(H/PC)上的具有Microsoft Windows全部外观和感觉的完整系统。
每个配置都是建立在前一个配置的基础上的。下列表格列出了在本文中被讨论到的被测试过的配置。
配置 | 描述 |
最小输入系统(MinInput) | 核心、基本文件系统、注册表和基本用户支持。基本用户支持包括:对消息队列、触摸板、键盘输入设备、声音、电源、发光二极管(LED)提示和机器空转的支持。 |
最小图形显示接口(MinGDI) | MinInput 并加上最小的GDI(基本绘图元、设备上下文)。 |
最小通信(MinComm) | MinInput 并加上通信堆栈(传输控制协议/Internet协议[TCP/IP]、点对点协议、电话应用程序编程接口[TAPI],串行端口、网络设备/驱动接口描述[NDIS]、红外线数据联接[IRDA])。 |
Windows 用户接口(UI)配置(HPC2Apps) | MinComm 并加上所有和Window相关的API函数(例如CreateWindow),这就是用于H/PC上的版本。 |
系统内存的使用
典型的Windows CE设备包括ROM和RAM内存。当设备被关闭时,设备也可以通过使用充电的后备电池而继续维持RAM中的内容。
系统内存可以按照下列表格中描述的情况分类。
系统内存可以按照下列表格中描述的情况分类。
内存 | 描述 |
ROM | 包含Windows CE的执行体和其他系统文件。这些文件的文本(代码)和只读数据部分是未被解压到执行位置(XIP)的部分。 |
RAM—— 存储内存 | 包括文件系统(包括注册表和Windows CE数据库)。包括可读/写数据区。 |
RAM—— 程序内存 | 工作RAM. |
ROM 包含未解压到执行位置(XIP)的文件,包括系统执行体、动态链接库(DLLs)和被捆绑的应用程序如 Microsoft Pocket Word。这些文件都起始于页面的边界。ROM还包括这些应用程序所使用的各种文件,如字体、声音和位图。这些文件中的大多数被压缩了(除了一些字体例外)。代码和执行体的只读部分以及DLLs被解压到启用的执行位置。由于可读/写部分在指定的RAM,它们将在那里被压缩。
为了节省空间,这些小文件和被压缩的可读/写区中的许多被放置在内存的缝隙中。这些缝隙是放置在ROM中的代码或只读内存区的最后一页省下的空间。
压缩ROM中的执行体或DLL也是可能的。当这类执行体运行时,请求换页程序将所虚页面解压并将它们装入RAM。
RAM被分成两个部分:存储内存和程序内存。存储内存包括注册表、文件系统和数据库。文件系统包括由用户安装或创建的应用程序和数据文件。在文件系统中的所有文件都是被压缩的。程序内存是由系统使用的并用于运行应用程序。用户在任何时刻不需重新启动,就可以重新调整对存储内存和程序内存的划分。
用户安装的应用程序压缩驻留在文件系统中。代码和数据需要被解压到程序内存来执行。请求换页被支持——当一个用户安装的应用程序被启动时,仅有一小部分应用程序需要被解压到程序内存。
除了数据部分,每个执行体通常都耗费一定量的程序内存用于它的堆栈数据。堆栈通常可以动态增加或减少。
为了节省空间,这些小文件和被压缩的可读/写区中的许多被放置在内存的缝隙中。这些缝隙是放置在ROM中的代码或只读内存区的最后一页省下的空间。
压缩ROM中的执行体或DLL也是可能的。当这类执行体运行时,请求换页程序将所虚页面解压并将它们装入RAM。
RAM被分成两个部分:存储内存和程序内存。存储内存包括注册表、文件系统和数据库。文件系统包括由用户安装或创建的应用程序和数据文件。在文件系统中的所有文件都是被压缩的。程序内存是由系统使用的并用于运行应用程序。用户在任何时刻不需重新启动,就可以重新调整对存储内存和程序内存的划分。
用户安装的应用程序压缩驻留在文件系统中。代码和数据需要被解压到程序内存来执行。请求换页被支持——当一个用户安装的应用程序被启动时,仅有一小部分应用程序需要被解压到程序内存。
除了数据部分,每个执行体通常都耗费一定量的程序内存用于它的堆栈数据。堆栈通常可以动态增加或减少。
Windows CE Version 2.0 的内存使用
下列表格显示了带有SH3微处理器的HitachiD9000开发平台上的内存使用情况。RAM和栈的数值是在启动后Memtool实用程序检查系统状态时取得的。这些数据是按照下列方式计算出的:
- ROM (代码和只读数据)。列于Romimage实用程序输出模块的所有部分的总合。
- RAM。通过Memtool实用程序和Ppsh实用程序内存信息(mi)命令在页面总计处列出的可读写数据。
- Stack。通过Memtool实用程序和Ppsh实用程序内存信息(mi)命令在页面总计处列出对于栈的数值。
尽管Memtool和Ppsh实用程序显示出每个进程在RAM中只读数据,但是这个内存常常仅代表核心分配出的共享内存。 这个共享内存物理上仅消耗核心所使用的一个页面。因此,带有尺寸为1的只读页面的模块并没有计算到模块RAM的需求。额外部分包括核心和只读页面尺寸大于 1的模块。由于这些额外部分,RAM的需求可以算成是只读和可读/写部分的总和。
MinInput
MinInput 系统代表一个具有最小输入的系统。它包括核心、基本文件系统、注册表和基本用户的输入支持。基本用户的输入支持包括:对消息队列的支持、触摸面板、键盘输入设备、声音、电源、提示LED和空转控制。
下列表格是以千字节为单位(K)显示出在系统刚刚启动后,MinInput的详细配置值。
下列表格是以千字节为单位(K)显示出在系统刚刚启动后,MinInput的详细配置值。
模块 | ROM (K) | RAM (K) | Stack (K) |
Nk.exe | 119 | 5 | 4 |
Filesys.exe | 57 | 6 | 1 |
Gwes.exe | 60 | 9 | 3 |
Coredll.dll | 94 |
这个配置的ROM中还包括了下列DLLs。
模块 | ROM (K) |
Toolhelp.dll | 2 |
Keybddr.dll | 8 |
Touch.dll | 12 |
MinGDI
MinGDI 系统代表一个带有GDI的最小系统。MinGDI系统包括了MinInput系统中的所有组件,并添加了基本绘图元和设备上下文。
下列表格显示了在系统刚刚启动后,MinGDI的详细系统配置值。
下列表格显示了在系统刚刚启动后,MinGDI的详细系统配置值。
模块 | ROM (K) | RAM (K) | Stack (K) |
Nk.exe | 119 | 7 | 4 |
Filesys.exe | 122 | 7 | 1 |
Gwes.exe | 282 | 697 | 4 |
Coredll.dll | 103 |
除了在MinInput配置中列出的DLLs外,该配置的ROM中还包括了下列DLLs。
模块 | ROM (K) |
Ddi.dll | 29 |
Wavedev.dll | 15 |
MinComm
MinComm 配置代表一个带有最小通信能力的系统。MinComm系统包括了MinInput系统中的所有组件,并添加了一些通信堆栈(TCP/IP、PPP、TAPI、Serial、NDIS和IRDA)。
下列表格显示了在系统刚刚启动后,MinComm的详细系统配置值。
下列表格显示了在系统刚刚启动后,MinComm的详细系统配置值。
模块 | ROM (K) | RAM (K) | Stack (K) |
nk.exe | 119 | 31 | 4 |
Filesys.exe | 86 | 9 | 1 |
gwes.exe | 45 | 12 | 1 |
Device.exe | 15 | 67 | 8 |
coredll.dll | 128 |
除了在MinInput配置中列出的DLLs外,该配置的ROM中还包括了下列DLLs。
模块 | ROM (K) |
ppp.dll | 64 |
cxport.dll | 6 |
Ircomm.dll | 7 |
Winsock.dll | 18 |
secur32.dll | 19 |
Schannel.dll | 111 |
Ntlmssp.dll | 14 |
afd.dll | 39 |
arp.dll | 19 |
ndis.dll | 42 |
ne2000.dll | 21 |
tcpstk.dll | 98 |
irdastk.dll | 55 |
tapi.dll | 17 |
Unimodem.dll | 21 |
redir.dll | 74 |
Netbios.dll | 25 |
Wininet.dll | 105 |
Pcmcia.dll | 29 |
serial.dll | 26 |
HPC2Apps
HPC2Apps 配置代表了用于Handheld PC上的完整系统。HPC2Apps的配置包括了MinComm系统中的所有组件,并添加了所有与Windows相关的API函数(如CreateWindow)。
模块 | ROM (K) | RAM (K) | Stack (K) |
nk.exe | 119 K | 46 | 4 |
filesys.exe | 122 K | 9 | 4 |
gwes.exe | 508 K | 724 | 7 |
device.exe | 15 K | 78 | 10 |
coredll.dll | 122 |
除了在MinComm配置中列出的DLLs外,该配置的ROM中还包括了下列DLLs。
模块 | ROM (K) |
fatfs.dll | 54 |
Prnport.dll | 5 |
pcl.dll | 24 |
Atadisk.dll | 9 |
Sramdisk.dll | 7 |
Waveapi.dll | 68 |
ole32.dll | 150 |
oleaut32.dll | 183 |
dhcp.dll | 13 |
Hwxusa.dll | 86 |
netui.dll | 19 |
查看ROM的使用
通过查看Microsoft Windows CE ROM Image Builder 工具——Romimage.exe的输出,可以看到文件在ROM中是如何放置的。(本文中的许多数字就是从Image Builder工具的日志文件中得到的)
文件被分成多个部分并放入ROM中。通过Windows CE开发工具可以将这些部分描述如下。
文件被分成多个部分并放入ROM中。通过Windows CE开发工具可以将这些部分描述如下。
部分 | 描述 |
.text | 代码 |
.rsrc | 资源数据 |
.data | 数据 |
.pdata | 在代码部分每个函数的调试和异常处理信息 |
.CRT | 特殊部分——C++结构 |
.KDATA | 特殊部分——仅出现在核心当中(Nk.exe) |
Romimage 是一个命令行工具。从一个典型的Romimage部分输出的头几行包括:程序的标题、页面大小和MODULES部分的起始位置等。
Windows CE ROM Image Builder v1.0 Copyright Microsoft 1995.
Copying d:/WINCE/release/odo2bpp.dll to d:/WINCE/release/ddi.dll for debugger.
Copying d:/WINCE/release/odo2bpp.pdb to d:/WINCE/release/ddi.pdb for debugger.
Setting PageSize to 1024
DumpSymbols: pTOC found at00000e50
MODULES Section
Windows CE ROM Image Builder v1.0 Copyright Microsoft 1995.
Copying d:/WINCE/release/odo2bpp.dll to d:/WINCE/release/ddi.dll for debugger.
Copying d:/WINCE/release/odo2bpp.pdb to d:/WINCE/release/ddi.pdb for debugger.
Setting PageSize to 1024
DumpSymbols: pTOC found at00000e50
MODULES Section
Module | Section | Start | Length | psize | vsize | Filler |
nk.exe | .text | 8c 600400h | 116736 | 116736 | 116268 | |
nk.exe | .pdata | 8c 61cc00h | 4096 | 4096 | 3864 | |
coredll.dll | .text | 8c 61dc00h | 119808 | 119296 | 118987 | |
coredll.dll | .rsrc | 8c 63b000h | 1024 | 1024 | 528 |
在MODULES部分的第一个条目,Nk.exe ,的大小为116268 = 0x1c62c字节。这个实际的大小被扩大到下一个1024字节的边界上,116736 = 0x1c800,并且被放置到ROM中。这便留下了一个468字节的“洞”,可以提供给其他文件使用。同样,在0x8c63b210地址处有一个496字节的“洞”,它出现在Coredll.dll .rsrc 部分的最后一个页面的末尾。
在放置完所有的.text(代码)部分后,Romimage开始将小于一页的数据部分放置到这些“洞”中。例如,在稍后的MODULES部分中,相同的Romimage日志包含了下列信息:
在放置完所有的.text(代码)部分后,Romimage开始将小于一页的数据部分放置到这些“洞”中。例如,在稍后的MODULES部分中,相同的Romimage日志包含了下列信息:
Module | Section | Start | Length | psize | vsize | Filler |
coredll.dll | .data | 8c 61ca2ch | 4 | 4 | 200 | FILLER |
coredll.dll | .pdata | 8cb32800h | 4868 | 4866 | 8064 | |
filesys.exe | .data | 8cb33b04h | 12236 | 12234 | 21376 | |
filesys.exe | .pdata | 8cb36ad0h | 2152 | 2149 | 2640 | |
gwes.exe | .data | 8cb37338h | 10796 | 10794 | 17828 | |
gwes.exe | .pdata | 8cb39d64h | 12456 | 12456 | 15768 | |
device.exe | .data | 8c 61ca30h | 213 | 213 | 276 | FILLER |
device.exe | .pdata | 8c 63b210h | 341 | 341 | 424 | FILLER |
fatfs.dll | .data | 8c 659c 84h | 366 | 366 | 504 | FILLER |
fatfs.dll | .pdata | 8cb3ce0ch | 1324 | 1322 | 1624 | |
shell.exe | .data | 8cb3d338h | 1608 | 1605 | 2864 | |
shell.exe | .pdata | 8c 61cb05h | 183 | 183 | 208 | FILLER |
Coredll.dll 的第一个.data数据部分的大小是4字节,被放置在第一个可以使用的“洞”中, 0x8c600400 + 0x1c62c = 0x8c61ca2c 。它仅用了4个字节,将下一个要填充的地址移动到0x8c61ca30并将该“洞”缩小为464字节。
下一个小于一页的.data数据部分是Device.exe的数据部分,它需要213 = 0xd5字节,而且在第一个“洞”剩余的空间足够容纳它。它被放置到此处,将地址变为0x8c61cb05,将该“洞”缩小为251字节。
device.exe .data 8c61ca30h 213 213 276 FILLER
Device.exe的.pdata部分为341字节,比这个“洞”剩余的空间大,因此它被放置到另一个“洞”—— Coredll.dll资源部分最后一个页面上的“洞”,起始位置是0x8c63b210。
device.exe .pdata 8c63b210h 341 341 424 FILLER
接下来的.data或.pdata部分都比第一个“洞”剩余的251字节小,其中调试器命令解释器Shell.exe的.data部分为183字节。它被放于第一个“洞”的下一个有效的起始地址0x8c61cb05处。
shell.exe .pdata 8c61cb05h 183 183 208 FILLER
Romimage工具按照这种方式继续工作直到所有的部分全都被放置好。任何剩下未被使用的“洞”都被列在报告中:
Unfilled ROM Holes(Address,Length):
下一个小于一页的.data数据部分是Device.exe的数据部分,它需要213 = 0xd5字节,而且在第一个“洞”剩余的空间足够容纳它。它被放置到此处,将地址变为0x8c61cb05,将该“洞”缩小为251字节。
device.exe .data 8c61ca30h 213 213 276 FILLER
Device.exe的.pdata部分为341字节,比这个“洞”剩余的空间大,因此它被放置到另一个“洞”—— Coredll.dll资源部分最后一个页面上的“洞”,起始位置是0x8c63b210。
device.exe .pdata 8c63b210h 341 341 424 FILLER
接下来的.data或.pdata部分都比第一个“洞”剩余的251字节小,其中调试器命令解释器Shell.exe的.data部分为183字节。它被放于第一个“洞”的下一个有效的起始地址0x8c61cb05处。
shell.exe .pdata 8c61cb05h 183 183 208 FILLER
Romimage工具按照这种方式继续工作直到所有的部分全都被放置好。任何剩下未被使用的“洞”都被列在报告中:
Unfilled ROM Holes(Address,Length):
8c 9cfbf8h | 8 8caef3f8h | 8 8cb253f8h | 8 8cb2bff8h | 8 |
8c 769bf9h | 7 8c8d4ffah | 6 8c8f37fah | 6 8c98dffah | 6 |
8cb16ffah | 6 8cb1d7fah | 6 8cb327fah | 6 8c61dbfbh | 5 |
8c 6e6ffbh | 5 8c763ffbh | 5 8c855ffbh | 5 8c935bfbh | 5 |
8c 9877fbh | 5 8c7537fch | 4 8c765bfch | 4 8c7bcffch | 4 |
8c 7d3bfch | 4 8c80dbfch | 4 8c82f3fch | 4 8c8f27fch | 4 |
8c 938ffch | 4 8c9c17fch | 4 8c9e23fch | 4 8ca6e7fch | 4 |
8cacfbfch | 4 8cb20bfch | 4 8c61cbfdh | 3 8c659ffdh | 3 |
8c 6e13fdh | 3 8c6e23fdh | 3 8c6e87fdh | 3 8c6ee7fdh | 3 |
8c 63b3feh | 2 8c74fffeh | 2 8c785ffeh | 2 8c7b8ffeh | 2 |
8c 7c 23feh | 2 8c9717feh | 2 8c99d7feh | 2 8cb09ffeh | 2 |
8cb227feh | 2 8c63afffh | 1 8c65a3ffh | 1 8c6ea7ffh | 1 |
8c 788fffh | 1 8c793fffh | 1 8c9727ffh | 1 8c9a8bffh | 1 |
8ca83bffh | 1 8cacf7ffh | 1 8cb047ffh | 1 8cb0bfffh | 1 |
识别FILLER部分的能力是十分重要的,因为执行体和DLLs的大小和数量对于不同的配置有所不同。这将影响可使用的“洞”的大小,并影响所需的全部内存量。
要确定每个模块的ROM使用情况,可以根据Romimage工具输出的该模块各部分的大小计算出总和——并且除去那些作为填充“漏洞”的部分。因为填充部分是被插入到可以使用的“洞”中的,所以它不会增加该模块的内存需求量。
要确定每个模块的ROM使用情况,可以根据Romimage工具输出的该模块各部分的大小计算出总和——并且除去那些作为填充“漏洞”的部分。因为填充部分是被插入到可以使用的“洞”中的,所以它不会增加该模块的内存需求量。
查看虚拟内存
使用Memtool工具可以查看每个虚拟内存页面。Memtool提供了对每个进程都有效的32(MB)内存的一个完整映象。内存映象可以看出代码和数据是否在ROM或RAM。
Memtool还可以显示出当前堆栈使用情况的摘要。堆栈的大小可以根据需要动态增大或缩小。显示出的堆栈数可能并不代表最大需求量。它们描述了堆栈在使用Memtool工具检查时的状态。
例如,Filesys.exe进程内存映象的头几行显示了各种不同的用法。每个符号表示一个内存页面并指示出该页面的使用情况:
Memory usage for Process 8c056d2c: 'filesys.exe' pid 1
Slot base 04000000 Section ptr 8cfe4c00
Memtool还可以显示出当前堆栈使用情况的摘要。堆栈的大小可以根据需要动态增大或缩小。显示出的堆栈数可能并不代表最大需求量。它们描述了堆栈在使用Memtool工具检查时的状态。
例如,Filesys.exe进程内存映象的头几行显示了各种不同的用法。每个符号表示一个内存页面并指示出该页面的使用情况:
Memory usage for Process 8c056d2c: 'filesys.exe' pid 1
Slot base 04000000 Section ptr 8cfe4c00
04000000(1): ----------------------r-----------------------------------------
04010000(0): -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
04020000(0): CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
04030000(0): CCCCCCCCCCWWWWWWWWWWWWWWWWWWWWW---R
04040000(0): -------------------------------------------------SSS----SSSS
04050000(0): PPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
连字符(-)表示该页面被保留;小写r表示在RAM中的数据;大写C表示ROM中的代码;大写W表示在RAM中的可读/写数据;大写R表示ROM中的数据;大写S表示堆栈;大写P表示外围设备的内存(不能被核心分配但是可以被Gwes或设备驱动程序映射);大写O表 示目标存储设备。除了这些符号外,小写c表示正在RAM中执行的代码。
在内存映象后,Memtool工具显示了摘要信息。类似的信息还可以用Ppsh工具和MI命令得到,这些信息显示如下:
Memory usage for Process 8c036d2c: 'filesys.exe' pid 1
Slot base 04000000 Section ptr 8c5e7000
Page summary: code=207(0) datar/o=2 r/w=7 stack=1 reserved=13963
在页面摘要中,code后面的值表示ROM中的页面数。圆括号中的数字表示了RAM中的页面数。数据页面中分别表示了只读或读/写页面数。Stack后面的值表示了堆栈所用的页面数。
要得到其他微处理器和其他平台上的内存需求信息,可以使用ROM Image Builder、Ppsh或Memtool工具来查看它们的输出信息。这些工具的完整文档可以在Microsoft Windows CE Embedded Toolkit for Visual C++® 5.0中找到。
在内存映象后,Memtool工具显示了摘要信息。类似的信息还可以用Ppsh工具和MI命令得到,这些信息显示如下:
Memory usage for Process 8c036d2c: 'filesys.exe' pid 1
Slot base 04000000 Section ptr 8c5e7000
Page summary: code=207(0) datar/o=2 r/w=7 stack=1 reserved=13963
在页面摘要中,code后面的值表示ROM中的页面数。圆括号中的数字表示了RAM中的页面数。数据页面中分别表示了只读或读/写页面数。Stack后面的值表示了堆栈所用的页面数。
要得到其他微处理器和其他平台上的内存需求信息,可以使用ROM Image Builder、Ppsh或Memtool工具来查看它们的输出信息。这些工具的完整文档可以在Microsoft Windows CE Embedded Toolkit for Visual C++® 5.0中找到。
关于此内容的其他信息
关于Microsoft Windows CE Embedded Toolkit for Visual C++ 5.0,可以参阅Microsoft Windows CE Web站点。该工具将提供给MSDN Library的普通订户。
这篇关于Microsoft Windows CE 的内存使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!