??xml version="1.0" encoding="utf-8" standalone="yes"?> 作者:RAYMAN 当我们开发完Pocket PC或者Smartphone的Y件后Q都需要考虑如何制作l最l用户用的软g安装包。专门用于制作安装包的Y件有很多Q如Install Shield{。但在许多情况下Q我们仅仅需要一些比较简单的安装q程Q这时候我们完全可以利用SDK中提供的工具和一些免费的软g来制作安装包。另外,我们制作的Y件经怼需要在不同的^Cq行Q例如笔者开发的一个Y件同时支持HPCQPPCQSmartphone{^収ͼHPC和PPCq_上还?UCPUcd。如果每一步操作完成后都需要h工介入进行操作的话,每一ơ构E都会相当的J琐和耗时。所以我们会考虑如何一pd的操作采用脚本串接v来,只需要运行一个命令就能够生成最l需要的所有安装包?/p>
虽然EVC里提供了Batch Build的功能,但该功能只能用于同一q_的不同CPU版本的编译链接操作。在切换不同q_q行~译Ӟ需要在GUI环境中手工执行,无法辑ֈ我们要求。所以我们需要研I如何在命o行状态下q行E序的编译运行。实际上EVCE序本n是提供了一pd的命令可以用于命令行~译的?/p>
D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin>evc /? 其中主要是运用MAKE命o。假设我们需要编译的E序名叫做DemoQ工作环境文件名为demo.vcwQPPC版的工程目文g为Demo.vcpQSmartphone版本的项目文件ؓDemoSP.vcp.我们为EVC3~写好的批处理文件build.bat如下Q?/p>
REM @echo off Ҏ上面的代码,现在我们只需要运行一ơbuild.bat文g卛_~译生成PPCQSmartphone{不同^台的目标文g?/p>
生成目标文g后,我们需要考虑如何程序安装到讑֤上。cab文g是一U压~ƈ且带有各U安装信息的打包文gQ所有的安装软g实际上都是将软g的cab文g拯到相应设备上Q然后利用设备上的wceloadE序q行最后的讑֤安装步骤。我们可以用PocketPC或者Smartphone SDK中附带的cabwiz.exe Q在Smartphone上是CabWizSP.exeQ对E序q行打包生成cab文g?/p>
在制作cab文g之前Q我们通常需要做好以下的规划Q?/p>
cab文g的生成需要制作一?inf文g作ؓcabwizE序的输入。当我们做好计划之后可以动手编写这?inf文g。这个文件是整个制作q程中最关键的一步,也是最困难的一步?inf文g与windows里的ini文g十分怼Q都是用文本方式保存的,里面包含若干的段QSectionQ, 关键字(KeyQ和|ValueQ组成的描述信息。我们同h采用对例子进行解释说明的方式q行介绍?/p>
一般来_inf文g都有四个主要l成部分QPPC的写法和Smartphone的写法略有不同,我们先介lPPC的写法?/p>
inf文g的第一部分是一些全局信息的定义: [Version] <-版本信息Q必L该段 其中InstallDir中出现的“%CE1%”是inf文g定义的系l目录标讎ͼ下面列出的是PPC 2002和Smartphone 2002下可以用的目录宏: q些目录标记在进行安装的时候会替换成相应的pȝ目录路径。此外这些系l目录在安装q程中会自动Ҏ需要进行自动调节。例?CE1%是指pȝ~省的程序安装目录,指向“\Program Files”。而当用户选择E序安装在存储卡中时Q该目录也会做相应改变?/p>
[CEString]和[Strings]中定义的变量以及上面提到的目录标记可以用于替换inf文g中的L部分。下面的说明中会有用的例子?/p>
W二部分是用来声明支持的讑֤CPUcdQ操作系l类型和版本可求: [CEDevice.ARM] <-目标讑֤声明Q如果支持多U设?CPU׃有多个CEDeviceD,q且在用讑֤标号作ؓ后缀表示。如果只支持一U设备,可以直接用[CEDevice]表示 WinCE各个q_的表C法和相应的版本号如下表QUnsupportedPlatform和VersionMin/VersionMax的值可以参考该表进行填写?/p>
inf文g的第三部分是定义源文件的l成和其在桌面机器的目录Q?/p>
[SourceDisksNames] <-源文件所在目录,D名UC加后~表示与^台无关的文g所在目?必须有该D?br>1=, "SourceDisk01",,%CommonDir% <-格式?<source ID> = ,<label>,,<source directory>其中Source ID用来在后l内容中指定源文件目录用Qlabel只是说明Q无用处。Source directory则是指源文g在PCpȝ中的所在目录?br> inf文g的第四部分是定义安装的操?/p>
[DefaultInstall] <-指明安装包需要进行的操作Q例如文件拷贝,快捷方式创徏{。必L该段 "demo.exe",,,0x40000003 以上是针对PPC的inf文g写法。由于PPC支持多种的CPU所以比较复杂一些,而Smartphone目前实际上目前只支持一UCPUcdQ所以我们可以对inf文gq行化。其中文件的W?和第4部分的内容还是和PPC一栗而第2和第3部分则可以简化成Q?/p>
[CEDevice] 把以上四个部分拼成一个文件就是一个完整的inf文g了。制作完inf文g后,我们可以用cabwiz.exe文g来生?cab文g。该命o的语法如下: cabwiz.exe "inf_file" 参数的含义ؓQ?/p>
inf_file – 指向inf文g的全路径 假设我们前面例子中的inf文g名ؓdemo.inf文g。则对应的执行命令ؓQ?/p>
cabwiz demo.inf /err buildppc.err /cpu ARM MIPS SH3 q样׃生成 demo.arm.cab, demo.mips.cab, demo.sh3.cab 三个文gQ分别对?U不同的CPUQ^収ͼ的安装文件?/p>
生成了cab文gq不意味着大功告成。虽然用户可以手工将cab文g拯到设备上安装Q但q样需要用戯己懂得区分CPUcd{许多的专业知识。所以我们通常都会q一步生成一个可执行的自动化安装包,辑ֈȝ化安装的目的。如果你的安装过E比较简单的话,可以使用Spb Software HouseQ?a target=_blank>http://www.spbsoftwarehouse.comQ公司提供的免费软gezsetupq行可执行安装文件的制作。该软g生的安装E序功能比较单:昄产品信息和Y件授权协议,然后安装cab文g。虽然功能比较少Q但大部分的PPC/Smartphone软g的安装过E也只需要这几个功能p够了?/p>
首先我们需要制作一个demo.ini文g。该文g的格式很单,PPC和Smartphone对应的格式都一栗例子如下: [CEAppManager] ezsetupE序是一个命令行q行的程序,q可以方便我们进行自动化构徏。命令的使用Ҏ如下Q?/p>
ezsetup <-l language> <-i inifilename> <-r readme.txt> 我们可以用下面的命o来生成可执行安装文g: ezsetup -l english -i demo.ini -r Readme.txt -e License.txt -o demo_setup.exe 前面分别介绍了如何在命o行编译链接目标程序,制作cab文gQ以及生成自动化安装E序。这些步骤都是可以通过命o行方式执行的Q所以我们可以把q些命o在批处理脚本中串接v来制作自动化构徏脚本。这h们就可以“一?#8221;完成从代码编译到生成最l可执行安装包的全过E?/p>
Hi again, I'm still unable to get the correct resource dll to load. Instead I implemented the app so that it dynamically loaded the correct localized resoures. I implemeted it in a way so the I can choose to localize on Locale (sub language & primary language) or primary language.
HINSTANCE g_hInst; HINSTANCE GetResHInstFormLangId(LANGID langId) { CString resDllName; resDllName.Format(_T( HINSTANCE hInst = LoadLibrary(resDllName); { LANGID priLangId = PRIMARYLANGID(langId); resDllName.Format(_T( hInst = LoadLibrary(resDllName); } } BOOL ClocalizedApp::InitInstance() { #if SHInitExtraControls(); #endif SetRegistryKey(_T( LANGID userLangId = GetUserDefaultUILanguage(); g_hInst = GetResHInstFormLangId(userLangId); { sysLangId = GetSystemDefaultUILanguage(); if(userL g_hInst = GetResHInstFormLangId(sysLangId); } AfxSetResourceHandle(g_hInst); ClocalizedDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); { } } The drawback is of cause the all resource must be included in all localized resource dlls. If anyone has the solution to the previous thread post please respond. / Martin
本文来自《msdn开发精选》杂?005q第4?#8220;特别{划”栏目
用命令行~译链接E序
Usage:
EVC [myprj.vcp|mywksp.vcw] - load project/workspace
[<filename>] - load source file
/? - display usage information
/EX <macroname> - execute a VBScript macro
/OUT <filename> - redirect command line output to a file
/USEENV - ignore tools.options.directories settings
/MAKE [<target>] [...] - build specified target(s)
[<project> - <platform> <configname>]
[[<project>|ALL] - [DEBUG|RELEASE|ALL]]
/CLEAN - delete intermediate files but don't build
/REBUILD - clean and build
/NORECURSE - don't build dependent projects
/CECONFIG [<configuration>] - use specified configuration
set EVC="D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin\EVC.EXE" <-指向EVC 3.0E序所在目?br>set CFG=
set CECONFIG=
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild <-执行~译q生成目标可执行文g
if errorlevel 1 goto :eof <-如果~译p|则终止批处理
:pocketpc
set CFG=Demo - Win32 (WCE ARM) Release<-要q行~译的项目名U和~译出来的目标代码的q_和CPUcd。其?#8220;-”前面的是目名称Q?#8220;-”后面的部分是q_和CPUcd以及~译的是Release版还是Debug版。格式可以参照在EVC的Build->Configurations中的写法, EVC3 ?EVC4的表达方式略有不同?br>set CECONFIG="Pocket PC" <-~译PPCq_版本
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
set CFG=Demo - Win32 (WCE MIPS) Release
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
set CFG=Demo - Win32 (WCE SH3) Release
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
:sp2002
set CFG=DemoSP - Win32 (WCE ARM) Release
set CECONFIG="Smartphone 2002" <-~译Smartphoneq_版本
%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild
if errorlevel 1 goto :eof
echo build successfully finished!!
pause制作cab文g
Signature = "$Windows NT$" <-必须?Windows NT$或?Windows 98$, 不要改动
Provider = "Demo Soft" <-提供? 完整的程序名字会?<Provider> <AppName>"
CESignature = "$Windows CE$" <-必须是该?br>
[CEStrings] <-该段主要是定义安装程序用到的一些字W串,必须有该D?br>AppName = "DemoApp" <-E序的名?br>InstallDir = “%CE1%\Octopus Studio\%AppName%” <-定义E序在目标设备中的安装目?br>
[Strings] <-该段用于用户自己定义的字W串, 该段可?br>ExeBaseDir = "C:\ProjectHome\demo\Release\platform" <-和^台相关的文g攑֜q个目录?br>CommonDir = "C:\ProjectHome\demo\Release" <-与^台无关的文g攑֜q个目录?/p>
目录标记
目录路径
%CE1%
\Program Files
%CE2%
\Windows
%CE4%
\Windows\StartUp
%CE5%
\My Documents
%CE8%
\Program Files\Games
%CE11%
\Windows\Start Menu\Programs
%CE14%
\Windows\Start Menu\Programs\Games
%CE15%
\Windows\Fonts
%CE17%
\Windows\Start Menu
%CE19%
\Application DataQ仅用于Smartphone)
ProcessorType = 2577 <-该目标设备是StrongARM CPU
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2" <-不支持smarthphone和HPC{旧讑֤
VersionMin = 3.00 <-对应讑֤h作系l的最低版本号要求?.0,版本可明见下面的说?br>VersionMax = 5.00 <-假设我们的程序要求的操作pȝ最高版本号?.0
[CEDevice.MIPS]
ProcessorType = 4000 <-CPU要求?MIPS_R4000
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2"
VersionMin = 3.00
VersionMax = 5.00
[CEDevice.SH3]
ProcessorType = 10003 <- CPU要求?Hitachi_SH3
UnsupportedPlatforms = “Smartphone”,"HPC","Jupiter","Palm PC2"
VersionMin = 3.00
VersionMax = 5.00
Platform
Platform type
Windows CE version
Smartphone 2003
Smartphone
4.2
Smartphone 2002
Smartphone
3.0
Pocket PC 2003
Pocket PC
4.2
Pocket PC 2002
Pocket PC
3.0
Pocket PC 2000
Palm PC2
3.0
Palm Size PC v2
Palm PC
2.11
Palm Size PC v1
Palm PC
2.1
Handheld PC 2000
Jupiter
3.0
Handheld PC Pro
Jupiter
2.11
Handheld PC
HPC
2.0
[SourceDisksNames.ARM] <-D名U的后缀与前面的CEDeviceD늛对应
2=, "SourceDisk02",,%ExeBaseDir%\ppc\arm
[SourceDisksNames.MIPS]
2=, "SourceDisk03",,%ExeBaseDir%\ppc\mips
[SourceDisksNames.SH3]
2=, "SourceDisk04",,%ExeBaseDir%\ppc\sh3
[SourceDisksFiles] <-说明源文件分别放在什么目录下,必须有该D?br>"demo.htm" = 1 <- 格式?lt;filename> = <source ID>,其中filename是文件名QSource ID是指上面SourceDiskName中定义的源目录ID.“demo.htm”=1表示demo.htm文g是放在SourceDiskNames里定义的%CommonDir%目录里?br>"demo.exe" = 2
"demo.dll" = 2
CopyFiles = Files.InstallDir, Files.Windows <-指明需要进行文件拷贝的说明D,参看下面的说?br>CEShortcuts = Links <-指定需要生成的快捷方式定义. 除了q连个安装操作外Q开发h员还可以指定注册表修?AddReg), 自定的安?卸蝲时的可执行代?CESetupDLL), 注册DLL文g(CESelfRegister).具体可以参考SDK帮助文g
[Files.InstallDir] <-文g拯操作中指明的文g拯操作定义,用于定义每个文g如何被拷贝到讑֤?br>"demo.htm",,,0x40000001 <- 格式?lt;dest filename>,<source filename>,,<copy flags>, 其中dest filename 表示拯到目标设备后文g? source filename源文件的文g名,如果为空则dest filename用来表示源文件文件名;copy flags表示拯文g时的方式,该值是一些标志位的组合,可用的标志如下:
标志
含义
0x00000001
警告用户如果在拷贝该文g时发生错? 而用户采用蟩q操作的?/td>
0x00000002
不允许用户在拯该文件时发生错误才取跌操作
0x00000010
当目标目录中有同名文件存在时不进行覆盖操?/td>
0x00000400
当目标目录存在同名文件时才进行拷贝(覆盖Q操?/td>
0x20000000
如果目标文g比该文g新则不进行拷贝操?/td>
0x40000000
拯文g时不查文件日?/td>
0x80000000
创徏一个对该文件的链接Q主要是用于׃ndll文g
[Files.Windows] <-同上Q用户定义文件拷贝操?br>"demo.dll",,,0x80000013
[DestinationDirs] <-定义讑֤上的目标文g目录
Files.InstallDir = 0,%InstallDir% <- 格式?lt;section name> = 0,<dest directory>, 其中section name 对应[DefaultInstall] CopyFiles中的倹{dest directory则是目标讑֤上的目的目录。例如Files.InstallDir里列出的文g会拯到目标设备的%InstallDir%目录下?br>Files.Windows = 0, %CE2%
Links = 0, %CE11%
[Links] <- 该段对应[DefaultInstall]中CEShortcuts的定义,用来说明需要创建的快捷方式
%AppName%,0,"demo.exe",%CE11% <- 格式?lt;shortcut filename>,<shortcut type>,<target file/path>,<standard dest path>。其?shortcut filename是指生成的快h式的文g? shortcut type 指明链接的是文g名还是目?0表示文gQ非0表示目录; target file/path 是指被链接的文g的文件名或者目录\? standard dest path 指快h式存攑֜那个目录下?/p>
ProcessorType = 2577
UnsupportedPlatforms = “Pocket PC“,"HPC","Jupiter","Palm PC2" <-不支持PPC和HPC{设?br>VersionMin = 3.00
VersionMax = 5.00
[SourceDisksNames]
1=, "SourceDisk01",,%CommonDir%
2=, "SourceDisk02",,%ExeBaseDir%\sp
[SourceDisksFiles]
"demo.htm" = 1
"demo.exe" = 2
"demo.dll" = 2
[/dest dest_directory]
[/err error_file]
[/cpu cpu_type [cpu_type]]
dest_directory – 生成的cab文g的存放\径,如不指定则生成在inf文g所在目?br>error_file – 错误报告文gQ将所有的执行信息都输出到该文件。不指定该参数时Q所有的错误信息都会用消息框来显C。该参数主要用于自动化构?br>cpu_type – 指定需要生成的CPUcdQ需要与inf文g中定义的CEDeviceD늚后缀一致。可以同时指定多个CPUcd制作自动安装执行文g
Version = 1.0 <- q个是CeAppMgrE序的版本号Q不是要安装的Y件的版本?不必修改
Component = Demo <- 软g的模?与下面的D늚名称一?br>
[Demo]
Description = Demo App For PPC <- 软g的描q?br>CabFiles = demo.arm.cab,demo.mips.cab,demo.sh3.cab <-列出需要所有的cab文gQ注意文件名之间不要有空?/p>
<-e eula.txt> <-o outputexe>
-l language 是指定安装过E中使用的语aQ暂时不支持中文Q所以我们选English
-i inifilename ini文g的全路径
-r readme.txt readme文g的全路径Q用于在安装q程中显C给用户
-e eula.txt最l用h权协议文件的全\径,用于安装q程中授权协议界面的昄
-o outputexe 生成的exe文g的名U?/p>
自动化构?/h2>
]]>
]]>
// MultiByteToWideChar和WideCharToMultiByte用法详解
//AUTHOR:
// norains
//DATE:
// W一?Monday 25-December -2006
// 增补?Wednesday 27-December -2006
// 修订?Wednesday 14-March-2007 (修正之前的错误例?
// 再次修订?Tuesday 18-September-2007 (修正代码的参数错?
//Environment:
// EVC4.0 + Standard SDK
//========================================================================
1.使用Ҏ详解
在本文开始之?先简要地说一下何为短字符和宽字符.
所谓的短字W?是?bit来表C的字符,典型的应用是ASCII?而宽字符,思义,是?6bit表示的字W?典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信?可以参考这两本l典著作:《windows E序设计?《windows 核心~程?q两本书关于q两U字W都有比较详l的解说.
宽字W{换ؓ多个短字W是一个难?不过我们只要掌握到其中的要领,便可如鱼得水.
好吧,那就让我们开始吧.
q个是我们需要{化的多字节字W串:
char sText[20] = {"多字节字W串!OK!"};
我们需要知道{化后的宽字符需要多个数组I间.虽然在这个里E里?我们可以直接定义一?0*2宽字W的数组,q且事实上将q行得非常轻松愉?但假如多字节字符串更?辑ֈ上千个乃至上万个,我们会发现其中费的内存将会越来越?所以以多字节字W的个数的两倍作为宽字符数组下标的声明绝对不是一个好L.
所q?我们能够知所需要的数组I间.
我们只需要将MultiByteToWideChar()的第四个形参设ؓ-1,卛_q回所需的短字符数组I间的个?
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
接下?我们只需要分配响应的数组I间:
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText)
{
delete []pwText;
}
接着,我们可以着手进行{换了.在这里以转换成ASCII码做Z?
MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);
最?使用完毕当然要记得释攑֍用的内存:
delete []pwText;
同理,宽字W{为多字节字符的代码如?
wchar_t wText[20] = {L"宽字W{换实?OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);
delete []psText;
如果之前我们已经分配好空?q且׃字符串较?可以不理会浪费的I间,仅仅只是想简单地短字符和宽字符怺转换,那有没有什么简便的Ҏ?
WIN32 API里没有符合这U要求的函数,但我们可以自p行封?
//-------------------------------------------------------------------------------------
//Description:
// This function maps a character string to a wide-character (Unicode) string
//
//Parameters:
// lpcszStr: [in] Pointer to the character string to be converted
// lpwszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
//---------------------------------------------------------------------------------------
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
{
// Get the required size of the buffer that receives the Unicode
// string.
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
if(dwSize < dwMinSize)
{
return FALSE;
}
// Convert headers from ASCII to Unicode.
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
return TRUE;
}
//-------------------------------------------------------------------------------------
//Description:
// This function maps a wide-character string to a new character string
//
//Parameters:
// lpcwszStr: [in] Pointer to the character string to be converted
// lpszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
//---------------------------------------------------------------------------------------
BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
{
DWORD dwMinSize;
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
if(dwSize < dwMinSize)
{
return FALSE;
}
WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
return TRUE;
}
使用Ҏ也很?CZ如下:
wchar_t wText[10] = {L"函数CZ"};
char sText[20]= {0};
WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));
q两个函数的~点在于无法动态分配内?在{换很长的字符串时可能会浪费较多内存空?优点?在不考虑费I间的情况下转换较短字符串非常方?
2.MultiByteToWideChar()函数q的问?br>
有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,q个函数都无法正常工?其{换之后的字符全是q.及时更改MultiByteToWideChar()参数也依然如?
不过q个不是代码问题,其结症在于所定制的操作系l?如果我们定制的操作系l默认语a不是中文,也会出现q种情况.׃标准的SDK默认语言?所以肯定会出现q个问题.而这个问题的解决,不能在简单地更改控制面板?区域选项"?默认语言",而是要在pȝ定制的时?选择默认语言?中文".
pȝ定制旉择默认语言的位|于:
Platform -> Setting... -> locale -> default language ,选择"中文",然后~译卛_.
摘自:
http://blog.csdn.net/norains/archive/2006/12/25/1461174.aspx
]]>
To test, I create a Swedish resource dll/mui file with one resource item changed.
I'm not really sure if the technique used in MuiHello can be appliced on MFC applications or not.
I have named the out put file for my dll project to MyApp.exe.04d1.mui and placed it in the exe directory of the application.
When I execute the application (MyApp.exe) in a Smartphone with user language set to Swedish, the swedish resource is not loaded.
Originally I made resource-only dlls with no entry point but as the sample MuiHello has an entry point I have also tried to add this.
I have also tried out the things found here, "Localized Resources in MFC Applications: Satellite DLLs"
but with no success.
I have tried out the following:
The result is the same, the Swedish resource is not loaded.
If I explicitly load the Swedish resource dll and use AfxSetResourceHandle it works, but that is not just good enough.
I have checked that the GetUserDefaultUILanguage() returns 0x04d1(Swedish)
Been stuck with this for two days now and getting really frustrated.
Does anyone know what I am doing wrong or how to do it in MFC?
Any pointers and directions are appreciated.
Cheers
Martin
"res%04x.dll"), langId);
andId != sysLangId)
嵌入式系l的设计是用一l物理硬件和软g来完成所需功能的过E,所以在一个嵌入式pȝ的设计过E中QY件设计和g设计是紧密结合、相互协调的。在设计Ӟ从系l功能的实现出发Q要把Yg同时考虑q去?/span>一个基?/span>Windows CE的嵌入式pȝ开发的主要内容有:
Q?/span>1Q设计系l硬件?/span>
Q?/span>2Q将Windows CE操作pȝUL到目标硬件^C?/span>
Q?/span>3Q徏立交叉调试通道Q编写和调试应用E序代码?br>
我们可以用下?/span>来描q具体的开发流E:
? ZWindows CE的嵌入式pȝ开发流E?/span>
ZWindows CE的Y件开发模式比较统一Q通常使用Platform Builder定制出针对特定硬件^台的操作pȝ映像文gNK.binQ?/span>Embedded VC++?/span>Visual Stidio.net开发上层的应用软g。嵌入式pȝ层Y件开发过E对应于Windows CE操作pȝ在目标硬件^C的移植和定制q程Q嵌入式应用层Y件的实现?/span>Windows CE应用E序的开发过E?br>
转自Q?a href="http://www.shnenglu.com/milkyway/archive/2008/10/28/65397.html">http://www.shnenglu.com/milkyway/archive/2008/10/28/65397.html
自己做mobile开发的Q对于wce不是很了解。收藏下来,学习学习?br>
蓝牙讑֤的三U状?br>enum BTH_RADIO_MODE {
BTH_POWER_OFF,
BTH_CONNECTABLE,
BTH_DISCOVERABLE
};
API介绍
BthGetMode
作用Q?br>This function is used to retrieve the current mode of operation of the Bluetooth radio.
原型Q?br>int BthGetMode(DWORD* pdwMode);
q回?/em>Q?br>Returns ERROR_SUCCESS on success or returns an error code on failure.
BthSetMode
作用Q?br>This function is used to set the Bluetooth mode of operation and reflect it in the control panel. This function is also used
to persist that state across hardware insertion and reboot.
原型Q?br>int BthSetMode(DWORD dwMode );
q回?/em>Q?br>Returns ERROR_SUCCESS on success or returns an error code on failure.
环境Q?br>OS Versions: Windows CE .NET 4.2 and later
Header: Declared in bthutil.h
Library: Use bthutil.lib
代码CZQ?/span> W一?/strong>Q?/p>
首先需要添加头文g和库文g W二?/strong>Q?/p>
获取蓝牙讑֤状?/p>
功能Q获取蓝牙设备状态,如果讑֤状态是关闭的,则将其设为可发现。设|是否成功,l出提示?/p>
#include <bthutil.h>
#pragma comment(lib, "bthutil.lib")
if (ERROR_SUCCESS == BthGetMode(&bthState))
{
if (bthState == BTH_POWER_OFF)
{
if (ERROR_SUCCESS == BthSetMode(BTH_DISCOVERABLE))
{
MessageBox(NULL, _T("success"), _T("Note"), MB_OK);
}
else
{
MessageBox(NULL, _T("failed"), _T("Note"), MB_OK);
}
}
}
讄蓝牙状态是在模拟器上进行的Q没有设|成功,q是׃模拟器上没有安装蓝牙讑֤造成的?br>
q需要l学习?br>
]]>