wince 开发的一般问题

转自http://club.embedev.net/viewtopic.php?t=2065

问:Microsoft® eMbedded Visual Tools 3.0到底是什么?
答:eMbedded Visual Tools 3.0是一套供嵌入式开发商在Microsoft Windows® CE操作系统上面向新一代32位设备编写软件应用程序的相关工具。该产品提供了Microsoft eMbedded Visual C++® 3.0开发系统完全版、Microsoft eMbedded Visual Basic® 3.0开发系统完全版、SDK、远程工具及相关文档。

问:eMbedded Visual Tools 3.0同Windows CE Platform Builder 3.0之间存在哪些差异?
答:Platform Builder 3.0为您提供了在Windows CE 3.0操作系统上迅速创建32位嵌入式系统所需的全部工具。此外,Platform Builder 3.0还包括eMbedded Visual Tools 3.0完全版。

问:如何获取eMbedded Visual Tools 3.0?
答:通过访问Windows CE eMbedded Visual Tools站点,以在线方式订购。

问:订购eMbedded Visual Tools 3.0需要支付哪些费用?
答:您只需支付相关产品发售费用(在美国和加拿大为7.5美元;其它地区则为14.95美元)即可。请注意,您所获得的是完全正式版,而非测试版。

问:除eMbedded Visual Tools 3.0之外,我们是否还需要另行购买Microsoft Visual Studio®开发系统?
答:不必。eMbedded Visual Tools 3.0是一个完整而独立的工具集,它并不需要另行获取Visual Studio、Visual C++或Visual Basic。

问:我目前正在使用Windows CE Toolkits for Visual C++ 6.0 and Visual Basic 6.0。eMbedded Visual Tools 3.0会替代它们吗?
答:不会。您可继续对老式工具包加以应用。但是,请您务必认真阅读README.HTM文件,以便掌握在继续沿用老式工具包的前提下,安装新型HPC Pro与Pocket PC 1.2 SDK的正确方法。

问:eMbedded Visual Tools 3.0可为哪些平台提供支持?
答:eMbedded Visual Tools 3.0随同面向Pocket PC、H/PC Pro及Palm-size PC 1.2的SDK一并发售。如果您拥有像嵌入式开发板卡这样的另类硬件,则请向供货商进行垂询,以便获取所需设备专用SDK的相关信息。eMbedded Visual Tools 3.0可生成与Windows CE 2.11版、2.12版及3.0版相兼容的程序代码。

问:如果我需要针对运行于Windows CE 2.0之上的Handheld PC或运行于Windows CE 2.01之上的Palm-size PC等早期设备编写应用程序的话,应使用何种工具?
答:面向早期设备的开发商应继续使用Windows CE Toolkits for Visual C++ 6.0 and Visual Basic 6.0,并辅以Visual Studio。

问:如果我拥有一个通过在Visual Studio下使用Toolkits而创建出来的项目,并希望将其升级为eMbedded Visual Tools 3.0标准,应该怎么办?
答:eMbedded Visual C++能够直接打开由Windows CE Toolkit for Visual C++ 6.0所创建的项目。而对于那些通过使用Windows CE Toolkit for Visual Basic创建出来的项目,则请在eMbedded Visual Basic 3.0帮助文件的附录2中查阅有关指导材料。

问:eMbedded Visual Tools 3.0可面向哪些微处理器提供支持?
答:eMbedded Visual C++提供了针对下列微处理器类型的编译器:

ARM720
SA1100
MIPS
MIPS16
MIPSFP
PPC
SH3
SH4
THUMB
x86
x86设备模拟器

eMbedded Visual Basic则提供了针对下列微处理器类型的编译器:

ARM720
SA1100
MIPS39xx
MIPS41xx
MIPS41xx 16位模式
SH3
x86设备模拟器

问:eMbedded Visual Tools 3.0是否支持模拟操作?
答:是的。不过,只有在运行于Microsoft Windows 2000 Professional或Microsoft Windows NT® Workstation 4.0之下时才会这样。

问:是否可在Windows 98或Windows 98 Second Edition下运行eMbedded Visual Tools 3.0?
答:eMbedded Visual Tools 3.0的确需要Windows 98 Second Edition提供支持。该产品将无法安装在Windows 98之下。请注意,在运行于Windows 98 Second Edition平台上时,将无法执行模拟操作;而在其它情况下,产品则将具备全部功能。

问:如何获取更多相关信息?
答:您可以查阅随同eMbedded Visual Tools 3.0一并提交的最新改进文档,访问Windows CE开发商工具站点,浏览eMbedded Visual Tools数据表或访问Windows CE eMbedded Visual Tools站点。

问:我用evc开发的程序无法在PDA上显示中文(PDA有中文系统,EVB开发的程序可以!用的一样的字体??)
答:开发中文程序,总结(x862002为例):
(1)从微软网站上下载EVC3.0,并安装
(2)从微软网站上下载Pocket PC 2002 SDK,并安装(此时是英文Image-English-No Radio,在相应的Emulation目录下)
(3)从微软网站下载语言Image程序(简体中文为ChSimp-NoRadio.exe),按照说明(ReadMe.txt)进行安装(修改注册表等一系列步骤)
(4)确认对话框等资源的语言为Chinese(P.R.C),就可以正常显示中文了。


