嵌入开发(WinCE)的一些经验(3)

来源:互联网 发布:达索plm软件 编辑:程序博客网 时间:2024/06/03 07:57

 EVC下如何具体编程开机启动?
>>模拟器中是否能使程序自起动?希望高手支招!!!
我认为不能。
在硬件平台上,可修改注册表。
例如:
[HKEY_LOCAL_MACHNE/Init]
"Launch40"="App.exe"
"Depend40"=hex:14,00
>>应该是用api:
BOOL CeRunAppAtEvent(
TCHAR *pwszAppName,
LONG lWhichEvent );
其中lWhichEvent有个值为:
NOTIFICATION_EVENT_WAKEUP
>>>>>>>>>>NOTIFICATION_EVENT_WAKEUP:When the device wakes up.
我认为对开机启动:不能算错误,但也不能说正确。
此处device所指为何?不清楚!
当系统起动时,device被Initialize或wake up,而不只是wake up。
还有,当存在即插即用device 时,插上device ,可能也会引起NOTIFICATION_EVENT_WAKEUP事件。

有关中文编码问题
请问在winCE操作系统中,用emVC来开发,用linux来做服务器,
请问这两者间通信的中文问题如何解决?非常感谢。
可以写一个Unicode和GB的转换函数,不太难的,只是点阵的计算方式不同,unicode是竖着计算而GB是横着计算,仅此而已!

Iuse the RegisterDevice API to load the driver and I have no problemdoing that on the "old" Pocket PC but on the Pocket PC 2002 the driverfails to load.
I have tested the driver using LoadLibrary andGetProcAddress and calling all functions just to see if there wassomething wrong with the exported interface from the DLL but I didn'thave any problem.

I know that mapping from physical to virtuall addressing is done bye OEMAddressTable in ARM
Virtualto physical mapping is done by the CPU Memory Management Unit (MMU)notthe address table. The SHx and MIPS processors have some pre-fixedmappings defined in the CPU architecture. The other CPUs do not andtherefore use the OEMAddressTable to specify where in Virtual memorycertain on-chip resources are to be mapped so the OAL and interrupthandlers can access them.




我们都知道windows操作系统有支持ANSI和支持Unicode的版本,也有都支持的.其中,windows98只能支持ANSI系统环境.windows2000可以支持Unicode和NSI.windowsCE只支持Unicode.WindowsXP好象也是两个都支持.所以我们在开发多国语言的时候一般都选用windows2000.因为我们可以构件Unicode工程来支持多国语言的显示.(如果你不理解什么是Unicode可以参看<<Windows核心编程>>的第二章.(在ttp://www.china-pub.com/computers/common/info.asp?id=131提供第二章的免费下载).|完整的下载,我都忘记了|.
为了在控件中显示别国语言(如日文,阿拉伯文等)而不至于显示成????,或者说文字可以显示在控件上,但是你无法获取他们并将他们保存到我们常用的CString中,这就需要你创建Unicode工程,这样才能支持.如果你一定要在Ansi系统(win98),开发这样的东西.我暂时还没有搞出来。.呵呵,在<<windows核心编程>>里面说得很清楚,如果你要把这个东西加到里面,即便成功也会造成无法想象的不稳定.关于这点显示的问题,我在下面还有一些支持在98下显示的问题说明,介绍的是用DHTML控件的.下面我先说建立Unicode工程和用RichEdit 控件(用CRichEditCtrl类支持)显示多语言的问题.
创建Unicode工程只要按照下面步骤进行就可以了.(/***/注释段为摘抄)
/******************* //构件Unicode Debug
1.前提条件:
运行VC++的安装程序,选中MFC的UNICODE支持。
2。VC++Build->configurations...->Add->Configuration->"Unicode Debug"->OK
3.Project->Setting->C++->Preprosesser Definitions->加入UNICODE,_UNICODE, 去掉MBCS即可
4。Project->Setting->lINK->Category->)Outputw->加入wWinMainCRTStartup。
5选择"Win32 Unicode debug"编译方式,代码按照Unicode encoding!
6. Hope it has some help to you.
********************/
实际上只要下面两步骤:
1.project下面选setting,然后选C/C++,在preprocessor definitions中加入
_UNICODE.(不需要去掉_MBCS)
2.就是上面的4.
有了上面步骤,就说明你的工程已经是Unicode工程了.如果你是想把原来的程序改造成Unicode.编译后可能会发生错误,这就要求你改正成Unicode的正确形式..一般情况下对,字符串常量..你只要在前面加上_T("字符串常量"),就可以了.剩下的多为函数调用和字符转换的问题如strcpy->lstrcpy和CString<->Char*之类的(可以看核心编程)..关于这个转换问题,我这里有一个出自CSDN精华区的网页(别人的总结),不知道现在里面有没有了?如果没有你想要,可以和我联系告知.我将尽力帮助.这里对_T宏说明一点,其实它在ANSI环境下也是通过的.而且就读成相应的环境形式.所以一般情况下,我觉得编程,应该都加上这个宏.免得将来麻烦:).还有一个要考虑的,Unicode因为都是双字节的,所以读取的时候要注意,特别是在写文件的时候.首先,如果你要让你的文件成为Unicode文件,一定要在文件头加上0xFFFE.还有假如你用的是CFile读写文件也要注意.如果你创建的是以非文本读写的..你应该考虑下面的问题:
CFile file;
CString htm;
if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite))
    //Open fail;
