原創|其它|編輯:郝浩|2009-06-15 17:10:55.000|閱讀 962 次
概述:這個系列文章更多是針對初學者,宗旨是幫助初學者解決常見的應用開發問題。讓文章有質量其實不是一件容易的事,至少得邊研究邊寫作——寫入門的也是
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
這個系列文章更多是針對初學者,宗旨是幫助初學者解決常見的應用開發問題。讓文章有質量其實不是一件容易的事,至少得邊研究邊寫作——寫入門的也是,希望我的努力能對得起讀者。后面的內容我會繼續更新。
怎樣提高解決問題的能力
------------------------------------------------------------------------------------------------------
解決問題的過程其實就是挑戰自我的過程。你解決了你當前遇到的問題,你即超越了原來的你。 解決問題,超越自我的過程可能是痛苦的過程,但是成功時帶來的喜悅和成就會帶給你更多的滿足。所以不要怕遇到問題。
那么當我們遇到問題時,怎樣解決它?其實概括的說就兩種方法,一個是從深度方面,一個是從廣度方面。深度有助你看到問題的本質,廣度有助你換另一種思維。比如仿生學,借助生物系統的結構和性質提供新的設計思想和原理。
也行你會遇到像熊力老師遇到那些莫名其妙的問題(見《Windows用戶態程序高效排錯》),我們大多數在工作中很少會遇到有非常挑戰性的難題。我們遇到的大多數問題其實只要稍微深入一下就能解決。作為剛做技術的初學者,總結和積累每一個遇到的問題的解決思路,把這些思路轉化成能力,將會讓你受益匪淺。所以一遇到問題就問人并不是好習慣,也許你收獲了一點知識,但你沒有收獲解決問題的能力。
解決問題不光靠知識,還要靠能力。關于知識和能力論述很有意思:“所謂知識能力,是指知識、智能、技能和實踐及創新能力等。知識是人的的體現和結果,智能是為智慧的能力,技能是智慧在實際工作中的一種,實踐及創新能力是以知識、智能、技能為基礎的改造世界(對象)的能力。”
------------------------------------------------------------------------------------------------------
編寫控制面板程序
------------------------------------------------------------------------------------------------------
控制面板應用程序是一個以cpl為后綴的文件(把項目生成的dll文件后綴改為cpl,或者從VS中修改配置直接生產cpl文件)。cpl文件中的回調函數CPlApplet為ctlpnl.exe進程進入你的cpl的入口點(需要導出,不管你在def文件里面,還是在函數前制定dllexport屬性),一個cpl可以支持多個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
初始化,控制面板應用程序此時做一些全局的初始化工作,如內存分配。
CPL_GETCOUNT
獲取控制面板應用程序支持的dialog boxes個數。
CPL_NEWINQUIRE
查詢控制面板應用程序的dialog boxes的信息,信息包含在lParam2參數中,使用(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,如果是即可調出幫助文檔。 } NEWCPLINFO;
CPL_IDNAME
獲得控制面板應用程序的名稱,通過設置注冊表鍵值[HKEY_LOCAL_MACHINE\ControlPanel\<ID name>]
可以改變應用位于控制面板屬性頁的位置,主鍵值"Group"默認為dword類型1,也就是說當你不指定位置時,默認放在系統這個tab中。另外還有如下值可以選擇:
Personal
0
1 (default value) System
2 Connections
CPL_DBLCLK
當用戶雙擊控制面板上的icon時,系統會發送這個消息給你的控制面部應用程序,此時你可以彈出一個dialog box。處理完這個消息之后返回0表示你成功處理這個消息了(其它消息也一樣),非0表示其它。
CPL_STOP
關閉控制面部應用程序之前那一刻發送這個消息給你的控制面板應用程序。
CPL_EXIT
釋放DLL文件之前那一刻發送這個消息給你的控制面板應用程序。
//////////////////////////////////////////////////////// // 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; }
更詳細的代碼請見例子\Samples\PocketPC\CPP\win32\myBackLight,或者點下載。
關于任何調試cpl代碼,請參照下面的文章。
------------------------------------------------------------------------------------------------------
智能設備安裝包制作過程
------------------------------------------------------------------------------------------------------
首先新建一個Win32項目,想把一個EXE文件打包,DLL文件、或者空文件(比如僅僅想修改目標設備的注冊表)打包過程都是一樣的:
現在在原來的項目上添加一個智能設備CAB項目:
文件系統中選擇需要將你的EXE或者DLL文件放到目標設備的哪個文件夾上。如果需要在目標設備“Program Files”文件夾上再新建個文件夾,則在“Program Files”上右擊添加文件夾:
這里我們想把項目生成的EXE程序放到Windows文件夾上,則刪除“Program Files文件夾”,新建個“Windows文件夾”,并在上面添加項目輸出:
我們現在不光要把EXE文件添加到目標設備,還要修改目標設備的注冊表,現在先切換到注冊表試圖:
可以新建,可以導入(導入現有的REG文件,一般是從模擬器中的注冊表保存得到的):
我常習慣直接修改CAB的項目配置文件,此處注意這個文件只支持ASCII碼,當里面有漢字時(當你的機器名是中文時,或者前面的添加注冊表鍵值時可能造成),編譯時會出錯,提示Unicode轉換ASCII碼錯誤:
這里就是從注冊表試圖中添加的配置信息:
OK,下面點擊生成吧。在開發中,如果我們想看DLL運行時的效果時,常常需要這樣制作CAB包。
下面介紹的是如何在“程序”中添加快捷方式:
將\windows\start menu\programs下的一個快捷方式拷貝到PC上修改成:21#MyApplication.exe,修改完畢后,保存,并把此快捷方式改名,拷貝到手機的\windows\start menu(“開始”菜單)\programs(程序)目錄下。將MyApplication.exe拷貝到Windows目錄下,此時你就會發現Program下有你的應用程序了。這些操作可以使用上面介紹的CAB包實現。
------------------------------------------------------------------------------------------------------
以下文章還不完善,今天太累了,等我修改好了再發布,并且我會在下面更新鏈接。
一個簡單的Win32應用程序詳解
------------------------------------------------------------------------------------------------------
說簡單并不簡單,如果要能非常清楚一個看似簡單的Win32程序,其實你需要深入操作系統內部。
------------------------------------------------------------------------------------------------------
編寫服務程序
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
編譯、鏈接、部署和調試程序
------------------------------------------------------------------------------------------------------
(PC-Lint的使用;鏈接錯誤解決方法;vcproj等文件的作用,以及修改;斷點的使用;DLL文件的調試等內容)
------------------------------------------------------------------------------------------------------
Visual Studio以及相關工具的使用
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
內存泄露檢查和定位
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園