WinCE驱动开发问题精华集锦(三)

[复制链接]
 楼主| tedyu 发表于 2009-3-27 12:43 | 显示全部楼层 |阅读模式
修改了WINCE自带的驱动程序后如何编译?如果是自己开发的驱动程序如何编译?&nbsp;<br />1、分为IDE方式和命令行方式。&nbsp;<br />IDE&nbsp;方式的编译很简单,以PB5.0为例,打开定制内核的工程,在左边的“workspace”—“FileView”中找到你已经修改了的目录,然后单击右键弹出菜单,在菜单中选择“Build&nbsp;and&nbsp;Sysgen&nbsp;Current&nbsp;Project”,这样PB就会编译指定的目录中的项目源码文件,然后执行sysgen命令根据source文件中的内容生成目标文件并复制到当前内核工程目录下。&nbsp;<br />命令行方式的编译需要打开“Build&nbsp;OS”&nbsp;—“Open&nbsp;Release&nbsp;Directory”,以cd命令进入你已经修改的驱动程序目录中,然后键入“build&nbsp;–cfs”,然后键入&nbsp;“sysgen&nbsp;–p&nbsp;项目名称”,一般项目名称为source文件中的“TARGETNAME”。&nbsp;<br />2、如果想完全自己开发驱动程序,建议直接采用EVC或者PB来编写编译。&nbsp;<br /><br />开发PCI设备驱动时,InterruptInitialize函数的第一参数是否是PCI卡配置空间信息中的InterruptLine&nbsp;参数?是否需要在HKLM\Drivers\BuiltIn\PCI\Template&nbsp;加一個自己的&nbsp;subkey,并填写相应内容?如何填?&nbsp;<br />1、InterruptInitialize的第一参数是IRQ,也就是逻辑中断号,而不是物理中断号,InterruptLine是指物理中断号&nbsp;<br />2、需要在template下加自己的PCI设备的信息,例如:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Dll&quot;=&quot;Com16550.Dll&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Class&quot;=dword:07&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;SubClass&quot;=dword:00&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;ProgIF&quot;=dword:02&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;VendorID&quot;=multi_sz:&quot;0AF0&quot;,&quot;B320&quot;,&quot;B320&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;DeviceID&quot;=multi_sz:&quot;0020&quot;,&quot;0300&quot;,&quot;0302&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Prefix&quot;=&quot;COM&quot;&nbsp;<br />而这些信息就来自于你执行pcienum.exe的结果。&nbsp;&nbsp;&nbsp;<br /><br />编译器报错:error&nbsp;C2065:&nbsp;'CFileFind'&nbsp;:&nbsp;undeclared&nbsp;identifier,如何解决?&nbsp;<br />MFC&nbsp;for&nbsp;WINCE版本没有CFileFind类,所以要查找文件只能调用API&nbsp;FindFirstFile&nbsp;和FindNextFile。&nbsp;<br /><br />如何设置WINCE系统字体、字号?如何设置自己开发的软件的字体、字号?&nbsp;<br />1、系统字体通过注册表设置。如下:&nbsp;<br />[HKEY_LOCAL_MACHINE\System\GDI\SysFnt]&nbsp;&nbsp;&nbsp;&nbsp;///系统字体&nbsp;<br />Wt=420&nbsp;<br />Ht=18&nbsp;<br />Nm=Arial&nbsp;<br />[HKEY_LOCAL_MACHINE\System\GWE\Menu\BarFnt]&nbsp;&nbsp;&nbsp;&nbsp;///菜单栏字体&nbsp;<br />[HKEY_LOCAL_MACHINE\System\GWE\Menu\PopFnt]&nbsp;&nbsp;&nbsp;&nbsp;///弹出窗口字体&nbsp;<br />[HKEY_LOCAL_MACHINE\System\GWE\Menu]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///菜单字体&nbsp;<br />HKEY_LOCAL_MACHINE\System\GWE\Button&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///按钮字体&nbsp;<br />2、创建字体时把字体高度参数设置大点就可以了。如CFont::CreateFont(nHeight,...),也可以在LOGFONT结构中设置字体高度或者字体种类。如果是控件,调用控件的SetFont成员函数。如果是直接画,在OnPaint响应函数中调用SelectObject选字体到DC。&nbsp;<br /><br />nk.bin和nk.nb0有什么区别?&nbsp;<br />这里提到的bin是一种二进制镜像格式,以片断(section)为单位组织数据,每个片断都包括一个头,头里指定了起始地址,长度,校验值。Platform&nbsp;Builder调用工具将WINCE内核所有文件以bin格式合并成一个文件,默认文件名为nk.bin。BootLoader又以同样的格式将nk.bin分解成多个文件放到RAM中。可以在命令行中键入&nbsp;“viewbin&nbsp;nk.bin”来查看bin文件中具体包括了哪些内容。键入Cvrtbin命令转换.bin格式文件为.sre格式或者.abx格式。&nbsp;<br />nb0格式是原始的二进制镜像,它不包括头,一般情况下将内核下载到设备的RAM中运行都采用nb0格式。要生成nbx格式的文件,需要在相关.bib文件中确定如下值:ROMSTART、ROMWIDTH、ROMSIZE。&nbsp;<br /><br />在不采用硬件计时器的情况下如何创建更精确的计时器?最精确周期能否达到1毫秒?&nbsp;<br />对于精确值的要求不同,所采用的办法不同。以下阐述几种办法。&nbsp;<br />1、在单线程中循环调用API&nbsp;Sleep函数,Sleep函数精确程度为如果Sleep(N),那么实际睡眠时间在N到N+1毫秒之间。而且还要注意调用Sleep的线程优先级的问题。如果任务过多并且此线程优先级低,那误差就更大些。&nbsp;<br />2、调用API&nbsp;QueryPerformanceCounter函数,举例如下:&nbsp;<br />LARGE_INTEGER&nbsp;&nbsp;&nbsp;liFrequency;&nbsp;<br />if&nbsp;(QueryPerformanceFrequency(&liFrequency))&nbsp;&nbsp;&nbsp;//&nbsp;查询系统时钟的频率,这里将返回1000&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;liFrequency.QuadPart&nbsp;/=&nbsp;1000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;&nbsp;&nbsp;liTimeOut;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(QueryPerformanceCounter(&liTimeOut))&nbsp;&nbsp;&nbsp;&nbsp;//得到截至到当前累计发生的系统时钟中断次数&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;liTimeOut.QuadPart&nbsp;+=&nbsp;liFrequency.QuadPart;&nbsp;&nbsp;&nbsp;&nbsp;///计算下一秒到来时总的中断次数是多少&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;&nbsp;&nbsp;liCurrent;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(&liCurrent);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;循环查询累计的的中断次数&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(liCurrent.QuadPart&nbsp;&lt&nbsp;liTimeOut.QuadPart);&nbsp;///到达下一秒&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />}&nbsp;<br />调用QueryPerformanceCounter同调用Sleep在本质上都是一样的,都是在单线程中无限循环等到周期一到执行任务,相比较&nbsp;QueryPerformanceCounter要比Sleep更精确些,越精确就越要求线程的优先级,保障线程能够正常得到处理器。&nbsp;<br />3、以上办法难以保证周期精确到1毫秒并且WINCE系统稳定地运行,所以要从中断入手。以x86平台为例,先在Timer.c中将默认的SetTimer0&nbsp;(TIMER_COUNT)中的TIMER_COUNT&nbsp;/=2,SetTimer0函数负责设置系统时钟的频率,默认1毫秒发生一次中断,如果除以2就是0.5毫秒发生一次中断。然后在fwpc.c文件中修改ISR函数PeRPISR,因为原来默认是1毫秒发生一次中断,在处理INTR_TIMER0时系统负责累计计数、管理线程的调度,返回相应的SYSINTR值,而我们没有办法再添加代码返回自己定义的SYSINTR值,所以现在要修改原来的处理代码,例如设置一个BOOL型变量,TRUE就执行原来默认的代码,而FALSE就返回我们自己定义的SYSINTR值,这样即不影响原来的ISR处理,又加入了我们的中断响应代码。ISR返回我们定义的SYSINTR后WINCE内核激活相对应的EVENT事件,我们就可以在我们编写的IST里处理任务了。&nbsp;<br /><br />flash中存放了BootLoader和内核镜像,如何把剩余flash部分划分为一个存储区域供应用程序读写?&nbsp;<br />以WINCE&nbsp;提供的驱动(FAT文件系统和MSFLASH驱动)来举例说明。如果采用默认common.reg中的注册表设置,那么MSFLASH驱动默认把整个&nbsp;flash作为存储区域来读写,这不符合问题的要求,所以必须告诉MSFLASH驱动程序可供读写的区域的起始地址和长度。以下是一个注册表例子:&nbsp;<br />[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FASLD]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Dll&quot;=&quot;fasld.dll&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///实际Flash存储器的驱动程序&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Order&quot;=dword:2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///该驱动程序相对于其它驱动程序的加载顺序&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Prefix&quot;=&quot;DSK&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///前缀&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Ioctl&quot;=dword:4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///IOCTL码,设备管理器加载驱动的时候调用IOControl函数,传递这个IOCTL码。&nbsp;<br />&quot;Profile&quot;=&quot;MSFlash&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///Profile名称,也就是[HLM\System\StorageManager\Profiles\MSFlash]&nbsp;<br />///当设备管理器加载此驱动程序的同时发送通知给系统,IClass(GUID)的值表明这是一个存储设备的驱动程序。&nbsp;<br />&quot;IClass&quot;=&quot;{A4E7EDDA-E575-4252-9D6B-4195D48BB865}&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;MemBase&quot;=dword:00000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///Flash中可供读写区域的起始物理地址,也就是Flash的首地址+偏移量&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;MemLen&quot;=dword:00000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///Flash中可供读写区域的长度&nbsp;<br />[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;DefaultFileSystem&quot;=&quot;FATFS&quot;&nbsp;&nbsp;&nbsp;&nbsp;///MSFlash驱动默认采用的文件系统&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;PartitionDriver&quot;=&quot;mspart.dll&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///采用的分区驱动程序&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;MountAsRoot&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///此目录作为文件系统的根目录&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Folder&quot;=&quot;NOR&nbsp;Flash&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///目录名称&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Name&quot;=&quot;FLASH&nbsp;Disk&nbsp;Block&nbsp;Device&quot;&nbsp;&nbsp;&nbsp;&nbsp;///Flash驱动名称&nbsp;<br />&quot;PartitionDriverName&quot;=&quot;MSPART&quot;&nbsp;///分区驱动名称&nbsp;<br />&quot;AutoMount&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///自动装载检测到的分区&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;AutoPart&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///自动分区&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;AutoFormat&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///自动格式化分区&nbsp;<br />[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\MSFlash]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;DriverPath&quot;=&quot;Drivers\\BuiltIn\\FASLD&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///Flash驱动在注册表中的位置&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;LoadFlags&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///这个值可以被设置为0、1、2。1表示同步加载,其它表示异步加载&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Order&quot;=dword:0&nbsp;<br />[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;FriendlyName&quot;=&quot;FAT&nbsp;FileSystem&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///文件系统名称&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Dll&quot;=&quot;fatfsd.dll&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///文件系统驱动程序&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Flags&quot;=dword:00000064&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///标志,详见帮助文档&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Paging&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///是否分页&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;EnableCache&quot;=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///是否允许缓存数据&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;CacheSize&quot;=dword:0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///指定缓存大小,0表示默认&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;驱动程序如何发通知给应用程序?&nbsp;<br />这里介绍一下常见的两种办法。&nbsp;<br />1、驱动程序调用API&nbsp;SendNotifyMessage,发送特定的消息给应用程序,这就要求应用程序要有消息循环机制并且要事先做好消息的处理。参数&nbsp;1为窗口句柄,可以设置HWND_BROADCAST表示广播消息。要注意的是不要在参数中传递指针(虚拟地址),因为执行驱动程序的线程和应用程序并不在同一个进程空间中。解决办法可以利用内存映射文件技术,比如在驱动程序中创建一个内存映射文件对象,申请一块物理内存,然后把对象名称和内存长度传递给应用程序,应用程序打开同名的内存映射文件对象,读取里面的数据。对象名称可以事先协定好,也可以通过注册表来传递,内存长度是32位值,通过消息参数就可以传递,也可以通过注册表来传递。另外一种解决办法是在定制内核时候预留一块物理内存,这样驱动程序和应用程序都可以通过VirtualAlloc和&nbsp;VirtualCopy来映射到同一块物理内存,其原理同内存映射文件技术一样,但是这块物理内存不具备通用性。最后一个办法是应用程序事先将一个缓冲区地址传递给驱动程序,驱动程序调用MapPtrToProcess映射应用程序传递过来的地址,当驱动程序调用SendNotifyMessage后应用程序可以直接到该地址中读取数据。&nbsp;<br />设备管理器就是调用此函数广播WM_DEVICECHANGE消息的。另外WINCE的一个例子程序RNAApp在拨号连接建立的时候也是调用这个函数广播WM_NETCONNECT消息的。&nbsp;<br />2、驱动程序调用API&nbsp;CeEventHasOccurred指明一个事件A发生,在此之前应用程序调用API&nbsp;CeRunAppAtEvent将驱动程序指明的A事件和一个应用程序名称相关联,或者和一个事件B相关联。这样当A事件发生时,如果指明和一个应用程序名称关联,那这个应用程序就会被启动。如果指明了和一个事件B相关联,那么等待事件B的线程将被激活。如果想了解当前系统内部所有驱动程序支持哪些类似事件A的事件,调用&nbsp;API&nbsp;CeNotifyPublic_FilterEvent,在该API的帮助文档里也列举了常见的事件,例如&nbsp;NOTIFICATION_EVENT_NET_CONNECT和&nbsp;NOTIFICATION_EVENT_NET_DISCONNECT。&nbsp;<br /><br />EVC创建的工程名称如果用中文就出错,该怎么办?&nbsp;&nbsp;&nbsp;<br />用EVC创建的工程名称如果为中文将导致资源文件打不开和编译出错,可以改资源文件名称为英文,再编辑.rc文件中的资源文件名称。但建议尽量不要用中文为工程名称。&nbsp;<br />作为习惯,应该在EVC创建一个工程后,立刻在“project”—“settings”中设置资源的语言属性,然后在“resource&nbsp;view”中设置每个资源的语言属性,这些工作做完后再修改资源就没有问题了。有人询问对话框的标题为乱码,其原因就是在没有修改语言属性的情况下设置标题为中文。&nbsp;<br /><br />WinCE下如何读写几百兆的大文件呢?&nbsp;使用内存映射文件吗?&nbsp;&nbsp;&nbsp;<br />一般嵌入式设备配备128MB物理内存就算顶级的了,所以要读写几百MB的文件用内存映射文件技术是最好的选择了。映射文件之后读数据是非常容易的,要注意的是写数据,内存映射方面的API没有提供改变文件长度的功能,所以要在关闭映射文件对象后用文件API改变文件长度。&nbsp;<br /><br />请问如何改系统调度的默认时间片值?&nbsp;<br />更改schedule.c文件中的dwDefaultThreadQuantum&nbsp;变量,然后重新编译该文件并SYSGEN。调用API&nbsp;CeGetThreadQuantum就知道更改是否生效。&nbsp;<br /><br />如何让系统加载自己写的驱动程序?&nbsp;&nbsp;&nbsp;<br />两种办法:&nbsp;<br />1、在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下添加注册键。&nbsp;<br />2、在应用程序中调用ActivateDeviceEx。&nbsp;<br /><br />在一些文件中用分号来表示注释,例如下面的内容&nbsp;&nbsp;&nbsp;<br />;&nbsp;@CESYSGEN&nbsp;IF&nbsp;SERVERS_MODULES_HTTPD&nbsp;<br />;&nbsp;@CESYSGEN&nbsp;ENDIF&nbsp;<br />在“CESYSGEN...”前加了“@”,有没有什么特别的含义?&nbsp;<br />在WINCE的一些文件中,用“;”作为注释并在注释文字中用@CESYSGEN作为标记,后面接条件语句。Cefilter.exe工具负责按照条件来筛选文件内容,所以不要轻易地删除包含@CESYSGEN的注释语句。&nbsp;<br /><br />通过串口建立ActiveSync联接,串口线用三线的可以吗?&nbsp;&nbsp;&nbsp;<br />不可以,因为用串口同步时要用到其余口的状态。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WINCE是否支持MAPI?&nbsp;<br />不支持。WINCE自带的pmail.exe软件也不是很好用。建议自开发邮件收发软件。如果需要购买WINCE下邮件收发软件可以联系我。&nbsp;<br /><br />如何旋转屏幕显示的内容?&nbsp;<br />例子代码如下(前提是显示驱动程序支持旋转):&nbsp;<br />DEVMODE&nbsp;&nbsp;&nbsp;devmode&nbsp;=&nbsp;{0};&nbsp;<br />devmode.dmSize&nbsp;=&nbsp;sizeof(DEVMODE);&nbsp;<br />devmode.dmDisplayOrientation&nbsp;=&nbsp;DMDO_90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///垂直模式&nbsp;<br />devmode.dmFields&nbsp;=&nbsp;DM_DISPLAYORIENTATION;&nbsp;<br />ChangeDisplaySettingsEx(NULL,&nbsp;&devmode,&nbsp;NULL,&nbsp;0,&nbsp;NULL);&nbsp;&nbsp;&nbsp;///改变显示的设置&nbsp;<br />CRect&nbsp;&nbsp;&nbsp;rcWorkArea(0,&nbsp;0,&nbsp;320,&nbsp;240);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///整个屏幕尺寸&nbsp;<br />///设置客户区大小并广播消息,这样所有软件也就随之更改显示&nbsp;<br />SystemParametersInfo(SPI_SETWORKAREA,&nbsp;0,&nbsp;(void*)&rcWorkArea,&nbsp;SPIF_SENDCHANGE);&nbsp;&nbsp;&nbsp;<br /><br />请问如何修改字形缓存的容量?&nbsp;<br />[HKEY_LOCAL_MACHINE\System\GDI\GLYPHCACHE]&nbsp;<br />&quot;limit&quot;=dword:0400&nbsp;
soso 发表于 2009-4-30 09:43 | 显示全部楼层

呵呵,很好,厉害

http://blog.sina.com.cn/c8051f<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部