问:我有个程序要在读入一个文件,但是不知道如何把这个文件放到模拟器中请大侠指教

答:这要看你用的是什么模拟器,如果是POCKET PC 2002,则用EVC下的工具REMOTE FILE VIEW 导入文件即可,如果是其它的模拟器可以在你的安装目录下(默认的为:windows ce tools 3.0)找到这样一个目录:emulation,在这个目录中你可以看到与模拟器显示一样内容的东西(包括windows,document等目录),将 文件拷在这个目录下就行,或自创目录也行。

问:怎么控制对话框上方的OK按钮,譬如让它出现,或者禁止它出现.还有如何加其他的按钮,譬如cancel.
答:看看资源文件(用记事本之类打开)如果有EX0800000之类的在你的对话框中,就把它删掉,OK就没有了 如果想所有的都没有,就不要system cotrol

问:如果我想在对话框的标题栏右边加一个组合框,怎么办?
答:将下面的源码放入到CYourDialog::OnInitDialog()函数体内:
CCeCommandBar m_wndCommandBar;
if(m_wndCommandBar.m_hWnd == NULL)
m_wndCommandBar.Create(this);
m_wndCommandBar.InsertSeparator(6);
CComboBox* pComboBox = m_wndCommandBar.InsertComboBox(100, 1001);
pComboBox->AddString(L"1");
pComboBox->AddString(L"2");
pComboBox->AddString(L"3");
pComboBox->AddString(L"4");
pComboBox->SetCurSel(0);

这 是CEGadgets.com 网站的一个关于CE开发的FAQ,但是大部分内容是关于Windows CE2.xx版本的,因此我并没有全部翻译,而是进行了筛选,把一些我认为比较有用的,试着译出,大概占到原文的60%。如果你对WINDOWS CE以前的版本感兴趣可以直接阅读原文。

====常规问题====

问:为什么我应该为Windows CE写软件?
答:PDA(个人数字助理)发展的非常迅速!2001年IDC研究并预测,每年掌上设备的市场增长将超过40%。 掌上设备将成为下一个巨大的企业计算处理平台。IDC还大胆的预言PDA在2001将超越PC出售,到达20千万台。
Windows CE正是为了这个,而快速的生长和发展起来的。微软的Windows CE系统在企业应用和开发方面是一个不错的选择,并且WINCE有很多的的合作伙伴,包括了应用软件和硬件设备。
如果你已具备任何Windows平台开发的经验, 那你可以很容易的进行Windows CE开发。如果是其他的平台,你必须重新学习新的开发工具和适用于这个平台的API,这还没有完,你的程序还将得不到微软和他的合作伙伴的支持。你可以利 用微软的强大市场能力和你的知识开始CE编程。

问:在Windows CE中的CE代表什么?
答:虽然微软宣称CE不代表任何特别的意思,但是对于CE有很多的流行说法,而且都很有趣。它代表消费者电子技术(Consumer Electronics)或者或紧凑的版本(Compact Edition),这显然是比较好的。也有很多的人因为CE的问题把它成做残废的版本(Crippled Edition) 还有一个是我比较喜欢的,货物售出,概不退换(Caveat Emptor)。

问:我想要学习进行Windows CE开发。我应该在哪儿开始?
答:你可以找到许多关于Windows CE开发的资源。 首先,你可以选择Windows CE新闻组:
Microsoft.public.win32.programmer.wince
Microsoft.public.vb.vbce
Microsoft.public.windowsce
Microsoft.public.vc.vcce
Microsoft.public.ado.wince
Microsoft.public.windowsce.developer.betas
Microsoft.public.windowsce.embedded
其次,你可以检查www.deja.com(不知道连接是否有效)上的关于Windows CE开发的好的文档,这也是不错的一个Windows CE资源。
我最喜欢的是windows ce的邮件列表。它可能是从最纯粹的技术的角度讨论Windows CE的资源了,并且有很多的CE开发高手已经加入。它包含嵌入式应用开发各个方面。想要加入它,只需发送电子邮件到WindowsCE- Dev@Lists.WindowsCE.com
你还可以找到一些书籍,也可以访问一些和Windows CE开发有关的网站。
最后,没有什么比实际经验更重要的了。你可以购买微软开发工具,或者NSBasic。试着创建一些应用程序。如果你有Windows开发经验,那么你将发现为Windows CE开发仅仅有一点点的痛苦;-)
雷神:这个老外唠唠叨叨的说了一大堆,我在补上一条。访问 http://www.vchelp.net那里有关于VC/C++编程的许多优秀资源,当然它也包括了WINDOWS CE。


问:关于Windows CE开发有什么书?
答:下面是作者精心挑选出的几本书,很遗憾除了第一本,其他的国内好象都没有,如果你知道别忘了告诉大家一声。
Inside Windows CE – John Murray
Programming Embedded Systems for Microsoft Windows Ce – Jeff McLeman
Professional Visual Basic Windows CE Programming – Larry Roof
Programming Windows CE – Douglas Boling
Windows CE 2 Programming for Dummies – Nick Gratten
Essential Windows CE Application Programming – Robert Burdick
Windows CE Developers Handbook – Terence Goggin
Windows CE from the Ground Up - Jean Louis Gareau (annabooks web site).
Sams Teach Yourself Windows CE Programming in 24 Hours – Bsquare
Windows Ce : Application Development – Keven Millsap, Marshall Brain