WORD wFlag=0xFEFF;
file.Write(&wFlag,2); //这是写Unicode文件标志头.
htm=_T("alkdsj flajdflajdlsfj")
file.Write(htm,htm.GetLength()+1);//这是错误的.应该把后面的长度这样才能把htm内容完整的写到文件里面.
                //你可以自己考虑具体问题出现在哪.:).
接着,我再说一下关于RichEdit控件的问题.因为是昨天刚遇到,所以今天就抽空帮别人解决了.他的问题是这样,在2000下,Unicode工程,RichEdit控件中输入小语种(日文,阿拉伯),无法用GetWindowText等函数获取.(获取的都是????).问题原因主要是因为:
(1).RichEdit控件的版本太低,如RichEdit1.0(riched32.dll)就是不支持Unicode的.所以必须换成RichEdit2.0或者3.0(riched20.dll)的.所以在你的程序InitInstance()里面应该有下面代码:
HINSTANCE richEdit=::LoadLibrary(_T("riched20.dll"));
if(!richEdit)
AfxMessageBox(_T("Unable to load RichEdit2.0"));
AfxInitRichEdit();
(2).修改你的资源*.rc.打开rc文件.(Open->*.rc|Text方式|)..把原来的"RICHEDIT"改成"RICHEDIT20W"就可以了.如下:
CONTROL     "",IDC_RICHEDIT1,"RICHEDIT20W",WS_BORDER |
这样,你利用GetWindowText,就可以得到你要的东西.也就是解决上面的问题。
这儿,我提供方法给那些没有用过RichEdit的人去构造这个控件.
A.当你在对话框中有了Rich Edit后..你编译时发现不能弹出对话框了.请在你的InitInstance()开头加上.AfxInitRichEdit();
B.如果你初始化的话..用下面方式(在OnInitDialog里面加)
SetIcon(m_hIcon, TRUE);   // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CHARFORMAT cfDefault;
memset(&cfDefault,0,sizeof(cfDefault));
cfDefault.cbSize=sizeof(cfDefault);
cfDefault.dwMask = CFM_FACE | CFM_SIZE |CFM_CHARSET | CFM_SPACING;
cfDefault.yHeight = 200;
cfDefault.bCharSet =ARABIC_CHARSET; //这是阿拉伯文的.这个好象不会影响控件.|我没研究清楚.不过是不可以用来让我们在非Unicode中获取文字的(或者没有上面解决方式).
strcpy(cfDefault.szFaceName,"Arial");
m_RichEdit1.SetDefaultCharFormat(cfDefault);//设置模式
c.如果要设置你的RichEdit响应事件消息(Envent)用:
  CWnd* pWnd=GetDlgItem(IDC_RICHEDIT1);
CRichEditCtrl* pRich=(CRichEditCtrl*)(pWnd);
long nEvn=pRich->GetEventMask();
nEvn |=ENM_CHANGE;   //响应OnChangeEdit函数.
pRich->SetEventMask(nEvn);
上面这些就是RichEdit入门.呵呵..