原創(chuàng)|其它|編輯:郝浩|2009-06-15 17:10:55.000|閱讀 962 次
概述:這個(gè)系列文章更多是針對初學(xué)者,宗旨是幫助初學(xué)者解決常見的應(yīng)用開發(fā)問題。讓文章有質(zhì)量其實(shí)不是一件容易的事,至少得邊研究邊寫作——寫入門的也是
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
這個(gè)系列文章更多是針對初學(xué)者,宗旨是幫助初學(xué)者解決常見的應(yīng)用開發(fā)問題。讓文章有質(zhì)量其實(shí)不是一件容易的事,至少得邊研究邊寫作——寫入門的也是,希望我的努力能對得起讀者。后面的內(nèi)容我會繼續(xù)更新。
怎樣提高解決問題的能力
------------------------------------------------------------------------------------------------------
解決問題的過程其實(shí)就是挑戰(zhàn)自我的過程。你解決了你當(dāng)前遇到的問題,你即超越了原來的你。 解決問題,超越自我的過程可能是痛苦的過程,但是成功時(shí)帶來的喜悅和成就會帶給你更多的滿足。所以不要怕遇到問題。
那么當(dāng)我們遇到問題時(shí),怎樣解決它?其實(shí)概括的說就兩種方法,一個(gè)是從深度方面,一個(gè)是從廣度方面。深度有助你看到問題的本質(zhì),廣度有助你換另一種思維。比如仿生學(xué),借助生物系統(tǒng)的結(jié)構(gòu)和性質(zhì)提供新的設(shè)計(jì)思想和原理。
也行你會遇到像熊力老師遇到那些莫名其妙的問題(見《Windows用戶態(tài)程序高效排錯(cuò)》),我們大多數(shù)在工作中很少會遇到有非常挑戰(zhàn)性的難題。我們遇到的大多數(shù)問題其實(shí)只要稍微深入一下就能解決。作為剛做技術(shù)的初學(xué)者,總結(jié)和積累每一個(gè)遇到的問題的解決思路,把這些思路轉(zhuǎn)化成能力,將會讓你受益匪淺。所以一遇到問題就問人并不是好習(xí)慣,也許你收獲了一點(diǎn)知識,但你沒有收獲解決問題的能力。
解決問題不光靠知識,還要靠能力。關(guān)于知識和能力論述很有意思:“所謂知識能力,是指知識、智能、技能和實(shí)踐及創(chuàng)新能力等。知識是人的的體現(xiàn)和結(jié)果,智能是為智慧的能力,技能是智慧在實(shí)際工作中的一種,實(shí)踐及創(chuàng)新能力是以知識、智能、技能為基礎(chǔ)的改造世界(對象)的能力。”
------------------------------------------------------------------------------------------------------
編寫控制面板程序
------------------------------------------------------------------------------------------------------
控制面板應(yīng)用程序是一個(gè)以cpl為后綴的文件(把項(xiàng)目生成的dll文件后綴改為cpl,或者從VS中修改配置直接生產(chǎn)cpl文件)。cpl文件中的回調(diào)函數(shù)CPlApplet為ctlpnl.exe進(jìn)程進(jìn)入你的cpl的入口點(diǎn)(需要導(dǎo)出,不管你在def文件里面,還是在函數(shù)前制定dllexport屬性),一個(gè)cpl可以支持多個(gè)applets,見下面的代碼中的注釋。
LONG CPlApplet( HWND hwndCPl, //Handle to the main window of the controlling application. UINT msg, //Message being sent to the Control Panel application. LPARAM lParam1, LPARAM lParam2 );
msg有:
CPL_INIT
初始化,控制面板應(yīng)用程序此時(shí)做一些全局的初始化工作,如內(nèi)存分配。
CPL_GETCOUNT
獲取控制面板應(yīng)用程序支持的dialog boxes個(gè)數(shù)。
CPL_NEWINQUIRE
查詢控制面板應(yīng)用程序的dialog boxes的信息,信息包含在lParam2參數(shù)中,使用(LPNEWCPLINFO) lParam2獲得指針。
typedef struct tagNEWCPLINFO { DWORD dwSize; DWORD dwFlags; DWORD dwHelpContext; LONG lData; HICON hIcon; //Handle to the icon that represents the dialog box. TCHAR szName[32]; //The name is intended to be displayed below the icon. TCHAR szInfo[64]; //The description is intended to be displayed when the icon for the dialog
box is selected. TCHAR szHelpFile[128]; //忽略。要想使用幫助,處理WM_NOTIFY消息,然后取
得“lppsn = (LPPSHNOTIFY) lParam;”判斷是否等于PSN_HELP,如果是即可調(diào)出幫助文檔。 } NEWCPLINFO;
CPL_IDNAME
獲得控制面板應(yīng)用程序的名稱,通過設(shè)置注冊表鍵值[HKEY_LOCAL_MACHINE\ControlPanel\<ID name>]
可以改變應(yīng)用位于控制面板屬性頁的位置,主鍵值"Group"默認(rèn)為dword類型1,也就是說當(dāng)你不指定位置時(shí),默認(rèn)放在系統(tǒng)這個(gè)tab中。另外還有如下值可以選擇:
Personal
0
1 (default value) System
2 Connections
CPL_DBLCLK
當(dāng)用戶雙擊控制面板上的icon時(shí),系統(tǒng)會發(fā)送這個(gè)消息給你的控制面部應(yīng)用程序,此時(shí)你可以彈出一個(gè)dialog box。處理完這個(gè)消息之后返回0表示你成功處理這個(gè)消息了(其它消息也一樣),非0表示其它。
CPL_STOP
關(guān)閉控制面部應(yīng)用程序之前那一刻發(fā)送這個(gè)消息給你的控制面板應(yīng)用程序。
CPL_EXIT
釋放DLL文件之前那一刻發(fā)送這個(gè)消息給你的控制面板應(yīng)用程序。
//////////////////////////////////////////////////////// // This is the entry point called by ctlpnl.exe // //////////////////////////////////////////////////////// extern "C" __declspec(dllexport) LONG WINAPI CPlApplet(HWND hwndCPL, UINT uMsg, LONG lParam1, LONG lParam2) { static int iInitCount = 0; int iApplet; switch (uMsg) { // First message sent. It is sent only once to // allow the dll to initialize it's applet(s) case CPL_INIT: if (!iInitCount) { if (!InitApplet(hwndCPL)) return FALSE; } iInitCount++; return TRUE; // Second message sent. Return the count of applets supported // by this dll case CPL_GETCOUNT: // Return the number of applets we support return (LONG)((sizeof(SystemApplets))/(sizeof(SystemApplets[0]))); // Third message sent. Sent once for each applet supported by this dll. // The lParam1 contains the number that indicates which applet this is // for, from 0 to 1 less than the count of applets. // lParam2 is a NEWCPLINFO that should be filled with information about // this applet before returning case CPL_NEWINQUIRE: { LPNEWCPLINFO lpNewCPlInfo; lpNewCPlInfo = (LPNEWCPLINFO)lParam2; iApplet = (int)lParam1; lpNewCPlInfo->dwSize = (DWORD)sizeof(NEWCPLINFO); lpNewCPlInfo->dwFlags = 0; lpNewCPlInfo->dwHelpContext = 0; lpNewCPlInfo->lData = SystemApplets[iApplet].icon; lpNewCPlInfo->hIcon =
LoadIcon(g_hInstance,
(LPCTSTR)MAKEINTRESOURCE(SystemApplets[iApplet].icon)); lpNewCPlInfo->szHelpFile[0] = '\0'; LoadString(g_hInstance,SystemApplets[iApplet].namestring,
lpNewCPlInfo->szName,32); LoadString(g_hInstance,SystemApplets[iApplet].descstring,
lpNewCPlInfo->szInfo,64); } break; // This is sent whenever the user clicks an icon in Settings for one of // the applets supported by this dll. lParam1 contains the number indicating // which applet. Return 0 if applet successfully launched, non-zero otherwise case CPL_DBLCLK: iApplet = (UINT)lParam1; if (!CreatePropertySheet(hwndCPL,iApplet)) return 1; break; // Sent once per applet, before CPL_EXIT case CPL_STOP: break; // Sent once before the dll is unloaded case CPL_EXIT: iInitCount--; if (!iInitCount) TermApplet(); break; default: break; } return 0; }
更詳細(xì)的代碼請見例子\Samples\PocketPC\CPP\win32\myBackLight,或者點(diǎn)下載。
關(guān)于任何調(diào)試cpl代碼,請參照下面的文章。
------------------------------------------------------------------------------------------------------
智能設(shè)備安裝包制作過程
------------------------------------------------------------------------------------------------------
首先新建一個(gè)Win32項(xiàng)目,想把一個(gè)EXE文件打包,DLL文件、或者空文件(比如僅僅想修改目標(biāo)設(shè)備的注冊表)打包過程都是一樣的:
現(xiàn)在在原來的項(xiàng)目上添加一個(gè)智能設(shè)備CAB項(xiàng)目:
文件系統(tǒng)中選擇需要將你的EXE或者DLL文件放到目標(biāo)設(shè)備的哪個(gè)文件夾上。如果需要在目標(biāo)設(shè)備“Program Files”文件夾上再新建個(gè)文件夾,則在“Program Files”上右擊添加文件夾:
這里我們想把項(xiàng)目生成的EXE程序放到Windows文件夾上,則刪除“Program Files文件夾”,新建個(gè)“Windows文件夾”,并在上面添加項(xiàng)目輸出:
我們現(xiàn)在不光要把EXE文件添加到目標(biāo)設(shè)備,還要修改目標(biāo)設(shè)備的注冊表,現(xiàn)在先切換到注冊表試圖:
可以新建,可以導(dǎo)入(導(dǎo)入現(xiàn)有的REG文件,一般是從模擬器中的注冊表保存得到的):
我常習(xí)慣直接修改CAB的項(xiàng)目配置文件,此處注意這個(gè)文件只支持ASCII碼,當(dāng)里面有漢字時(shí)(當(dāng)你的機(jī)器名是中文時(shí),或者前面的添加注冊表鍵值時(shí)可能造成),編譯時(shí)會出錯(cuò),提示Unicode轉(zhuǎn)換ASCII碼錯(cuò)誤:
這里就是從注冊表試圖中添加的配置信息:
OK,下面點(diǎn)擊生成吧。在開發(fā)中,如果我們想看DLL運(yùn)行時(shí)的效果時(shí),常常需要這樣制作CAB包。
下面介紹的是如何在“程序”中添加快捷方式:
將\windows\start menu\programs下的一個(gè)快捷方式拷貝到PC上修改成:21#MyApplication.exe,修改完畢后,保存,并把此快捷方式改名,拷貝到手機(jī)的\windows\start menu(“開始”菜單)\programs(程序)目錄下。將MyApplication.exe拷貝到Windows目錄下,此時(shí)你就會發(fā)現(xiàn)Program下有你的應(yīng)用程序了。這些操作可以使用上面介紹的CAB包實(shí)現(xiàn)。
------------------------------------------------------------------------------------------------------
以下文章還不完善,今天太累了,等我修改好了再發(fā)布,并且我會在下面更新鏈接。
一個(gè)簡單的Win32應(yīng)用程序詳解
------------------------------------------------------------------------------------------------------
說簡單并不簡單,如果要能非常清楚一個(gè)看似簡單的Win32程序,其實(shí)你需要深入操作系統(tǒng)內(nèi)部。
------------------------------------------------------------------------------------------------------
編寫服務(wù)程序
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
編譯、鏈接、部署和調(diào)試程序
------------------------------------------------------------------------------------------------------
(PC-Lint的使用;鏈接錯(cuò)誤解決方法;vcproj等文件的作用,以及修改;斷點(diǎn)的使用;DLL文件的調(diào)試等內(nèi)容)
------------------------------------------------------------------------------------------------------
Visual Studio以及相關(guān)工具的使用
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
內(nèi)存泄露檢查和定位
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園