问:能否在推荐一些关于Windows CE开发的网站?
答:这有一些关于 CE 开发的站点:
Microsoft’s Windows CE site – www.microsoft.com/windowsce
可以获得实例、SDK和一些工具。
Visual CE Developer Site - www.vcce.com
有大量关于Visual C++ for CE的一些信息.
Visual Basic Developer Site - www.vbce.com
有大量关于Visual Basic for CE的一些信息.另外还提供一些Visual Basic for Windows CE开发的控件.
还有一些,我不在这里一一列出了,大家可以用GOOGLE搜出一串......




问:什么事情是我在设计新的Windows CE应用程序以前需考虑的?
答:(希望没有错误)
1。 在你设计之前请了解一些要求和限制。
2。 为你的用户制造真正有帮助的产品-你应该是第一个使用着。
3. 记住,发布版本要有功能–采用轮询技术,减少串口资源的消耗。
4。 运用WM_HIBERNATE
5。 考虑因特网连通性。
6. 检查是否有GNU或可以移植的源码– 你的应用软件可能已经被写过了。
7. 记得,你最好不让你的应用程序只运行在Palm Size PC上(Windows CE 2.0– 2.11)。
8。 为你的应用程序写一份帮助文件
9. 将程序做成安装程序–使它可以很容易被安装。
10。在实际的设备上的测试。仿真器虽然好但是它不是真实的Windows CE设备。
11。别使用特立独行的方法,除非这样做能帮助它。
12。买一块以太网卡以便建立网络环境-它是物有所值的。


问:我想要使用Visual C++开发。 我需要什么?
答:使用Visual C++开发是非常好的选择,因为在任何CE平台上它都可以工作。
Visual C++ Toolkit for Windows CE 5.0这是Windows CE开发环境的一个旧的版本。它当然没有后出的VC6.0好,并且没有支持PSPC 1.2 SDK,以太网调试等等。但如果你想开发Windows CE1.0应用,那只好使用它。因为6.0并不支持WinCE1.0。
使用Visual C++ 5.0开发你需要下列工具:
Visual C++ 5.0, Professional or Enterprise edition
Visual C++ Toolkit for Windows CE 5.0
HPC or PSPC SDK,可免费从微软站点下载。

当前使用C/C++为Windows CE开发应用的开发环境是Visual C++ Toolkit for Windows CE 6.0。
使用Visual C++ 6.0开发你需要下列工具:
Visual C++ 6.0, Professional or Enterprise edition
Visual C++ Toolkit for Windows CE 6.0
Any of the CE SDK's, 可免费从微软网站下载。


问:还有那些Windows CE开发工具是可以选择的?
答:(雷神:有很多,现在有更多的选择)
NSBasic – www.nsbasic.com
BasicCE – www.cemonster.com/development.htm
PocketC - http://www.orbworks.com/wince/index.html
Python – www.python.org for general information, and http://starship.python.net/crew/mhammond/ce for the product.
Waba – www.wabasoft.com
Jeode - www.insignia.com
Pocket Scheme - http://www.angrygraycat.com/scheme/pscheme.htm
JSoftware - http://www.jsoftware.com/download/download.htm
Dialect - http://www.aristar.com/DeveloperTools.html
Transvirtual - http://www.transvirtual.com/
CrEme - http://www.nsicom.com/products/creme.htm
Visual CE - http://www.syware.com/
River Run Software AppsBuilder - http://www.riverrun.com/appsbuilder/index.html


问:我怎样报告Windows CE开发工具的BUG或提出新的需求?
答:微软有一些有用的电子邮件地址:
Windows CE开发工具需求建议:
wcetwish@microsoft.com
Windows CE开发工具错误报告:
wcetbug@microsoft.com

问:哪里有SH3的指令集和反汇编程序?
答: http://www.datarescue.com/idawindowsce.htm 有Windows CE代码的反汇编程序。另一个反汇编程序地址: http://www.delosoft.com/


问:在Windows CE应用程序中可以使用DCOM吗?
答:Windows CE 2.11以及更早的版本不包含DCOM实现- 那时候只有进程内服务被允许。然而,DCOM FOR CE的测试版(在9/99)出现,微软计划CE3.0将包括DCOM的实现。Intrinsyc公司实现了CE2的DCOM。虽然和微软的桌面DCOM不 太一样,但是它提供相似的功能。更多的信息访问: http://www.intrinsyc.com.

问:Windows CE支持COM吗?
答:Windows CE仅仅支持进程内COM对象。有在Windows CE的下一个版本将扩充COM功能的说法。下面是关于CE的COM开发的一些参考:
"How to Write and Use ActiveX Controls for Microsoft Windows CE" from the MSDN
"The Tools You'll Need to Build Embedded Apps: Windows CE Toolkit for Visual C++ 6.0" from MSJ July 1999. There's a section called "Desktop ActiveX Controls".
上一个问题。
在CE平台上我已经使用ATL有一段时间了,除了在connection points上有一些小问题外,其他都工作的很好。在CEGadgets.com主页上可得到所有的CE下使用ATL写的控件。

