登录
首页 嵌入式系统 微软嵌入式
回帖 发帖
正文

主题:WinCE驱动开发问题精华集锦(转帖)

点击:680 回复:0

WINCE是否支持MAPI?  
不支持。WINCE自带的pmail.exe软件也不是很好用。建议自开发邮件收发软件。如果需要购买WINCE下邮件收发软件可以联系我。  
 
如何旋转屏幕显示的内容?  
例子代码如下(前提是显示驱动程序支持旋转):  
DEVMODE  devmode = {0};  
devmode.dmSize = sizeof(DEVMODE);  
devmode.dmDisplayOrientation = DMDO_90;       ///垂直模式  
devmode.dmFields = DM_DISPLAYORIENTATION;  
ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);  ///改变显示的设置  
CRect  rcWorkArea(0, 0, 320, 240);    ///整个屏幕尺寸  
///设置客户区大小并广播消息,这样所有软件也就随之更改显示  
SystemParametersInfo(SPI_SETWORKAREA, 0, (void*)&rcWorkArea, SPIF_SENDCHANGE);  
 
请问如何修改字形缓存的容量?  
[HKEY_LOCAL_MACHINE\System\GDI\GLYPHCACHE]  
"limit"=dword:0400  
 
如何得到从WINCE启动开始到现在的时间?  
调用API GetTickCount,得到的值为32位整数,单位为毫秒。  
 
如何调用WINCE的软键盘?  
调用API SipShowIM(SIPF_ON),前提是内核加入了软键盘组件。  
 
基于HIVE的注册表,如何在系统关闭前保存注册表的数据到文件system.hv?  
调用API RegFlushKey函数。  
 
使用VirtualAlloc和VirtualCopy的时候需要注意哪些事项?  
1、VirtualAlloc的作用是申请虚拟地址空间,这肯定不是最终的目的,最终目的可能是申请物理内存、映射寄存器、提交文件等。没有一个目的会在意虚拟地址空间的位置,所以尽量传递参数1为0,也就是让WINCE自动分配虚拟地址空间。VirtualAlloc分配地址空间实际上是以64KB为单位,所以要指定申请的虚拟空间的首地址的话,参数1应该为64KB的整数倍,申请的长度也应该为64KB的整数倍,即使你不需要那么大。  
2、VirtualCopy的主要作用是映射物理地址空间,如果参数2为物理地址,那么最后一个参数要添加PAGE_PHYSICAL,参数2必须是256的整数倍。如果参数2为虚拟地址(0x80000000以上),那么最后一个参数就不要添加PAGE_PHYSICAL,WINCE内核会根据这个虚拟地址找到对应的物理地址。  
 
驱动程序和应用程序之间传递数据时何时调用MapPtrToProcess?  
因为设备管理器负责加载驱动程序DLL,这意味着当应用程序调用驱动程序接口函数的时候,WINCE内核会将调用驱动程序接口函数的线程转移到设备管理器的进程空间然后执行具体的驱动程序代码,应用程序和设备管理器处于两个进程空间,这就造成设备管理器无法访问应用程序传递的指针(虚拟地址),所以当我们在应用程序中传递指针给流驱动程序接口函数时,WINCE内核从中作了一个地址映射,例如ReadFile、WriteFile、DeviceIoControl函数的参数凡是指针都经过了映射才传递给驱动程序,所以很多驱动程序开发者并不了解其中的奥秘就可以编程了。但是如果参数是一个指向一个结构体的指针,而结构体里包括一个或多个指针,那么WINCE内核并不负责映射,所以就需要开发者在驱动程序接口函数中调用API函数MapPtrToProcess来映射地址。例如:pPointer_retval = MapPtrToProcess(pPointer, GetCallerProcess());  
 
如何判断可插拔的设备是否存在?  
1、通过查找注册表的值。凡是由API ActivateDeviceEx加载的驱动程序都在[HKEY_LOCAL_MACHINE\Drivers\Active]键下有注册键,通过查找“name”或者其它键值就能够找到。设备管理器就调用这个API。如果是PCI设备,在注册表[HLM\Drivers\BuiltIn\PCI\Instance]下查找关键字,例如[HLM\Drivers\BuiltIn\PCI\Instance\WaveDev1],说明音频驱动已经加载。  
2、调用驱动程序接口函数,根据返回值或者执行结果来判断。  
 
如何做到通过串口过来的一个信号启动自己开发的应用程序?  
创建一个线程负责等待串口过来的信号,调用API SetCommMask设置要等待的信号种类,具体可以等待的信号种类参见参数2的说明。然后再调用API WaitCommEvent函数等待这个信号,接收之后再调用API CreateProcess启动应用程序。  
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/91program/archive/2008/05/08/2415012.aspx
10-04-13 16:22

工控新闻

更多新闻资讯