WinCE驅(qū)動(dòng)開(kāi)發(fā)問(wèn)題精華集錦-2
摘自:
http://hi.baidu.com/mcu%5Fspaces/blog/item/f14d1d2af1a2e33c5243c144.html21、 文件格式如下所示,我想把每行的4個(gè)值讀到4個(gè)變量中,用EVC如何編程? 第一行: 460.000, 3384672.357342, 521268.972763
第二行: 475.117, 3384663.772419, 521281.415271
偽代碼如下:
FILE *stream;
stream = _wfopen(L"\\a.txt", L"r+");
if( stream == NULL )
return;
fseek(stream, 0L, SEEK_SET );
while( !feof( stream ) )
{
fwscanf(stream, L"%s", WCHAR1);
fwscanf(stream, L"%f", float1);
fwscanf(stream, L"%f", float2);
fwscanf(stream, L"%f", float3);
}
fclose( stream );
22、GWES組件的功能有哪些? GWES不僅負(fù)責(zé)GDI、窗口、消息,還負(fù)責(zé)管理本機(jī)設(shè)備驅(qū)動(dòng)程序,負(fù)責(zé)加載顯示、鍵盤(pán)鼠標(biāo)、觸摸屏驅(qū)動(dòng)程序,而且GWES本身包含電源、LED驅(qū)動(dòng)程序。
23、如何在PB中預(yù)先設(shè)定好存儲(chǔ)內(nèi)存和程序內(nèi)存的大小,我想多劃分一些空間給程序內(nèi)存? 兩種辦法:
1)、在定制內(nèi)核時(shí)在config.bib文件中設(shè)置FSRAMPERCENT = number,具體number可參考標(biāo)題為“FSRAMPERCENT ”的幫助文檔。這種辦法是修改內(nèi)核的設(shè)置,所有一直有效。
2)、在應(yīng)用程序中調(diào)用API SetSystemMemoryDivision,如果函數(shù)返回SYSMEM_CHANGED表示成功,如果返回SYSMEM_MUSTREBOOT表示需要熱啟動(dòng)才能有效。這種辦法需要每次啟動(dòng)后調(diào)用API才有效。
24、 如何取消鼠標(biāo)光標(biāo)? 通過(guò)取消SYS變量來(lái)實(shí)現(xiàn)此目的,在PB命令行下鍵入“set SYSGEN_CURSOR=”,然后回車確認(rèn)。
25、EVC下調(diào)用TextOut如何編譯會(huì)出錯(cuò)? 類似這樣的問(wèn)題很多,這是因?yàn)镋VC的幫助文檔內(nèi)容有錯(cuò)誤。可能EVC的幫助文檔內(nèi)容是從桌面Windows幫助文檔復(fù)制過(guò)來(lái)的,所以很多API函數(shù)還有例子代碼都有錯(cuò)誤,例如幫助文檔中包含一個(gè)API函數(shù)的說(shuō)明,但是實(shí)際編譯的時(shí)候提示沒(méi)有這個(gè)API,有的例子代碼采用ANSI字符串,而WINCE的API都是寬字符版本,造成直接復(fù)制過(guò)來(lái)編譯失敗。
因?yàn)镸FC for WINCE的CDC類中沒(méi)有TextOut成員函數(shù),所以編譯會(huì)出錯(cuò),可以用其它類成員函數(shù)ExtTextOut或者DrawText替換。
26、我如何將我的dll軟件讓現(xiàn)有的ce系統(tǒng)認(rèn)可?盡管我也知道應(yīng)該使用signfile.exe程序進(jìn)行簽名,但是我并不知道那個(gè)ce系統(tǒng)認(rèn)可的簽名應(yīng)該是啥
如果你說(shuō)的WINCE系統(tǒng)內(nèi)核已經(jīng)加入了簽名認(rèn)證機(jī)制,那么沒(méi)有私鑰對(duì)你的DLL文件簽名肯定是無(wú)法運(yùn)行在此內(nèi)核中的,一般簽名密鑰的密鑰長(zhǎng)度都是1024位,很難破解。
27、如果查看WINCE注冊(cè)表中的內(nèi)容? 兩種辦法:
1)、建立同步后,用EVC自帶的工具“Remote Registry Editor”打開(kāi)查看。
2)、從網(wǎng)上下載注冊(cè)表查看工具,放到WINCE設(shè)備中。
28、調(diào)用directshow出現(xiàn)鏈接錯(cuò)誤,如何解決? player.obj : error LNK2001: unresolved external symbol _IID_IVideoWindow
player.obj : error LNK2001: unresolved external symbol _IID_IMediaControl
這是因?yàn)殒溄悠鳑](méi)有找到合適的.lib文件。兩種辦法:
1)、在EVC菜單Tools—options—directories 里把library files的路徑重新調(diào)整一下。如果你只安裝了EVC自帶的Standard SDK而沒(méi)有其它SDK,可以指定WINCE目錄中的.lib文件路徑,例如D:\WINCE500\PUBLIC\DIRECTX\OAK\LIB\X86\RETAIL。注意CPU的類型。
2)、安裝SDK,前提是導(dǎo)出SDK的PB內(nèi)核工程必須包括DirectShow或者其它組件。
29、在PB的config.bib文件中,“IMGFLASH”表示什么意思呢? 表示能夠刷NK到ROM中,具體請(qǐng)查看標(biāo)題為“IMG Environment Variables”的幫助文檔。
30、x86平臺(tái)如何映射各種地址空間?如何編寫(xiě)中斷服務(wù)例程? 如果是x86平臺(tái),可以調(diào)用HalTranslateBusAddress轉(zhuǎn)換物理總線地址到物理系統(tǒng)地址,調(diào)用HalTranslateSystemAddress轉(zhuǎn)換物理系統(tǒng)地址到邏輯總線地址,也可以不調(diào)用這兩個(gè)函數(shù),因?yàn)閤86平臺(tái)除32位物理地址外還有16位的IO地址空間,對(duì)于16位的IO地址空間,可以直接調(diào)用WRITE_PORT_UCHAR或者READ_PORT_UCHAR等函數(shù)直接讀寫(xiě)端口。對(duì)于32位物理地址可以調(diào)用VirtualAlloc和VirtualCopy來(lái)映射。這樣做思路清晰,簡(jiǎn)單明了。
在x86平臺(tái)要實(shí)現(xiàn)ISR,有如下幾個(gè)步驟(以Geode BSP為例):
1)、用SETUP_INTERRUPT_MAP宏關(guān)聯(lián)SYSINTR和IRQ。以“SYSINTR_”為前綴的常量由內(nèi)核使用,用于唯一標(biāo)識(shí)發(fā)生中斷的硬件,又稱為中斷ID。在Nkintr.h文件中預(yù)定義了一些SYSINTR,OEM可以在Oalintr.h文件中自定義SYSINTR。
2)、用HookInterrupt函數(shù)關(guān)聯(lián)硬件中斷號(hào)和ISR。這里提到的硬件中斷號(hào)為物理中斷號(hào),IRQ為邏輯中斷號(hào)。在InitPICs函數(shù)的最后調(diào)用了HookInterrupt函數(shù),如下:
for (i = 64; i < 80; i++)
HookInterrupt(i, (void *)PeRPISR); ///用ISR關(guān)聯(lián)16個(gè)中斷號(hào)
3)、調(diào)用InterruptInitialize函數(shù)關(guān)聯(lián)SYSINTR和IST創(chuàng)建的事件對(duì)象,也是IST等待的事件對(duì)象。詳細(xì)內(nèi)容請(qǐng)參考Geode BSP源碼。
在x86平臺(tái)要實(shí)現(xiàn)可安裝ISR,先調(diào)用LoadIntChainHandler函數(shù)注冊(cè)在注冊(cè)表中指定的ISR DLL,然后填充GIISR_INFO結(jié)構(gòu)體并調(diào)用KernelLibIoControl函數(shù)將此結(jié)構(gòu)體傳遞給可安裝ISR。詳細(xì)內(nèi)容請(qǐng)參考WINCE幫助文檔或者我著的《Windows CE下驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)》。
31、修改了WINCE自帶的驅(qū)動(dòng)程序后如何編譯?如果是自己開(kāi)發(fā)的驅(qū)動(dòng)程序如何編譯?
1)、分為IDE方式和命令行方式。
IDE方式的編譯很簡(jiǎn)單,以PB5.0為例,打開(kāi)定制內(nèi)核的工程,在左邊的“workspace”—“FileView”中找到你已經(jīng)修改了的目錄,然后單擊右鍵彈出菜單,在菜單中選擇“Build and Sysgen Current Project”,這樣PB就會(huì)編譯指定的目錄中的項(xiàng)目源碼文件,然后執(zhí)行sysgen命令根據(jù)source文件中的內(nèi)容生成目標(biāo)文件并復(fù)制到當(dāng)前內(nèi)核工程目錄下。
命令行方式的編譯需要打開(kāi)“Build OS”—“Open Release Directory”,以cd命令進(jìn)入你已經(jīng)修改的驅(qū)動(dòng)程序目錄中,然后鍵入“build –cfs”,然后鍵入“sysgen –p 項(xiàng)目名稱”,一般項(xiàng)目名稱為source文件中的“TARGETNAME”。
2)、如果想完全自己開(kāi)發(fā)驅(qū)動(dòng)程序,建議直接采用EVC或者PB來(lái)編寫(xiě)編譯。
32、開(kāi)發(fā)PCI設(shè)備驅(qū)動(dòng)時(shí),InterruptInitialize函數(shù)的第一參數(shù)是否是PCI卡配置空間信息中的InterruptLine 參數(shù)?是否需要在HKLM\Drivers\BuiltIn\PCI\Template 加一個(gè)自己的 subkey,并填寫(xiě)相應(yīng)內(nèi)容?如何填? 1)、InterruptInitialize的第一參數(shù)是IRQ,也就是邏輯中斷號(hào),而不是物理中斷號(hào),InterruptLine是指物理中斷號(hào)
2)、需要在template下加自己的PCI設(shè)備的信息,例如:
[HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial]
"Dll"="Com16550.Dll"
"Class"=dword:07
"SubClass"=dword:00
"ProgIF"=dword:02
"VendorID"=multi_sz:"0AF0","B320","B320"
"DeviceID"=multi_sz:"0020","0300","0302"
"Prefix"="COM"
而這些信息就來(lái)自于你執(zhí)行pcienum.exe的結(jié)果。
33、編譯器報(bào)錯(cuò):error C2065: 'CFileFind' : undeclared identifier,如何解決? MFC for WINCE版本沒(méi)有CFileFind類,所以要查找文件只能調(diào)用API FindFirstFile 和FindNextFile。
34、如何設(shè)置WINCE系統(tǒng)字體、字號(hào)?如何設(shè)置自己開(kāi)發(fā)的軟件的字體、字號(hào)? 1)、系統(tǒng)字體通過(guò)注冊(cè)表設(shè)置。如下:
[HKEY_LOCAL_MACHINE\System\GDI\SysFnt] ///系統(tǒng)字體
Wt=420
Ht=18
Nm=Arial
[HKEY_LOCAL_MACHINE\System\GWE\Menu\BarFnt] ///菜單欄字體
[HKEY_LOCAL_MACHINE\System\GWE\Menu\PopFnt] ///彈出窗口字體
[HKEY_LOCAL_MACHINE\System\GWE\Menu] ///菜單字體
HKEY_LOCAL_MACHINE\System\GWE\Button ///按鈕字體
2)、創(chuàng)建字體時(shí)把字體高度參數(shù)設(shè)置大點(diǎn)就可以了。如CFont::CreateFont(nHeight,...),也可以在LOGFONT結(jié)構(gòu)中設(shè)置字體高度或者字體種類。如果是控件,調(diào)用控件的SetFont成員函數(shù)。如果是直接畫(huà),在OnPaint響應(yīng)函數(shù)中調(diào)用SelectObject選字體到DC。
35、 nk.bin和nk.nb0有什么區(qū)別? 這里提到的bin是一種二進(jìn)制鏡像格式,以片斷(section)為單位組織數(shù)據(jù),每個(gè)片斷都包括一個(gè)頭,頭里指定了起始地址,長(zhǎng)度,校驗(yàn)值。Platform Builder調(diào)用工具將WINCE內(nèi)核所有文件以bin格式合并成一個(gè)文件,默認(rèn)文件名為nk.bin。BootLoader又以同樣的格式將nk.bin分解成多個(gè)文件放到RAM中。可以在命令行中鍵入“viewbin nk.bin”來(lái)查看bin文件中具體包括了哪些內(nèi)容。鍵入Cvrtbin命令轉(zhuǎn)換.bin格式文件為.sre格式或者.abx格式。
nb0格式是原始的二進(jìn)制鏡像,它不包括頭,一般情況下將內(nèi)核下載到設(shè)備的RAM中運(yùn)行都采用nb0格式。要生成nbx格式的文件,需要在相關(guān).bib文件中確定如下值:ROMSTART、ROMWIDTH、ROMSIZE。
36、在不采用硬件計(jì)時(shí)器的情況下如何創(chuàng)建更精確的計(jì)時(shí)器?最精確周期能否達(dá)到1毫秒?
對(duì)于精確值的要求不同,所采用的辦法不同。以下闡述幾種辦法。
1)、在單線程中循環(huán)調(diào)用API Sleep函數(shù),Sleep函數(shù)精確程度為如果Sleep(N),那么實(shí)際睡眠時(shí)間在N到N+1毫秒之間。而且還要注意調(diào)用Sleep的線程優(yōu)先級(jí)的問(wèn)題。如果任務(wù)過(guò)多并且此線程優(yōu)先級(jí)低,那誤差就更大些。
2)、調(diào)用API QueryPerformanceCounter函數(shù),舉例如下:
LARGE_INTEGER liFrequency;
if (QueryPerformanceFrequency(&liFrequency)) // 查詢系統(tǒng)時(shí)鐘的頻率,這里將返回1000
{
liFrequency.QuadPart /= 1000;
LARGE_INTEGER liTimeOut;
if (QueryPerformanceCounter(&liTimeOut)) //得到截至到當(dāng)前累計(jì)發(fā)生的系統(tǒng)時(shí)鐘中斷次數(shù)
{
liTimeOut.QuadPart += liFrequency.QuadPart; ///計(jì)算下一秒到來(lái)時(shí)總的中斷次數(shù)是多少
LARGE_INTEGER liCurrent;
do
{
QueryPerformanceCounter(&liCurrent); // 循環(huán)查詢累計(jì)的的中斷次數(shù)
} while (liCurrent.QuadPart < liTimeOut.QuadPart); ///到達(dá)下一秒
}
}
調(diào)用QueryPerformanceCounter同調(diào)用Sleep在本質(zhì)上都是一樣的,都是在單線程中無(wú)限循環(huán)等到周期一到執(zhí)行任務(wù),相比較QueryPerformanceCounter要比Sleep更精確些,越精確就越要求線程的優(yōu)先級(jí),保障線程能夠正常得到處理器。
3)、以上辦法難以保證周期精確到1毫秒并且WINCE系統(tǒng)穩(wěn)定地運(yùn)行,所以要從中斷入手。以x86平臺(tái)為例,先在Timer.c中將默認(rèn)的SetTimer0(TIMER_COUNT)中的TIMER_COUNT /=2,SetTimer0函數(shù)負(fù)責(zé)設(shè)置系統(tǒng)時(shí)鐘的頻率,默認(rèn)1毫秒發(fā)生一次中斷,如果除以2就是0.5毫秒發(fā)生一次中斷。然后在fwpc.c文件中修改ISR函數(shù)PeRPISR,因?yàn)樵瓉?lái)默認(rèn)是1毫秒發(fā)生一次中斷,在處理INTR_TIMER0時(shí)系統(tǒng)負(fù)責(zé)累計(jì)計(jì)數(shù)、管理線程的調(diào)度,返回相應(yīng)的SYSINTR值,而我們沒(méi)有辦法再添加代碼返回自己定義的SYSINTR值,所以現(xiàn)在要修改原來(lái)的處理代碼,例如設(shè)置一個(gè)BOOL型變量,TRUE就執(zhí)行原來(lái)默認(rèn)的代碼,而FALSE就返回我們自己定義的SYSINTR值,這樣即不影響原來(lái)的ISR處理,又加入了我們的中斷響應(yīng)代碼。ISR返回我們定義的SYSINTR后WINCE內(nèi)核激活相對(duì)應(yīng)的EVENT事件,我們就可以在我們編寫(xiě)的IST里處理任務(wù)了。
37、flash中存放了BootLoader和內(nèi)核鏡像,如何把剩余flash部分劃分為一個(gè)存儲(chǔ)區(qū)域供應(yīng)用程序讀寫(xiě)?
以WINCE提供的驅(qū)動(dòng)(FAT文件系統(tǒng)和MSFLASH驅(qū)動(dòng))來(lái)舉例說(shuō)明。如果采用默認(rèn)common.reg中的注冊(cè)表設(shè)置,那么MSFLASH驅(qū)動(dòng)默認(rèn)把整個(gè)flash作為存儲(chǔ)區(qū)域來(lái)讀寫(xiě),這不符合問(wèn)題的要求,所以必須告訴MSFLASH驅(qū)動(dòng)程序可供讀寫(xiě)的區(qū)域的起始地址和長(zhǎng)度。以下是一個(gè)注冊(cè)表例子:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FASLD]
"Dll"="fasld.dll" ///實(shí)際Flash存儲(chǔ)器的驅(qū)動(dòng)程序
"Order"=dword:2 ///該驅(qū)動(dòng)程序相對(duì)于其它驅(qū)動(dòng)程序的加載順序
"Prefix"="DSK" ///前綴
"Ioctl"=dword:4 ///IOCTL碼,設(shè)備管理器加載驅(qū)動(dòng)的時(shí)候調(diào)用IOControl函數(shù),傳遞這個(gè)IOCTL碼。
"Profile"="MSFlash" ///Profile名稱,也就是[HLM\System\StorageManager\Profiles\MSFlash]
///當(dāng)設(shè)備管理器加載此驅(qū)動(dòng)程序的同時(shí)發(fā)送通知給系統(tǒng),IClass(GUID)的值表明這是一個(gè)存儲(chǔ)設(shè)備的驅(qū)動(dòng)程序。
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
"MemBase"=dword:00000000 ///Flash中可供讀寫(xiě)區(qū)域的起始物理地址,也就是Flash的首地址+偏移量
"MemLen"=dword:00000000 ///Flash中可供讀寫(xiě)區(qū)域的長(zhǎng)度
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]
"DefaultFileSystem"="FATFS" ///MSFlash驅(qū)動(dòng)默認(rèn)采用的文件系統(tǒng)
"PartitionDriver"="mspart.dll" ///采用的分區(qū)驅(qū)動(dòng)程序
"MountAsRoot"=dword:1 ///此目錄作為文件系統(tǒng)的根目錄
"Folder"="NOR Flash" ///目錄名稱
"Name"="FLASH Disk Block Device" ///Flash驅(qū)動(dòng)名稱
"PartitionDriverName"="MSPART" ///分區(qū)驅(qū)動(dòng)名稱
"AutoMount"=dword:1 ///自動(dòng)裝載檢測(cè)到的分區(qū)
"AutoPart"=dword:1 ///自動(dòng)分區(qū)
"AutoFormat"=dword:1 ///自動(dòng)格式化分區(qū)
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\MSFlash]
"DriverPath"="Drivers\\BuiltIn\\FASLD" ///Flash驅(qū)動(dòng)在注冊(cè)表中的位置
"LoadFlags"=dword:1 ///這個(gè)值可以被設(shè)置為0、1、2。1表示同步加載,其它表示異步加載
"Order"=dword:0
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
"FriendlyName"="FAT FileSystem" ///文件系統(tǒng)名稱
"Dll"="fatfsd.dll" ///文件系統(tǒng)驅(qū)動(dòng)程序
"Flags"=dword:00000064 ///標(biāo)志,詳見(jiàn)幫助文檔
"Paging"=dword:1 ///是否分頁(yè)
"EnableCache"=dword:1 ///是否允許緩存數(shù)據(jù)
"CacheSize"=dword:0 ///指定緩存大小,0表示默認(rèn)
38、驅(qū)動(dòng)程序如何發(fā)通知給應(yīng)用程序? 這里介紹一下常見(jiàn)的兩種辦法。
1)、驅(qū)動(dòng)程序調(diào)用API SendNotifyMessage,發(fā)送特定的消息給應(yīng)用程序,這就要求應(yīng)用程序要有消息循環(huán)機(jī)制并且要事先做好消息的處理。參數(shù)1為窗口句柄,可以設(shè)置HWND_BROADCAST表示廣播消息。要注意的是不要在參數(shù)中傳遞指針(虛擬地址),因?yàn)閳?zhí)行驅(qū)動(dòng)程序的線程和應(yīng)用程序并不在同一個(gè)進(jìn)程空間中。解決辦法可以利用內(nèi)存映射文件技術(shù),比如在驅(qū)動(dòng)程序中創(chuàng)建一個(gè)內(nèi)存映射文件對(duì)象,申請(qǐng)一塊物理內(nèi)存,然后把對(duì)象名稱和內(nèi)存長(zhǎng)度傳遞給應(yīng)用程序,應(yīng)用程序打開(kāi)同名的內(nèi)存映射文件對(duì)象,讀取里面的數(shù)據(jù)。對(duì)象名稱可以事先協(xié)定好,也可以通過(guò)注冊(cè)表來(lái)傳遞,內(nèi)存長(zhǎng)度是32位值,通過(guò)消息參數(shù)就可以傳遞,也可以通過(guò)注冊(cè)表來(lái)傳遞。另外一種解決辦法是在定制內(nèi)核時(shí)候預(yù)留一塊物理內(nèi)存,這樣驅(qū)動(dòng)程序和應(yīng)用程序都可以通過(guò)VirtualAlloc和VirtualCopy來(lái)映射到同一塊物理內(nèi)存,其原理同內(nèi)存映射文件技術(shù)一樣,但是這塊物理內(nèi)存不具備通用性。最后一個(gè)辦法是應(yīng)用程序事先將一個(gè)緩沖區(qū)地址傳遞給驅(qū)動(dòng)程序,驅(qū)動(dòng)程序調(diào)用MapPtrToProcess映射應(yīng)用程序傳遞過(guò)來(lái)的地址,當(dāng)驅(qū)動(dòng)程序調(diào)用SendNotifyMessage后應(yīng)用程序可以直接到該地址中讀取數(shù)據(jù)。
設(shè)備管理器就是調(diào)用此函數(shù)廣播WM_DEVICECHANGE消息的。另外WINCE的一個(gè)例子程序RNAApp在撥號(hào)連接建立的時(shí)候也是調(diào)用這個(gè)函數(shù)廣播WM_NETCONNECT消息的。
2)、驅(qū)動(dòng)程序調(diào)用API CeEventHasOccurred指明一個(gè)事件A發(fā)生,在此之前應(yīng)用程序調(diào)用API CeRunAppAtEvent將驅(qū)動(dòng)程序指明的A事件和一個(gè)應(yīng)用程序名稱相關(guān)聯(lián),或者和一個(gè)事件B相關(guān)聯(lián)。這樣當(dāng)A事件發(fā)生時(shí),如果指明和一個(gè)應(yīng)用程序名稱關(guān)聯(lián),那這個(gè)應(yīng)用程序就會(huì)被啟動(dòng)。如果指明了和一個(gè)事件B相關(guān)聯(lián),那么等待事件B的線程將被激活。如果想了解當(dāng)前系統(tǒng)內(nèi)部所有驅(qū)動(dòng)程序支持哪些類似事件A的事件,調(diào)用API CeNotifyPublic_FilterEvent,在該API的幫助文檔里也列舉了常見(jiàn)的事件,例如NOTIFICATION_EVENT_NET_CONNECT和 NOTIFICATION_EVENT_NET_DISCONNECT。
40、 EVC創(chuàng)建的工程名稱如果用中文就出錯(cuò),該怎么辦? 用EVC創(chuàng)建的工程名稱如果為中文將導(dǎo)致資源文件打不開(kāi)和編譯出錯(cuò),可以改資源文件名稱為英文,再編輯.rc文件中的資源文件名稱。但建議盡量不要用中文為工程名稱。
作為習(xí)慣,應(yīng)該在EVC創(chuàng)建一個(gè)工程后,立刻在“project”—“settings”中設(shè)置資源的語(yǔ)言屬性,然后在“resource view”中設(shè)置每個(gè)資源的語(yǔ)言屬性,這些工作做完后再修改資源就沒(méi)有問(wèn)題了。有人詢問(wèn)對(duì)話框的標(biāo)題為亂碼,其原因就是在沒(méi)有修改語(yǔ)言屬性的情況下設(shè)置標(biāo)題為中文。
posted on 2009-07-16 15:41
Sandy 閱讀(735)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Windows Mobile