问:如何把自己的图标加到task bar上面 ?
答:经常看到一些程序可以把自己的图标放到task bar上面,和那些系统图标并排是不是很cool呢?
其实做到一点很容易的,只要加入下面的代码:
CString strClass = ::AfxRegisterWndClass(0);

HWND hTaskBar = ::FindWindow(_T("HHTaskBar"), NULL);

CWnd::CreateEx(
0,
strClass,
_T("MyIcon"),
WS_CHILD|WS_VISIBLE,
r.left,
r.top,
r.Width(),
r.Height(),
hTaskBar,
0,
0);

其原理是找到taskbar 窗口,然后以taskbar窗口为父窗口建一个你自己的图标窗口。
不过要注意,一些程序例如WisBar or Dashboard会覆盖taskbar,这样你的图标也不见了,如果你想让你的图标继续显示,就需要取得这些程序的窗口句柄,然后在上面建立自己的窗口,原理是一样的。


问:如何取得当前window的hWnd?
答:这是一个很烦人的问题,不少函数都需要这个变量,结论其实简单:

AfxGetApp()->GetMainWnd()->m_hWnd


问:在程序中打开和关闭PPC软键盘 ?
答:看到有不少人在问如何在程序中控制打开和关闭SIP(Soft Input Panel),其实这是一个简单问题,

MSDN的解决方案是用:
SHSipPreference(hWnd, SIP_UP);
SHSipPreference(hWnd, SIP_DOWN);

但这需要一个hWnd参数,在Dialog base的程序中不好找.
其实还有一个更好的方法:

#include "SIPAPI.H"
然后就可以调用
SIPShowIM(SIPF_ON)
SIPShowIM(SIPF_OFF)
来打开/关闭SIP了.

不过奇怪的是MSDN从未提到这个最简单的办法.


问:如何去掉PPC2002上的"智能最小化"按钮 ?
答:PPC2002在外观上的一个显著改进就是加了个"智能最小化"按钮,就是那个包着圈的X,一开始阿猫还以为它是关闭按钮:) (可为什么不设一个关闭按钮呢?)

如果因为某种原因你不想要它.可以加这么一句:
ModifyStyle(0, WS_NONAVDONEBUTTON, SWP_NOSIZE);


问:如何建立一个非全屏的Dialog窗口?

答:不知什么原因,M$的PPC SDK中默认的Dialog是全屏的.
就是说
CNfsDlg dlg;
dlg.DoModal();
打开的Dialog是全屏的.我猜这是Microsoft想在狭窄的PPC屏幕上给大家提供一个更"广阔的"空间.但用惯了的Windows还颇有些不习惯.如何变成非全屏窗口呢?
最简单的方法是在DoMoal前设置m_bFullScreen参数.

CNfsDlg dlg;
dlg.m_bFullScreen = FALSE;
dlg.DoModal();

=============第三方工具和硬件==========================

问:在Windows CE平台上有哪个数据库是可得到的?

已知的可以在Windows CE平台下使用的数据库工具数量很多。下面是一个挑选出来CE数据库侯选名单:
Object store database
ADOCE
OLEDB SDK (Q4 99)
Sybase ?www.sybase.com
Oracle Lite ?www.oracle.com
Raima ?www.raima.com
Codebase CE - www.sequiter.com
Syware Visual CE ?www.syware.com
Syware ODBC for Windows CE ?www.syware.com
Bullet ?40th.com
DB2 Everywhere - http://www.software.ibm.com/data/db2/everywhere/
Pervasive - http://www.pervasive.com/

问:在那里可以得到CE平台下的Text-To-Speech(文本到语音)引擎?
Windows CE只有很少的(TTS)引擎。
Windows CE下可以得到的TTS引擎有Lernout和Hauspie。它们是支持AutoPC的语音引擎。不幸地是现在仅仅支持SH3处理器。可以在 http://www.lhsl.com/ssyn/tts3000wince.asp 得到更多的信息。
你还可以了解一下Dectalk TTS引擎。Dectalk属于Fonix公司,你可以购买它。从 http://www.fonix.com/products/dectalk/可以得到更多的信息。
其他的Windows CE TTS还有Elan。Elan TTS Toolkit被发布于99年11月1日当时的价格是$495US(很贵呀)。 它支持MIPS和SH处理器,并且支持多种语言包括: 美国英语, 英国英语, 法语, 德语, 西班牙语, 巴西语和俄语。更多的信息可以访问Elan网站: http://www.elantts.com/.

问:我想要为Windows CE写一个MP3解码器。我从哪儿开始?
答:当前在Windows CE平台有两个流行的MP3播放器,实际上他们都是使用Xaudio SDK实现MP3译码/播放。Xaudio SDK是非常容易使用的,有详细的文档资料,并且免费(仅限个人,用于商业需获得许可)。
Xaudio开发的支持也非常好。可以在www.xaudio.com 获得更多的信息并且下载SDK。
如果你确实想要自力更生;-),在www.mpeg.org可以获得一个mp3解码器的源代码,参考参考吧。

问:在那里有为Windows CE的提供的打印库?
答:你可以访问FieldSoftware公司,它们提供一个PrinterCE ActiveX控件。可以在CE上实现基本的出版输出程序。FieldSoftware还提供一个条形码打印的补丁包。PrinterCE不是免费的,价 格从19.95(基本库)直到$1000(支持条形码的PrinterCE加强版)之间的不同的500个许可证。
来自FieldSoftware新闻组的帖子:
PrinterCE可以实现从简单到复杂的VBCE打印(你不必担心设备环境和BitBlits和DIBsections等等)。加强版的PrinterCE增加了打印超出屏幕大小的支持等很多的功能。
更多的信息请访问: www.fieldsoftware.com

问:如何可以编程实现一些Pocket Outlook data应用?
答:毫无疑问你应该使用POOM SDK(Using the Pocket Outlook Object Model SDK),它是这方面的标准,并切有非常易用的接口和你Windows CE设备上的日程和任务进行交互。你可以直接用数据库或者AddressCard API的数据来修改你的日程或任务。
POOM可以提供一些更加使人喜欢的特征红外线的接收和发送(ReceiveFromInfrared和SentToInfrared)。
下载POOM SDK地址是:msdn.microsoft.com/cetools/platform/poomsdk.asp(雷神注:你可以在MSDN全文检索中输入POOM SDK,你将会得到更多的信息)


问:怎么能保护我的Windows CE应用程序?
答:你在卖你的软件时可以象道尔芯片(一种必须装在计算机中才能使计算机运行专有软件的硬器件(保密器-解密器),用来防止非法软件复制。)一样利用把密钥放进PCMCIA或CF卡中。
你可以查看 http://www.des.co.uk/它提供一个免费的相关开发工具包。
这有一些关于这个的信息:
利用CompactFlash TYPE I半成品卡,用这个设备可以保护你的Windows CE 2.x应用程序不被盗版/侵权。你可以通过DESkey API工具将密钥写进DESkey CF卡中,制作出必须通过此CF卡才可以使用的应用程序。
特征:
CompactFlash设计
随机数产生器
你的应用程序的代码或数据可以通过DESkey为解码。
独特的8字节的口令
记忆- 标准的容量是1,024个字节。可以申请更多直到32K。
反模拟算法
DK3CF+ 支持所有的流行的处理器,包括MIPS,SH3等等。
另外,看一下这个 http://www.mappad.com/,他们提供了一种独特的设备,它可以通过红外线获得密钥,然后CE设备才可以工作。
There are various software-only based protection mechanisms as well, like creating secret entries in the registry, computing a unique ID based on the user and device characteristics, or requiring a valid serial number (supplied by the author) before allowing the application to run.
有各种各样的软件可以提供保护机制,在用户的设备上产生一个唯一的密码,或者要求一个有效的序列号(由作者供应了),在验证通过后,应用程序才能运行。

问:哪里有Windows CE的XML分析器?
答:在1999年10月13日,mov软件公司发布Windows CE下的XML分析器EXPAT。
EXPAT是一个符合XML 1.0但是并没有被确认的XML分析器,由John Clark.编写。更多的关于EXPAT信息请访问 http://www.jclark.com/xml/expat.html
EXPAT可以在遵守GPL或MPL 1.1许可的情况下自由传播。下载EXPAT源代码请访问 http://www.movsoftware.com/devres.htm
EXPAT已经被核实可以在下列平台上工作:
CE2.11 SH3, SH4,ARM,MIPS
CE2... SH3,MIPS
http://www.movsoftware.com/expatxml.htm 有更多的信息。

问:Windows CE平台支持GCC吗?
答:从 http://www.innonet.at/~wisi/index.html可以看到.一个GCC MIPS编译器正在开发中,目前还没有发布任何版本。它来自我发现的 http://hyperion.clc.cc.il.us/~arty/。不过这个页面已经在98年9月停止了更新,但这个家伙已经已经做了很多的工作。我仅仅在试着解决这个GCC编译器的一些问题,并试着完成它。
目前状态是pre-alpha状态。在我的VELO500上机可以完成简单的程序(例如: 打开一个消息框)。


问:我不能找到我需要的一些API函数。我该怎么做?
答:当你在给Windows CE写应用程序时,一定要知道WIN CE开发组的基本思路。他们从全部Win32 API函数中抓

取了一些他们认为必须的Api函数。例如,如果一样的事情可以有3种方法被实现,那么他们将省掉其他的实现

方法的一些Api函数,只保留一个。换句话说,如果你发现一API是没有的,首先看看四周,问你自己“我能否

用其他的方法实现这个功能?”,通常没有提供的一些API可以被另外的一些API实现。

另外在sdk的LIB目录下的coredll.lib中有很多的API函数(超过2400),也许你可以找到一个你需要的。 例如,

我就发现了SetWindowsHookEx 它在看来相似于桌面SetWindowsHookEx。文档说SetWindowsHookEx是不能用的,

但是它在coredll.lib。

还有,如果你想要一个HPC 2.00的API函数,但直到2.11都没有此函数的文档说明,你可以检查2.00的

coredll.lib。也许可以在在那里找到它。这说明它是未公开的(它不工作!)函数,你可以使用未公开的函数,

但必须慎,并且需要测试,测试,再测试。

最后,如果API是未公开的它将不能在以后的版本正常工作。据说微软正在做的3.0版本的变化很大(现在已经

是3.0了),即使他们变化很小,你也应该尽可能不使用它们。


问:我能怎么确保我的应用程序运行时只有一个实例?
有一些方法-注册,FindWindow()或CreateMutex()。

当你的应用开始时你可以用一个变量表示注册,当你的应用结束时删除这个变量。需要注意的是,如果你的应

用不是正常的退出,你的用来表示注册的变量不会被删除。当你再次运用你的应用是,它将看见实例已经被注

册了因此会停止运行。

FindWindow() 方法是最容易实现。在你的应用初始化实例时进行搜索,看看有没有已经正在运行的实例存在。
HWND hWnd=FindWindow(YOUR_WINDOW_CLASS, YOUR_WINDOW_TITLE);
if(NULL!=hWnd) {
SetForegroundWindow(hWnd);
return 0;
}

这有一个VB编码的例子代码,你能使用它找到一个窗口。 这个例子假设窗户标题是SampleForm。
Public Declare Function FindWindow Lib "Coredll" Alias "FindWindowW" (ByVal lpClassName As

String, ByVal lpWindowName As String) As Long
Public Declare Function GetLastError Lib "Coredll" () As Long
On Error Resume Next
Dim hWndX As Long
hWndX = FindWindow("Form1", "SampleForm")
If (hWndX <> 0) Then MsgBox "found it!" '

另外的一个技术是使用CreateMutex()。你首先需要创造一个互斥标记,并保证它确实不存在。如果互斥标记确

实存在,你将发送一条注册的消息到所有的顶层窗口告诉它们应用程序已经自己移动到前面,然后关闭当前的

实例。

HANDLE hMutex=CreateMutex(NULL, TRUE, _T("YOUR_MUTEX_NAME_HERE"));
if(hMutex && ERROR_ALREADY_EXISTS==GetLastError()) {
// The app is already running
CloseHandle(hMutex);
return 0;
}

问:如何使我的应用在系统开始时便执行?
答:KEY_LOCAL_MACHINE/Init包含了设备开始时运行的可执行文件。LaunchXX键下面列出的是所有可执行文件

,XX是用来决定运行顺序。另外的键,DependXX,允许指定相关性(即除非Launch40成功的运行Launch50才能运

行)。
在HKEY_LOCAL_MACHINE/Init下面创造一个新键,指定键名为Launch60的(或比Launch50大的),并且将键值设定

成一个可执行文件名。如果你仅希望外壳成功开始后再执行这个EXE,你需要创建Depend60并且将键值设成32h(

十六进制的50)。
在系统开始时运行一个应用的另一种更容易的方法是,把到你的应用程序的链接放在/Windows/StartUp文件夹

中。


问:当我的应用程序正在运行时怎么阻止另外的应用程序运行(我能怎么阻止用户使用开始菜单)?
答:一种技巧是停用任务栏。使用FindWindow,获得任务栏窗口句柄停用它。注意当你的程序退出时一定要确

保任务栏被重新启用!不过,一个无效的任务栏会使你的输入不方便。你可能不得不用手动显示出/隐藏输入面

板以便可以完成输入工作。
下面是一个例子:
HWND hTaskBarWnd = ::FindWindow(_T("HHTaskBar"), NULL);
if (hTaskBarWnd) {
::EnableWindow(hTaskBarWnd, FALSE);
::ShowWindow(hTaskBarWnd, SW_HIDE);
}
注意:使用这种方法也许你需要刷新你的桌面。如果需要你可以获得桌面窗口并用调整它的大小,见下:
HWND hDesktopWnd = ::FindWindow(_T("DesktopExplorerWindow"), NULL);
If (hDesktopWnd)
::SetWindowPos(hDesktopWnd, NULL, 0, 0, GetSystemMetrics(SM_CYSCREEN),

GetSystemMetrics(SM_CYSCREEN) - 26, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
注意:26是任务条的高度。在调整桌面窗口大小以前计算任务栏高度可以是不错的办法。

问:我怎么能改变任务条设置,例如自动隐藏?
答:自动隐藏和另外的任务条设置被包含在注册表键HKEY_LOCAL_MACHINE/Software/Microsoft/Shell里,它有

一个TBOpts的值。TBOpts是包含4个DWORD bitfield:
#define MENUOPT_SHOWTIME 0x0001
#define MENUOPT_SHOWDATE 0x0002
#define MENUOPT_SHOWBANNER 0x0004
#define MENUOPT_AUTOHIDE 0x0008
一旦你改变TBOpts值,显示或隐藏各种各样的任务条设置,你需要通知任务条。象下面这样:
SendMessage(hTaskBarWnd, WM_COMMAND, 0x3EA, 0)
通知任务栏根据变化更新。


问:我怎么阻止设备自动挂起?

答:阻止你的设备自动挂起的一种方法是每n分钟发出一个键盘事件,例如:
keybd_event(VK_F24,0,KEYEVENTF_KEYUP| KEYEVENTF_SILENT,0);
如果你使用VBCE,试一试下面的代码:
Public Declare Sub keybd_event Lib "coredll.dll" (ByVal bVK As Byte, ByVal bScan As Byte, ByVal

dwFlags As Long, ByVal dwExtraInfo As Long)
///在定时器控件的事件中,键入(7B是VK_F12-你可以使用你喜欢那的任何字符):
keybd_event &H7B,0,0,0
keybd_event &H7B,0,&H2,0
另一个方法是打开socket并总是保持打开状态。
最后,你可以使用SystemParametersInfo将超时设定为0使它变成没有意义的。例如:
SystemParametersInfo(SPI_SETBATTERYIDLETIMEOUT, 0, NULL, TRUE);
这个办法的问题是,一旦你使用了这个方法,那么即便是你的设备控制面板显示出挂起的缺省值,实际上设备

也不会按照它在一些时间后自动挂起,甚至你软启动都没有办法恢复,因此你要慎重考虑是否要使用这种办法


还有一个未公开的API SetPowerOffHandler,但是我没能让它正常的工作起来。

问:我怎么检测电源是否处在打开状态?
你可以使用WaitCommEvent和EV_POWER的掩码检测电源是否打开。打开一串口并等待一个EV_POWER事件。当事件

发生时将发送消息到你的应用程序窗口让它知道电源是打开的。
SetCommMask(comportHandle, EV_POWER);
WaitCommEvent(comportHandle, &eventValue, NULL);
SendMessage(hwnd, WM_POWERON, 0, 0);
一个警告:这个方法因为需要始终打开串口,因此它将会消耗附加电池的电量。因此将会缩短电池的使用时间

。另外,使用这种办法将会防碍另外的应用程序使用串口。你应该在测试无误后,小心地使用这个电源探测技

术。

另外的一个方法在Windows CE技术杂志1999年9月被讨论 。在文章中Jeff Spurgat描述了设备驱动怎么收到电

源状态改变通知,并且还说明了怎么通过个功能开发应用程序。

最后,另外一个有趣的建议是创造一个线程。每n秒激发一个定时器,每次定时器被激发,就比较当前的系统时

间(GetSystemTime)与最后(保存的)系统时间值。如果两者的间隔超过两次定时器间隔,那么说明设备已经被挂

起了。


问:我如何通过编程关掉设备?
答:Windows CE treats the power button just like a keyboard key. Because of this, you can simply

send a VK_OFF keystroke to the system and it will power off, just like you pressed the off

button!
Windows CE的电源开关只不过是一个键盘上的键。因此你能简单地发送一个VK_OFF按键到系统来关闭电源,就

象你按下了电源的开关!
void SuspendDevice()
{
keybd_event(VK_OFF, 0, 0, 0); // down
keybd_event(VK_OFF, 0, 2, 0); // up
// code execution resumes on the next line...
MySampleFunction(); // runs when the device wakes back up...
}

顺便说一句,VK_OFF被定义为0xDF。
你也可以使用PowerOffSystem函数。这个函数是未公开的,因此它可能随时发生变化或者不付存在。
未公开的函数 void PowerOffSystem(void)声明在coredll.dll中。它把CE设备设置在挂起状态。当电源被恢复

时用户口令对话框不会出现,且桌面和另外的窗口不会被重画。代码执行继续在出现PowerOffSystem以后。
你能使用将所有的窗户设成无效解决重画问题,并且如果需要,你也可以显示口令对话框,使用CheckPassword

对用户进入的口令进行检查。
GwesPowerOff是另一个电源相关的API。当挂起设备时GWES调用GwesPowerOff。比起直接调用PowerOffSystem来

说是更好的办法。 http://support.microsoft.com/support/kb/articles/Q207/9/88.ASP 上有更多的信息。
最后,你可以参考关于编程实现挂起设备的文章和代码。

问:我能怎么得到电池的状况?
答:在WCE2.0或以后版本,可以使用GetSystemPowerStatusEx API获得电池的状态。


问:我如何确定设备类型?
答:使用SystemParametersInfo。它有一个选项SPI_GETPLATFORMTYPE可以返回平台环境的字符串描述。

问:我如何确定设备名称?
答:注意这个键并非在所有的平台上都是有效的。检查你的平台注册表键HKEY_LOCAL_MACHINE/Platform键,键

值对应于原始设备制造商设备名称。例如,在casio e-100上健值是Casio Jx530 CE2.11。一个Nino 312健值是

Philips Version 1。

问:我怎么能启动连接到桌面?
答:使用CreateProcess或ShellExecuteEx调用/windows/repllog.exe。桌面将开始一次activesync会话。


问:我怎么知道ActiveSync是否正在运行?

答:你可以用FindWindow查找repllog窗口.如果你发现它则activesync正处在激活或试图联接状态。

问:我怎么编程实现改变显示屏亮度?
答:我只听说有不标准的API可以改变亮度。每一个OEM制造商都有各自的改变亮度的工具或方法,如果你真的

感兴趣可以和OEM制造商联系,研究一下他们的显示驱动程序。


问:我怎样才能让设备重新启动或恢复到出厂状态?
答:利用OEM制造商提供的OEMIoControl可以随意地处理IOCTL_HAL_REBOOT。然而应用程序不能直接调用

OEMIoControl,只能通过先调用KernelIoControl然后由KernelIoControl调用OEMIoControl。
#include "winioctl.h"
BOOL KernelIoControl(DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf,

DWORD nOutBufSize, LPDWORD lpBytesReturned);
#define IOCTL_HAL_GET_DEVICE_INFO CTL_CODE(FILE_DEVICE_HAL, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
KernelIoControl(IOCTL_HAL_REBOOT, &inVal, 4, outBuf, 1024, &bytesReturned);

执行上面的代码可以实现软重起。如果你想要实现硬重起,还需首先调用SetCleanRebootFlag函数。
注意它不能在Casio E-100上使用。另外CE以后的版本将会限制SetCleanRebootFlag函数。

问:我如何改变对象存储的大小?
答:首先我们要知道,以后的Windows CE的版本将限制这一功能。
函数GetSystemMemoryDivision和SetSystemMemoryDivision允许你在改变内存和存储对象之间的关系。
它们的函数原型是:
BOOL GetSystemMemoryDivision(LPDWORD storePages, LPDWORD ramPages, LPDWORD pageSize);
DWORD SetSystemMemoryDivision(DWORD storePages);

如果成功地执行了,那么函数返回SYSMEM_CHANGED。
如果storePages超出范围,函数返回SYSMEM_FAILED。
如果SYSMEM_FAILED被返回,你可以调用GetLastError得到进一步的信息.
如果必须重新启动才能使改变生效,函数返回SYSMEM_MUSTREBOOT。
如果上一次调用返回了SYSMEM_MUSTREBOOT,则函数返回SYSMEM_REBOOTPENDING。这说明在完成上一次的重新启

动之前,不能进一步调配边界。
你不能缩小系统内存或对象存储内存超出256K以外的,包括为现有文件和记录分配的空间。

问:怎么能我改编在设备上的按钮?我能使用通过硬件按钮启动应用程序功能吗?
答:看看下列API函数:
RegisterHotkey
UnregisterHotkey
UnregisterFunc1(未公开)
另外访问 http://www.conduits.com/ce/dev/wince.htm 并且参看keytest例子代码。

问:我正在写一个基于对话框的应用。为什么任务栏或任务列表没有出现在我的窗口?
答:任务栏只有在含有按钮时可见,最顶层的窗口有WS_OVERLAPPED式样。对话框缺省值是WS_POPUP式样这样就

没有任务栏按钮。你可以在资源编辑器把对话框风格由WS_POPUP改成WS_OVERLAPPED解决此问题。
使用PB 2.12的某人说了一个有趣的现象。他没有任务栏按钮,且没使用WS_OVERLAPPED,但是任务栏仍然出现

了!也许在2.12版本缺省值已经被改变。

问:我想要更改联系人数据库。联系人数据库名字是什么?
答:你不要试图直接更改联系人数据库,应该使用由Windows CE提供的API来进行设置。
看看OpenAddressBook,CreateAddressBook,CloseAddressBook,还有AddressCard,

GetAddressCardProperties,ModifyAddressCard等等。
你可以使用Pocket Outlook Object Model SDK,也称为POOM SDK。POOM提供一个简单的接口操作联系人,日历

和任务数据库。可以在http://msdn.microsoft.com/cetools/platform/poomsdk.asp .下载POOM SDK。

问:什么是维纳斯?
答:维纳斯是中国的电视制造商TCL生产。用56kb调制解调器和一个电视接口捆绑在一起的计算机,使用

Windows CE 系统。用户通过维纳斯可以非常轻松的实现通过因特网观看电视。


问:怎么得到在CE下的时间?
答:使用SYSTEMTIME和GetLocalTime即
SYSTEMTIME st;
::GetLocalTime(&st);


问:如何转换pwi文件到rtf文件?
答:MSDN上有一篇文档“转换富文本数据”,它给出了一个例子代码可以实现.pwi和.rtf之间的转换。


问:我能怎么判断自应用程序最后一次运行后设备是否是重新启动?
答:检查注册表键HKEY_LOCAL_MACHINE/Comm的BootCount值。每次设备是软重起这个值会被增加。如果设备是

硬重起这个值被回赋到1。

问:怎样在Windows CE下面让资源成为动态链接库?
答:你需要定义一个入口指向动态链接库。正确声明DllMain并且让它返回真。
#if defined(UNDER_CE) && !defined(_WIN32_WCE_EMULATION)
#include <windows.h>
extern "C"
BOOL WINAPI DllMain (
HANDLE /*hInstance*/, // @parm handle of instance
DWORD /*dwReason*/, // @parm reason
LPVOID /*lpReserved*/ // @parm reserved
)
{
return TRUE; // ok
}
#endif

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页