锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
瑕佹秷闄ょ獥鍙e璞?蹇呴』娓呮紿楀彛瀵硅薄鐨勬瀯鎴?鍦ㄤ竴涓氬父鐨勭▼搴忎腑錛屽厛鍒涘緩c++紿楀彛瀵硅薄,鐒跺悗鐢盬indows鍒涘緩瀹為檯鐨勭獥鍙g粨鏋?騫惰繑鍥炲彞鏌勪笌c++瀵硅薄榪炴帴.涔熷氨鏄,紿楀彛瀵硅薄鍖呭惈c++紿楀彛瀵硅薄鍜學indows紿楀彛瀵硅薄,涓よ呴氳繃鍙ユ焺HWND鑱旂郴.
鐜板湪,璁╂垜浠湅鐪?姝h"鐨勭獥鍙e璞℃竻闄ゆ祦紼?鎵璋撳璞$殑娓呴櫎鏄寚閲婃斁瀵硅薄鎵鍗犵殑璧勬簮,紿楀彛瀵硅薄涓璚indows紿楀彛瀵硅薄鍗犳湁鐨勬槸緋葷粺璧勬簮,c++瀵硅薄鍗犳湁鐨勬槸鍐呭瓨璧勬簮.閲婃斁緋葷粺璧勬簮鐩稿瑕佺畝鍗曚竴浜?璋冪敤铏氬嚱鏁癉estroyWindow鍒犻櫎Windows紿楀彛瀵硅薄.濡傛灉DestroyWindow鍒犻櫎鐨勬槸鐖剁獥鍙?Windows浼氳嚜鍔ㄤ負瀛愮獥鍙h皟鐢―estroyWindow.涓鑸潵璇?紼嬪簭涓嶅繀璋冪敤DestroyWindow.鍥犱負褰撶敤鎴峰叧闂獥鍙f椂,Windows渚垮彂閫乄M_CLOSE娑堟伅,WM_CLOSE鐨勭己鐪佹秷鎭鐞嗗嚱鏁癈Wnd::OnClose璋冪敤DestroyWindow.
鍒拌繖鏃?娓呴櫎宸ヤ綔宸茬粡瀹屾垚浜嗕竴鍗?灞忓箷涓婄殑紿楀彛宸茬粡涓嶈浜?浣嗘槸鍒繕浜?鍦ㄥ唴瀛樹腑榪樻湁涓涓猚++紿楀彛瀵硅薄.璁╂垜浠啀鐪嬬湅c++瀵硅薄娓呴櫎鐨勮繃紼?褰撶獥鍙h鍙栨秷鏃?紿楀彛鏈鍚庡彂閫佺殑涓涓秷鎭槸WM_NCDESTROY.瀹冪己鐪佺殑娑堟伅澶勭悊鍑芥暟CWnd::OnNcDestroy鎶奵++紿楀彛瀵硅薄涓庡彞鏌凥WND鍒嗙,騫惰皟鐢ㄤ竴涓緢閲嶈鐨勮櫄鍑芥暟PostNcDestroy.榪欎釜鍑芥暟鏄悶娓呯獥鍙e璞℃竻闄ょ殑鍏抽敭.Cwnd涓殑PostNcDestroy浠涔堥兘涓嶅仛.鏈変簺MFC紿楀彛綾諱細閲嶈澆瀹?騫跺姞鍏elete this浠g爜鍒犻櫎c++瀵硅薄.榪欎簺紿楀彛綾誨父甯告槸浠ew鎿嶄綔絎﹀緩绔嬪湪鍫嗕腑鐨?鐢變簬閲嶈澆浜哖ostNcDestroy,浣跨獥鍙f湁鑷姩娓呴櫎鍔熻兘.鍥犳,鎴戜滑涓嶇敤鍏沖績娓呴櫎闂浜?鍙﹀鐨勪竴浜汳FC紿楀彛綾諱竴鑸槸浠ュ彉閲忓艦寮忓垱寤虹殑,MFC娌℃湁涓轟篃娌″繀瑕佷負瀹冧滑閲嶈澆PostNcDestroy鍑芥暟.
涓嶅叿澶囪嚜鍔ㄦ竻闄ゅ姛鑳界殑紿楀彛綾?涓鑸湪鍫嗘爤涓垱寤烘垨宓屽叆浜庡叾瀹僣++瀵硅薄涓?
鎵鏈夋爣鍑嗙殑Windows鎺т歡綾?濡侰Static, CEdit, CListBox絳夌瓑)
鐢盋Wnd綾葷洿鎺ユ淳鐢熷嚭鏉ョ殑瀛愮獥鍙e璞?濡傜敤鎴峰畾鍒剁殑鎺т歡)
鎷嗗垎紿楀彛綾?CSplitterWnd)
緙虹渷鐨勬帶鍒舵潯綾?CControlBar鐨勬淳鐢熺被)
瀵硅瘽妗嗙被(CDialog)鍦ㄥ爢鏍堜笂鍒涘緩鐨勬ā鎬佸璇濇綾?/p>
鎵鏈夌殑Windows閫氱敤瀵硅瘽妗?闄FindReplaceDialog)
鐢盋lassWizard鍒涘緩鐨勫璇濇
鍏鋒湁鑷姩娓呴櫎鍔熻兘鐨勭獥鍙g被,涓鑸湪鍫嗕腑鍒涘緩:
涓繪鏋剁獥鍙g被(鐩存帴鎴栭棿鎺ヤ粠CFrameWnd綾繪淳鐢?
瑙嗗浘綾?鐩存帴鎴栭棿鎺ヤ粠CView綾繪淳鐢?
浠庢煇縐嶇▼搴︿笂鏉ヨ,MFC鐨?鏈嶅姟鍒板"浣垮垵瀛﹁呮湁浜涙壘涓嶇潃鍖?涓嶈繃,涓嶅緱涓嶆壙璁?MFC騫茬殑寰堟紓浜?
璋堝埌榪欓噷,鎴戜滑搴旇鏄庣櫧c++閲屼竴鏉¢噸瑕佺殑鍑嗗垯:鐢―estroyWindow娓呴櫎紿楀彛瀵硅薄,涓嶈鐢?delete".
瀵逛簬涓嶅叿澶囪嚜鍔ㄦ竻闄ゅ姛鑳界殑紿楀彛綾諱嬌鐢?delete"鏃?"delete"鍏堣皟鐢ㄦ瀽鏋勫嚱鏁伴噷鐨凞estroyWindow,鐢變簬鍦ㄦ瀽鏋勫嚱鏁頒腑,铏氭満鍒朵笉璧蜂綔鐢?榪欓噷鍙兘璋冪敤鏈湴鐗堟湰(Cwnd綾?DestroyWindow鍑芥暟,鏄劇劧榪欎笉鏄垜浠兂瑕佺殑.瀵逛簬鏈夎嚜鍔ㄦ竻闄ゅ姛鑳界殑紿楀彛綾?濂借薄闂鏇翠弗閲嶄竴鐐?鍓嶉潰鎻愬埌浜嗛噸杞界殑PostNcDestroy宸茬粡鍚湁浜?delete this",榪欐牱c++瀵硅薄灝辮閲婃斁浜嗕袱嬈?
寰堝浜鴻涓?vc++鍚寁b涓鏍?鏄竴涓畬鍏ㄥ彲瑙嗗寲鐨勪駭鍝?涓嶇敤鍦ㄧ湅c++鐨勪功浜?閫氳繃涓婇潰瀵圭獥鍙e璞$殑娓呴櫎鐨勪粙緇?鍙互鍙戠幇,Windows紼嬪簭鏄笌Windows绱у瘑緇撳悎鐨?鑰屼笖鐗墊秹鍒板緢澶歝++鐨勭煡璇?濡傝櫄鍑芥暟銆佹瀽鏋勫嚱鏁般乶ew鎿嶄綔絎︾瓑).瑕佸vc++鏈夎繘涓姝ョ悊瑙?蹇呴』鐞嗚ВWindows鏈哄埗,娣卞叆瀛︿範c++.
銆銆涓銆佷笌鍔犻熼敭琛ㄦ湁鍏崇殑鍑犱釜API鍑芥暟鍜岀粨鏋勩?/p>
銆銆鎿嶄綔鍔犻熼敭琛ㄤ嬌鐢ㄧ殑鍑犱釜API鍑芥暟錛堝叧浜庤繖鍑犱釜鍑芥暟鐨勮緇嗚鏄庤鍙傝冩湁鍏充功綾嶏級錛?br>銆銆HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableNAme);
銆銆LoadAccelerators鍑芥暟浠庣▼搴忕殑璧勬簮涓姞杞戒竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛紝鍔犺澆鎴愬姛鍚庤繑鍥炰竴涓姞閫熷仴琛ㄧ殑鍙ユ焺銆傚叾涓細
銆銆hInstance銆銆搴旂敤紼嬪簭鐨勫疄渚嬪彞鏌勩?br>銆銆lpTableName銆鎸囧悜鍔犻熼敭琛ㄥ悕縐板瓧絎︿覆鐨勬寚閽堛?/p>
銆銆HACCEL CreateAcceleratorTable(LPACCEL lpaccl, int cEntries);
銆銆CreateAcceleratorTable鍑芥暟鏍規(guī)嵁涓涓狝CCEL緇撴瀯鏁扮粍鍒涘緩涓涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ傝鍑芥暟涓嶭oadAccelerators涓嶅悓鐨勬槸錛歀oadAccelerators鍑芥暟鍔犺澆鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ湪紼嬪簭緇撴潫鍚庣郴緇熶細鑷姩灝嗚鍔犻熼敭琛ㄤ粠鍐呭瓨涓竻闄わ紝浣咰reateAcceleratorTable鍑芥暟鍒涘緩鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄩ渶瑕佷嬌鐢ㄥ嚱鏁癉estoryAceleratorTable鍑芥暟榪涜娓呴櫎銆?br>銆銆lpaccl銆銆銆涓涓寚鍚慉CCEL緇撴瀯鏁扮粍鐨勬寚閽堛?br>銆銆cEntries銆銆鏁扮粍涓厓绱犵殑涓暟銆?/p>
銆銆BOOL銆DestoryAcceleratorTable(HACCEL hAccel);
銆銆DestoryAcceleratorTable鍑芥暟娓呴櫎鐢盋reateAcceleratorTable鍑芥暟鍒涘緩鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛紝鎴愬姛鍒欒繑鍥濼RUE銆傚叾涓細
銆銆hAccel銆銆銆闇瑕佹竻闄ょ殑鍔犻熼敭琛ㄥ彞鏌勩?/p>
銆銆int TranslateAccelerator(HWND hWd, HACCEL hAccTable, LPMSG lpMsg);
銆銆TranslateAccelerator鍑芥暟璐熻矗緲昏瘧鍔犻熼敭銆傚叾涓細
銆銆hWnd銆銆銆銆 紿楀彛鍙ユ焺錛岀炕璇戝悗鐨勬秷鎭皢琚彂寰璇ョ獥鍙?br>銆銆hAccTable銆銆鍔犻熼敭琛ㄥ彞鏌勩?br>銆銆lpMsg銆銆銆銆鎸囧悜MSG緇撴瀯鐨勬寚閽堛?/p>
銆銆ACCEL緇撴瀯鐨勫畾涔夛細
typedef struct tagACCEL{
BYTE fVirt;
WORD key;
WORD cmd;
}ACCEL,*LPACCEL;
鍏朵腑錛?br>銆銆fVirt銆銆銆鍔犻熼敭鐨勬爣璁般?br>銆銆key銆銆銆銆閿殑浠g爜銆傚fVirt鎴愬憳鍖呭惈FVIRTKEY鏍囧織錛屽垯key鎸囦竴涓櫄閿爜錛屽惁鍒欐槸涓涓狝SCII鐮併?br>銆銆cmd銆銆銆銆鍛戒護ID鍙鳳紝璇ュ弬鏁板皢琚斁鍏M錛緾OMMAND鎴朩M錛縎YSCOMMAND娑堟伅鐨剋Param鍙傛暟鐨勪綆浣嶅瓧鍙戣嚦紿楀彛銆?/p>
銆銆浜屻佸湪windows涓嬪浣曚嬌鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ?/p>
銆銆鍦╳indow涓嬩嬌鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄤ竴鑸湁涓ょ鏂規(guī)硶錛?錛屽垱寤轟竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭璧勬簮錛屽湪紼嬪簭涓嬌鐢ˋPI鍑芥暟LoadAccelerators鏉ュ皢鍔犻熼敭琛ㄥ姞杞藉叆鍐呭瓨銆傚茍鍦ㄦ秷鎭驚鐜腑浣跨敤API鍑芥暟TranslateAccelerator鏉ョ炕璇戣鍔犻熼敭琛ㄣ?銆佸湪紼嬪簭涓~鍏呬竴涓狝CCEL鏁扮粍銆傜劧鍚庤皟鐢ˋPI鍑芥暟CreateAcceleratorTable鏉ュ垱寤哄姞閫熻〃錛岀炕璇?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鍚屼笂錛屼絾涓嶈蹇樿鍦ㄩ鍑虹▼搴忓墠浣跨敤API鍑芥暟DestoryAcceleratorTable鏉ユ竻闄ゅ畠銆備笅闈㈠垎鍒粰鍑轟竴涓緥瀛愶細
/*渚?:浣跨敤LoadAccelerators銆?br>銆鍋囪浣犲凡緇忓緩绔嬩簡涓涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭璧勬簮錛孖D涓篒DR錛緼CCEL銆?br>銆鍋囪浣犲凡緇忓畾涔変簡鍒濆鍖栧嚱鏁癐nitApplication(HINSTANCE hInstance,int nCmdShow),
銆璇ュ嚱鏁版墽琛屾敞鍐岀獥鍙g被鍜屽垱寤虹獥鍙f搷浣溿?br>*/
#include <windows.h>
#include "rc/resource.h"
BOOL InitApplication(HINSTANCE hInstance,int nCmdShow);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HANDLE hAccelTable;
// 鍒濆鍖栧簲鐢ㄧ▼搴忥紝騫剁敓鎴愪富紿楀彛.
if (!InitApplication(hInstance, nCmdShow))
{
return FALSE; // 鍒濆鍖栧け璐?br> }
//浣跨敤鍑芥暟LoadAccelerators浠庣▼搴忚祫婧愪腑鍔犺澆鍔犻熼敭琛?br> hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL));
// 鍙栧緱騫跺垎鍙戞秷鎭洿鍒版帴鏀跺埌 WM_QUIT 娑堟伅.
while (GetMessage(&msg, NULL, 0, 0))
{
//鍦ㄥ垎鍙戞秷鎭墠棣栧厛璇曠潃鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ繘琛岀炕璇戯紝濡傛灉鏄竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鍒欑敱
//TranslateAccelerator鍑芥暟榪涜緲昏瘧錛屼笉鍐嶇戶緇鐞嗚娑堟伅銆?br> if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam; // Returns the value from PostQuitMessage
}
/*渚?:浣跨敤CreateAcceleratorTable銆?br>銆鍋囪浣犲凡緇忓畾涔変簡鍒濆鍖栧嚱鏁癐nitApplication(HINSTANCE hInstance,int nCmdShow),
銆璇ュ嚱鏁版墽琛屾敞鍐岀獥鍙g被鍜屽垱寤虹獥鍙f搷浣溿?br>*/
#include <windows.h>
#include "rc/resource.h"
錛僤efine ID_CMD_A 0x00000230
錛僤efine ID_CMD_B 0x00000231
錛僤efine ID_CMD_C 0x00000232
錛僤efine ID_CMD_D 0x00000233
錛僤efine ID_CMD_E 0x00000234
錛僤efine ID_CMD_F 0x00000235
錛僤efine ID_CMD_G 0x00000236
//瀹氫箟浜嗕竷涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭,璇峰湪娑堟伅鍥炶皟鍑芥暟涓鐞嗚繖涓冧釜鍛戒護ID銆?br>static ACCEL accel[]={
{FVIRTKEY|FCONTROL,VK_F5,ID_CMD_A},
{FVIRTKEY|FCONTROL,VK_F6,ID_CMD_B},
{FVIRTKEY|FCONTROL,VK_HOME,ID_CMD_C},
{FVIRTKEY|FCONTROL,VK_END,ID_CMD_D},
{FVIRTKEY|FCONTROL,"G",ID_CMD_E},
{FVIRTKEY|FCONTROL,VK_SPACE,ID_CMD_F},
{FVIRTKEY|FCONTROL,"K",ID_CMD_G},
};
BOOL InitApplication(HINSTANCE hInstance,int nCmdShow);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HANDLE hAccelTable;
// 鍒濆鍖栧簲鐢ㄧ▼搴忥紝騫剁敓鎴愪富紿楀彛.
if (!InitApplication(hInstance, nCmdShow))
{
return FALSE; // 鍒濆鍖栧け璐?br> }
//浣跨敤鍑芥暟CreateAcceleratorTable浠庢暟緇刟ccel涓姞杞?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛?br> hAccelTable = CreateAcceleratorTable(accel, sizeof(accel)/sizeof(ACCEL));
// 鍙栧緱騫跺垎鍙戞秷鎭洿鍒版帴鏀跺埌 WM_QUIT 娑堟伅.
while (GetMessage(&msg, NULL, 0, 0))
{
//鍦ㄥ垎鍙戞秷鎭墠棣栧厛璇曠潃鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ繘琛岀炕璇戯紝濡傛灉鏄竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鍒欑敱
//TranslateAccelerator鍑芥暟榪涜緲昏瘧錛屼笉鍐嶇戶緇鐞嗚娑堟伅銆?br> if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//鍒犻櫎鍔犻熼敭琛?br> DestoryAcceleratorTable(hAccelTable);
return msg.wParam; // Returns the value from PostQuitMessage
}
銆銆鍦∕FC紼嬪簭璁捐涓紝鏈夊叧浜?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄧ殑鎿嶄綔宸茬粡琚獵FrameWnd綾昏繘琛屼簡灝佽銆傞氬父錛屾垜浠殑紼嬪簭鐨勪富妗嗘灦綾籆MainFrame浠嶤FrameWnd綾繪淳鐢燂紙SDI鐣岄潰紼嬪簭錛夛紝鎴栬呬粠CMDIFrameWnd綾繪淳鐢燂紙MDI鐣岄潰紼嬪簭錛夛紝鑰孋MDIFrameWnd綾諱篃鏄粠CFrameWnd綾繪淳鐢熺殑銆傛墍浠ワ紝鎴戜滑騫朵笉鐢ㄥ幓鍏沖績閭d釜璧勬簮鍙蜂負IDR_MAINFRAME鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄦ槸濡備綍鍔犺澆鐨勶紝濡傛灉浣犲彧鏄渶瑕佷竴涓繖鏍風殑闈欐佺殑鍔犻熼敭琛ㄧ殑璇濄?br>銆銆閭d箞鎴戜滑鑳戒笉鑳戒嬌鐢ㄨ嚜宸辯殑鍔犻熼敭琛ㄥ憿錛熺瓟妗堟槸錛氬彲浠ョ殑銆?br>銆銆鍒涘緩鍔犻熼敭琛ㄧ殑鏂規(guī)硶鍚屽墠銆傜敱浜庡湪MFC涓紝WinMain鍑芥暟琚殣钘忥紝鎴戜滑涓嶈兘鐩存帴淇敼WinMain鍑芥暟錛屾墍浠ワ紝鍔犻熼敭琛ㄧ殑鍒涘緩灝嗗湪CMainFrame鐨凮nCreate鍑芥暟涓垱寤恒?br>銆銆1銆佸湪CMainFrame綾諱腑娣誨姞涓涓狧ACCEL綾誨瀷淇濇姢鎴愬憳鍙橀噺錛歮_hMyAccel銆傚湪鏋勯犲嚱鏁頒腑鍒濆鍖栦負NULL銆?br>銆銆2銆佸湪CMainFrame::OnCreate鍑芥暟鐨?“return 0;”鍙ュ墠澧炲姞鍒涘緩鍔犻熼敭琛ㄧ殑浠g爜銆傝繑鍥炵殑鍔犻熼敭琛ㄥ彞鏌勪繚瀛樺湪m_hMyAccel涓細
銆銆銆鏂規(guī)硶1錛?IDR錛縈YACCEL涓轟綘瀹氫箟鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ祫婧愬彿)
銆銆銆m_hMyAccel=LoadAccelerators(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_MYACCEL));
銆銆銆鏂規(guī)硶2錛?accel鍚屽墠闈㈢殑渚嬪瓙涓鏍峰湪鏈枃浠剁殑寮澶撮儴鍒嗚繘琛屽畾涔?
銆銆銆m_hMyAccel=CreateAcceleratorTable(accel,sizeof(accel)/sizeof(ACCEL));
銆銆3銆佸鏋滄槸浣跨敤CreateAccelTable鍑芥暟鍒涘緩鐨勶紝鍒欓噸杞借櫄鎷熷嚱鏁癉estoryWindow()銆傚湪璇ュ嚱鏁扮殑“return CMDIFrameWnd::DestroyWindow();”鍓嶅鍔犲涓嬩唬鐮?
if(m_hMyAccel!=NULL){
DestroyAcceleratorTable(m_hMyAccel);
m_hMyAccel=NULL;
}
銆銆閫氳繃鍓嶉潰鐨勪笁姝ワ紝鍔犻熼敭琛ㄥ凡緇忚兘姝g‘鍦拌鍒涘緩鍜屽垹闄や簡錛屼絾鏄畠榪樻病鏈夊伐浣溿備笅闈㈠氨鏄璁╂垜浠垰鎵嶆墍鍒涘緩鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ伐浣滆搗鏉ャ?br>銆銆鍦ˋPI紼嬪簭璁捐涓ぇ瀹跺凡緇忕煡閬撲簡鍔犻熼敭鏄浣曞伐浣滅殑銆備篃灝辨槸鍦ㄦ秷鎭繕娌℃湁鍒嗗彂鍑哄幓涔嬪墠鍏堟鏌ユ槸涓嶆槸涓涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭銆傛垜浠氳繃API鍑芥暟TranslateAccelerator鏉ュ疄鐜般傚湪MFC涓紝娑堟伅鏈哄埗宸茬粡琚皝瑁呬簡錛屾垜浠笉鑳藉幓淇敼娑堟伅寰幆銆備絾鏄紝妗嗘灦鍦ㄥ垎鍙戞秷鎭墠浼氳皟鐢ㄨ櫄鎷熷嚱鏁癙erTranslateMessage錛屽茍涓斿鏋滆鍑芥暟榪斿洖TRUE錛屽垯涓嶅啀澶勭悊璇ユ秷鎭傝繖姝f槸鎴戜滑鎵闇瑕佺殑銆?br>銆銆璁╂垜浠啀鍥炲埌CMainFrame綾伙紝鐢熸垚PerTranslateMessage鍑芥暟鐨勮鐩栫増鏈備慨鏀瑰嚱鏁頒綋濡備笅錛?/p>
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(m_hMyAccel&&TranslateAccelerator(m_hWnd, m_hMyAccel, pMsg))
return TRUE;
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
銆銆濂戒簡錛岀幇鍦ㄦ垜浠殑鍔犻熼敭宸茬粡鑳芥甯稿湴宸ヤ綔浜嗐備互涓婃柟娉曠敤鍦ㄥ叾瀹冪獥鍙e悓鏍鋒湁鏁堬紙濡傚璇濇涓紝浣犱笉濡ㄥ湪瀵硅瘽妗嗕腑璇曡瘯錛夈?/p>
銆銆涓夈佸彲鍦ㄨ繍琛屾椂緙栬緫鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ?/p>
銆銆閫氳繃涓婇潰鐨勫彊榪幫紝浣犲彲鑳藉凡緇忓鍙紪杈戠殑鍔犻熼敭琛ㄦ湁浜嗕竴瀹氱殑杞粨銆傚叾瀹炲叾瀹炵幇鎬濇兂寰堢畝鍗曪細鍙瀵逛竴涓狝CCEL鏁扮粍榪涜淇敼錛岀劧鍚庨噸鏂扮敓鎴?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ氨琛屼簡銆?br>銆銆涓轟簡鍖哄垎鍛戒護錛屾垜浠負姣忎釜鍛戒護鍙栦竴涓悕瀛椼傚湪CMainFrame綾誨畾涔夌殑鍓嶉潰鍔犱笂涓嬮潰鐨勪竴涓粨鏋勫畾涔夛細
typedef struct{
char cCmd[32];
ACCEL accel;
}ACCELITEM,*LPACCELITEM;
銆銆鎴戜滑灝嗕嬌鐢ㄨ緇撴瀯鏉ヤ繚瀛?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄧ殑鏁版嵁銆傚湪CMainFrame綾諱腑娣誨姞涓や釜淇濇姢鎴愬憳鍙橀噺錛?/p>
LPACCELITEM m_lpAccel;
DWORD m_dwAccelCount;
銆銆鍦ㄦ瀯閫犲嚱鏁頒腑灝唌_lpAccel鍒濆鍖栦負NULL錛宮_dwAccelCount鍒濆鍖栦負0銆傚湪鏁扮粍accel鐨勫畾涔変笅闈㈠鍔犱竴涓瓧絎︿覆鏁扮粍鐨勯潤鎬佸彉閲忕殑瀹氫箟錛堢敤鏉ユ寚瀹氬懡浠ょ殑鍚嶇О,璇蜂豢鐓т笅闈㈣嚜宸卞畾涔夛紝涓暟澶氬皯涓嶉檺錛屽瓧絎︿覆闀垮害涓嶈瓚呰繃31涓瓧絎︼級錛?/p>
static char strCmd[][32]={
"Command One",
"Command Two",
"Command Three",
"Command Four",
"Command Five"
};
銆銆鍦–MainFrame綾諱腑娣誨姞涓涓繚鎶ゆ垚鍛樺嚱鏁癓oadAccel(),璇ュ嚱鏁扮敤鏉ュ皢鍔犻熼敭琛ㄨ鍏ワ紝瀹氫箟濡備笅錛?/p>
BOOL CMainFrame::LoadAccel()
{
ASSERT(m_hActAccel==NULL);
ASSERT(m_lpAccel==NULL);
m_dwAccelCount=sizeof(accel)/sizeof(ACCEL);
m_lpAccel=new ACCELITEM[m_dwAccelCount];
memset(m_lpAccel,0,sizeof(ACCELITEM)*m_dwAccelCount);
DWORD dwCmdStr=sizeof(strCmd)/sizeof(char[32]);
for(DWORD dw=0;dw<m_dwAccelCount;dw++){
m_lpAccel[dw].accel=accel[dw];
strcpy(m_lpAccel[dw].cCmd,dw<dwCmdStr?strCmd[dw]:"Command Unknow");
}
m_hActAccel=CreateAcceleratorTable(accel,m_dwAccelCount);
return TRUE;
}
銆銆鍒犻櫎OnCreate鍑芥暟涓師鏉ュ垱寤?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄧ殑浠g爜錛屾敼鎴愬LoadAccel()鐨勮皟鐢細
LoadAccel();
銆銆鍦–MainFrame鐨勬瀽鏋勫嚱鏁頒腑澧炲姞浠ヤ笅鍐呭錛?/p>
if(m_lpAccel)
delete[] m_lpAccel;
銆銆涓轟簡鑳藉瀵?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鏁版嵁榪涜緙栬緫錛屾垜浠湪宸ョ▼涓坊鍔犱竴涓璇濇璧勬簮錛孖D涓?#8220;IDD_ACCELEDIT”錛屽湪瀵硅瘽妗嗕笂鏀劇疆涓変釜鎴愮粍妗嗭紙Group Box錛夛紝宸﹁竟涓涓爣棰樹負“鍛戒護”錛涗腑闂翠竴涓爣棰樹負“緇勫悎閿?#8221;錛涘彸杈逛竴涓爣棰樹負“铏氶敭鍊?#8221;銆傚湪宸﹁竟鎴愮粍妗嗕腑鏀劇疆涓涓垪琛ㄦ錛圠ist Box錛夛紝ID涓?#8220;IDC_LST_CMD”銆傚湪涓棿鎴愮粍妗嗕腑鏀劇疆涓変釜鏍擱夋錛圕heck Box錛夛紝涓婁笅鎺掑垪銆備笂闈㈢殑鏍擱夋鐨処D涓?#8220;IDC_CHK_ALT”錛屾爣棰樹負“Alt”錛屽茍鍕鵑?#8220;Group”灞炴э紱涓棿鐨勬牳閫夋鐨処D涓?#8220;IDC_CHK_SHIFT”錛屾爣棰樹負“Shift”錛屽彇娑?#8220;Group”灞炴э紱涓嬮潰鐨勬牳閫夋鐨処D涓?#8220;IDC_CHK_CTRL”錛屾爣棰樹負“Ctrl”錛屽彇娑?#8220;Group”灞炴с傚湪鍙寵竟鐨勬垚緇勬涓斁緗竴涓垪琛ㄦ錛孖D涓?#8220;IDC_LST_KEY”銆傝皟鏁村悇涓帶浠剁殑灝哄鍙婁綅緗嚦鍚堥傘傝緗帶浠剁殑TAB璺寵漿欏哄簭錛屼粠宸﹁嚦鍙熾佷粠涓婂埌涓嬨備緷嬈′負錛氬乏鎴愮粍妗嗐両DC_LST_CMD鍒楄〃妗嗐佷腑鎴愮粍妗嗐両DC_CHK_ALT鏍擱夋銆両DC_CHK_SHIFT鏍擱夋銆両DC_CHK_CTRL鏍擱夋銆佸彸鎴愮粍妗嗐両DC_LST_KEY鍒楄〃妗嗐丱K鎸夐挳銆丆ANCEL鎸夐挳銆?br>銆銆鎵撳紑綾誨悜瀵鹼紝涓哄璇濇鏂板緩涓涓被錛岀被鍚嶄負“CDlgEditAccel”銆備負涓や釜鍒楄〃妗嗗拰涓変釜鏍擱夋鏄犲皠鍙橀噺錛屽涓嬶細
銆銆鎺т歡ID:ID_LST_CMD錛涚被鍨?Control/CListBox錛涘悕縐?m_LstCmd錛?br>銆銆鎺т歡ID:ID_LST_KEY錛涚被鍨?Control/CListBox錛涘悕縐?m_LstKey錛?br>銆銆鎺т歡ID:ID_CHK_ALT錛涚被鍨?Control/CButton錛涘悕縐?m_ChkAlt錛?br>銆銆鎺т歡ID:ID_CHK_SHIFT錛涚被鍨?Control/CButton錛涘悕縐?m_ChkShift錛?br>銆銆鎺т歡ID:ID_CHK_CTRL錛涚被鍨?Control/CButton錛涘悕縐?m_ChkCtrl錛?/p>
銆銆鍦ㄧ被CDlgEditAccel鐨勫畾涔夊墠鍔犲叆涓嬮潰鐨勫畾涔夛細
typedef struct tag_KeyName{
CString m_strName;
WORD m_wID;
tag_KeyName(CString str,WORD id){m_strName=str,m_wID=id;}
}KEYNAME,*LPKEYNAME;
typedef struct tag_ActAccel{
CString m_strCmd;
ACCEL m_Accel;
}ACTACCEL,*LPACTACCEL;
class CActAccelList
{
public:
CActAccelList();
~CActAccelList();
protected:
LPACTACCEL m_lpActAccel;
int m_iCount;
public:
ACTACCEL& operator[](int index);
BOOL SetSize(int iSize);
int GetSize();
};
銆銆鍦ㄦ枃浠禗lgEditAccel.cpp鏂囦歡涓畾涔夌被CActAccelList鐨勬垚鍛樺嚱鏁幫紝浠g爜濡備笅錛?br>CActAccelList::CActAccelList()
{
m_lpActAccel=NULL;
m_iCount=0;
}
CActAccelList::~CActAccelList()
{
if(m_iCount>0&&m_lpActAccel)
delete[] m_lpActAccel;
}
int CActAccelList::GetSize()
{
return m_iCount;
}
ACTACCEL& CActAccelList::operator []( int index)
{
if(!(index>=0&&index<m_iCount))
AfxThrowMemoryException();
return m_lpActAccel[index];
}
BOOL CActAccelList::SetSize(int iSize)
{
if(iSize<0)
return FALSE;
if(m_iCount>0&&m_lpActAccel)
delete[] m_lpActAccel;
m_iCount=0;
m_lpActAccel=new ACTACCEL[iSize];
if(m_lpActAccel==NULL)
return FALSE;
m_iCount=iSize;
return TRUE;
}
銆銆鍦―lgAccelEdit.cpp鏂囦歡澶撮儴瀹氫箟鍏ㄥ眬鍙橀噺錛嶏紞鏁扮粍key錛?br>static KEYNAME key[]={
KEYNAME("Left mouse button",VK_LBUTTON),
KEYNAME("Right mouse button",VK_RBUTTON),
KEYNAME("Control-break processing",VK_CANCEL),
KEYNAME("Middle mouse button",VK_MBUTTON),
KEYNAME("Back Space",VK_BACK),
KEYNAME("Tab",VK_TAB),
KEYNAME("Clear",VK_CLEAR),
KEYNAME("Enter",VK_RETURN),
KEYNAME("Shift",VK_SHIFT),
KEYNAME("Ctrl",VK_CONTROL),
KEYNAME("Alt",VK_MENU),
KEYNAME("Pause",VK_PAUSE),
KEYNAME("Caps Lock",VK_CAPITAL),
KEYNAME("Esc",VK_ESCAPE),
KEYNAME("Space",VK_SPACE),
KEYNAME("Page Up",VK_PRIOR),
KEYNAME("Page Down",VK_NEXT),
KEYNAME("End",VK_END),
KEYNAME("Home",VK_HOME),
KEYNAME("Left",VK_LEFT),
KEYNAME("Up",VK_UP),
KEYNAME("Right",VK_RIGHT),
KEYNAME("Down",VK_DOWN),
KEYNAME("Select",VK_SELECT),
KEYNAME("Excute",VK_EXECUTE),
KEYNAME("Print Screen",VK_SNAPSHOT),
KEYNAME("Insert",VK_INSERT),
KEYNAME("Delete",VK_DELETE),
KEYNAME("Help",VK_HELP),
KEYNAME("0",'0'),
KEYNAME("1",'1'),
KEYNAME("2",'2'),
KEYNAME("3",'3'),
KEYNAME("4",'4'),
KEYNAME("5",'5'),
KEYNAME("6",'6'),
KEYNAME("7",'7'),
KEYNAME("8",'8'),
KEYNAME("9",'9'),
KEYNAME("A",'A'),
KEYNAME("B",'B'),
KEYNAME("C",'C'),
KEYNAME("D",'D'),
KEYNAME("E",'E'),
KEYNAME("F",'F'),
KEYNAME("G",'G'),
KEYNAME("H",'H'),
KEYNAME("I",'I'),
KEYNAME("J",'J'),
KEYNAME("K",'K'),
KEYNAME("L",'L'),
KEYNAME("M",'M'),
KEYNAME("N",'N'),
KEYNAME("O",'O'),
KEYNAME("P",'P'),
KEYNAME("Q",'Q'),
KEYNAME("R",'R'),
KEYNAME("S",'S'),
KEYNAME("T",'T'),
KEYNAME("U",'U'),
KEYNAME("V",'V'),
KEYNAME("W",'W'),
KEYNAME("X",'X'),
KEYNAME("Y",'Y'),
KEYNAME("Z",'Z'),
KEYNAME("Left windows",VK_LWIN),
KEYNAME("Right windows",VK_RWIN),
KEYNAME("Applications",VK_APPS),
KEYNAME("Numeric keypad 0", VK_NUMPAD0),
KEYNAME("Numeric keypad 1", VK_NUMPAD1),
KEYNAME("Numeric keypad 2", VK_NUMPAD2),
KEYNAME("Numeric keypad 3", VK_NUMPAD3),
KEYNAME("Numeric keypad 4", VK_NUMPAD4),
KEYNAME("Numeric keypad 5", VK_NUMPAD5),
KEYNAME("Numeric keypad 6", VK_NUMPAD6),
KEYNAME("Numeric keypad 7", VK_NUMPAD7),
KEYNAME("Numeric keypad 8", VK_NUMPAD8),
KEYNAME("Numeric keypad 9", VK_NUMPAD9),
KEYNAME("Multiply",VK_MULTIPLY),
KEYNAME("Add",VK_ADD),
KEYNAME("Separator",VK_SEPARATOR),
KEYNAME("Subtract",VK_SUBTRACT),
KEYNAME("Decimal Point",VK_DECIMAL),
KEYNAME("Divide",VK_DIVIDE),
KEYNAME("F1",VK_F1),
KEYNAME("F2",VK_F2),
KEYNAME("F3",VK_F3),
KEYNAME("F4",VK_F4),
KEYNAME("F5",VK_F5),
KEYNAME("F6",VK_F6),
KEYNAME("F7",VK_F7),
KEYNAME("F8",VK_F8),
KEYNAME("F9",VK_F9),
KEYNAME("F10",VK_F10),
KEYNAME("F11",VK_F11),
KEYNAME("F12",VK_F12),
KEYNAME("F13",VK_F13),
KEYNAME("F14",VK_F14),
KEYNAME("F15",VK_F15),
KEYNAME("F16",VK_F16),
KEYNAME("F17",VK_F17),
KEYNAME("F18",VK_F18),
KEYNAME("F19",VK_F19),
KEYNAME("F20",VK_F20),
KEYNAME("F21",VK_F21),
KEYNAME("F22",VK_F22),
KEYNAME("F23",VK_F23),
KEYNAME("F24",VK_F24),
KEYNAME("Attn",VK_ATTN),
KEYNAME("CrSel",VK_CRSEL),
KEYNAME("ExSel",VK_EXSEL),
KEYNAME("Erase",VK_EREOF),
KEYNAME("Play",VK_PLAY),
KEYNAME("Zoom",VK_ZOOM),
KEYNAME("Reserved for future use",VK_NONAME ),
KEYNAME("PA1",VK_PA1),
KEYNAME("Clear(OEM)",VK_OEM_CLEAR ),
KEYNAME("file://",'//'),
KEYNAME("-",'-'),
KEYNAME("=",'='),
KEYNAME("[",'['),
KEYNAME("]",']'),
KEYNAME(";",';'),
KEYNAME("\'",'\''),
KEYNAME(",",','),
KEYNAME(".",'.'),
KEYNAME("/",'/'),
KEYNAME("`",'`')
};
銆銆鍦ㄧ被CDlgAccelEdit涓搷搴擶indows娑堟伅錛歐M_INITDIALOD錛屼唬鐮佸涓嬶細
BOOL CDlgEditAccel::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetWindowText("Edit Accelerator Table");
int iCount=m_AccelList.GetSize();
int i;
for(i=0;i<iCount;i++){
m_LstCmd.AddString(m_AccelList[i].m_strCmd);
}
for(i=0;i<sizeof(key)/sizeof(KEYNAME);i++)
{
m_LstKey.AddString(key[i].m_strName);
}
m_LstCmd.SetCurSel(0);
OnSelchangeLstCmd();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
銆銆涓虹被CDglAccelEdit澧炲姞涓涓繚鎶ゆ垚鍛樺嚱鏁幫細
void SaveChange(int index=-1);
銆銆鍦ㄦ枃浠禗lgAccelEdit涓畾涔夎鍑芥暟錛屼唬鐮佸涓嬶細
void CDlgEditAccel::SaveChange(int index)
{
if(index>=0||(index=m_LstCmd.GetCurSel())>=0)
{
if(m_LstKey.GetCurSel()<0){
AfxMessageBox("浣犲繀闇閫夋嫨涓涓敭鐮?");
return;
}
BYTE btCmp=((m_ChkAlt.GetCheck()==1)?FALT:NULL)|
((m_ChkCtrl.GetCheck()==1)?FCONTROL:NULL)|
((m_ChkShift.GetCheck()==1)?FSHIFT:NULL)|FVIRTKEY;
WORD wKey=key[m_LstKey.GetCurSel()].m_wID;
m_AccelList[index].m_Accel.fVirt=btCmp;
m_AccelList[index].m_Accel.key=wKey;
return;
}
}
銆銆鍝嶅簲鍒楄〃妗咺D_LST_CMD鐨勯氱煡娑堟伅“LBN_SELCHANGE”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnSelchangeLstCmd()
{
// TODO: Add your control notification handler code here
int iCmd=m_LstCmd.GetCurSel();
WORD wKey=m_AccelList[iCmd].m_Accel.key;
BYTE btCmp=m_AccelList[iCmd].m_Accel.fVirt;
m_ChkAlt.SetCheck(btCmp&FALT);
m_ChkCtrl.SetCheck(btCmp&FCONTROL);
m_ChkShift.SetCheck(btCmp&FSHIFT);
int iCount=sizeof(key)/sizeof(KEYNAME);
int id=-1;
for(int i=0;i<iCount;i++)
{
if(key[i].m_wID==wKey){
id=i;
break;
}
}
m_LstKey.SetCurSel(id);
}
銆銆鍝嶅簲鍒楄〃妗咺D_LST_KEY鐨勯氱煡娑堟伅“LBN_SELCHANGE”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnSelchangeLstKey()
{
SaveChange();
}
銆銆鍝嶅簲鏍擱夋ID_CHK_ALT鐨勯氱煡娑堟伅“BN_CLICKED”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnChkAlt()
{
SaveChange();
}
銆銆鍝嶅簲鏍擱夋ID_CHK_SHIFT鐨勯氱煡娑堟伅“BN_CLICKED”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnChkShift()
{
SaveChange();
}
銆銆鍝嶅簲鏍擱夋ID_CHK_CTRL鐨勯氱煡娑堟伅“BN_CLICKED”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnChkCtrl()
{
SaveChange();
}
銆銆鑷蟲錛岀敤浜庣紪杈?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鐨勫璇濇宸茬粡瀹屾垚銆傛垜浠幇鍦ㄨ鍋氱殑灝辨槸鍦ㄧ▼搴忎腑鎵撳紑瀵硅瘽妗嗘潵緙栬緫浜嗐傝鎴戜滑鍥炲埌CMainFrame綾諱腑銆傛垜浠皢鍦ㄨ綾諱腑鍝嶅簲涓涓懡浠ゆ潵鎵撳紑緙栬緫瀵硅瘽妗嗭紝瀵?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ繘琛岀紪杈戙傚畬鎴愬悗鐐規(guī)寜OK鍥炲埌涓葷▼搴忎腑錛岀劧鍚庢洿鏂?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ傝繖鏍峰悗錛屾垜浠垰鍒氱紪杈戝ソ鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ氨寮濮嬭搗浣滅敤浜嗐?br>銆銆棣栧厛錛屾墦寮鑿滃崟銆傚湪“鏌ョ湅”欏瑰悗澧炲姞涓涓?#8220;宸ュ叿(&T)”涓嬫媺鑿滃崟錛屽湪涓嬫媺鑿滃崟涓鍔犱竴涓簡鑿滃崟錛?#8220;緙栬緫鍔犻熼敭琛?&A)...”錛孖D涓?#8220;ID_TOOL_ACCELEDIT”銆傛墦寮綾誨悜瀵鹼紝閫夋嫨CMainFrame綾伙紝鍝嶅簲“ID_TOOL_ACCELEDIT”鍛戒護銆傜紪杈戝搷搴斿嚱鏁板涓嬶細
void CMainFrame::OnToolAcceledit()
{
// TODO: Add your command handler code here
CDlgEditAccel dlg;
DWORD i;
dlg.m_AccelList.SetSize(m_dwAccelCount);
for(i=0;i<m_dwAccelCount;i++){
dlg.m_AccelList[i].m_strCmd=m_lpAccel[i].cCmd;
dlg.m_AccelList[i].m_Accel=m_lpAccel[i].accel;
}
if(IDOK==dlg.DoModal()){
ACCEL* pAccel=new ACCEL[m_dwAccelCount];
for(DWORD dw=0;dw<m_dwAccelCount;dw++){
m_lpAccel[dw].accel=pAccel[dw]=dlg.m_AccelList[dw].m_Accel;
}
if(m_hActAccel!=NULL)
DestroyAcceleratorTable(m_hActAccel);
m_hActAccel=CreateAcceleratorTable(pAccel,m_dwAccelCount);
}
}
銆銆鍦ㄨ鏂囦歡鐨勫ご閮ㄥ寘鍚被CDlgEditAccel鐨勫ご鏂囦歡錛?/p>
#include "DlgEditAccel.h"
銆銆鑷蟲錛屽彲緙栬緫鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ凡緇忓畬鎴愪簡銆備笉濡ㄨ瘯璇曠湅銆?/p>
銆銆涓夈佸皢鍔犻熼敭琛ㄤ繚瀛樿嚦鏂囦歡錛屽茍鍦ㄧ▼搴忚繍琛屾椂鑷姩浠庢枃浠朵腑鍔犺澆銆?/p>
銆銆涓婇潰鎴戜滑瀹炵幇浜嗗彲緙栬緫鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ備絾鏄紝褰撶▼搴忛鍑哄悗錛屾垜浠紪杈戣繃鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鏁版嵁灝辨秷澶變簡錛屼笅嬈¤繍琛岀▼搴忔椂榪樻槸鍜屼互鍓嶄竴鏍蜂簡銆傚皢鍔犻熼敭琛ㄤ繚瀛樿搗鏉ヤ互澶囦笅嬈′嬌鐢紝榪欐槸鎴戜滑鎵甯屾湜鐨勩備笅闈㈣璁虹殑鏂規(guī)硶鏄嬌鐢ㄦ枃浠舵潵淇濆瓨鎴戜滑鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ?br>銆銆棣栧厛錛屽湪MainFrm.cpp鏂囦歡鐨勫ご閮ㄥ畾涔変竴涓叏灞瀛楃涓詫紝涔熷氨鏄敤浜庝繚瀛?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鐨勬枃浠跺悕錛?/p>
static char strAccelFileName[]="Accel.cus";
銆銆瀹氫箟涓涓狣WORD鍊間綔涓烘枃浠跺ご錛屾垜浠氳繃璇WORD鍊兼潵鍒ゆ柇鏄惁鏄竴涓湁鏁堟牸寮忕殑鏂囦歡錛?/p>
#define ACCEL_FILE_HEAD 0x00434341
銆銆鍏舵錛屼負CMainFrame綾繪坊鍔犱竴涓繚鎶ょ殑鎴愬憳鍑芥暟錛?#8220;BOOL SaveAccel()”錛岀紪杈戝叾浠g爜濡備笅錛?br>BOOL CMainFrame::SaveAccel()
{
char lpAppName[256];
char lpAppPath[256];
char* lpFilePart=NULL;
GetModuleFileName(AfxGetInstanceHandle(),lpAppName,255);
GetFullPathName(lpAppName,255,lpAppPath,&lpFilePart);
TRACE1("Application File Name:%s.\n",lpAppName);
strcpy(lpFilePart,strAccelFileName);
TRACE1("Accelerator File Name:%s.\n",lpAppPath);
try
{
DWORD dwHead=ACCEL_FILE_HEAD;
DWORD dwCount=m_dwAccelCount;
CFile fAccel(lpAppPath,CFile::modeCreate|CFile::modeWrite);
fAccel.SeekToBegin();
fAccel.Write(&dwHead,sizeof(DWORD));
fAccel.Write(&dwCount,sizeof(DWORD));
for(DWORD dw=0;dw<dwCount;dw++)
{
fAccel.Write(m_lpAccel+dw,sizeof(ACCELITEM));
}
return TRUE;
}
catch(CFileException* e)
{
char buf[256];
char buf2[512];
int iError;
iError=e->m_cause;
e->GetErrorMessage(buf,256);
sprintf(buf2,"灝?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄤ繚瀛樺埌鏂囦歡 \"%s\" 涓椂鍙戠敓閿欒!\n"
"閿?璇?鍙?%d\n"
"閿欒鎻忚堪:%s\n"
"\0",
strAccelFileName,iError,buf);
AfxMessageBox(buf2,MB_OK|MB_ICONSTOP|MB_DEFBUTTON1);
return FALSE;
}
}
銆銆鍐嶆錛屼慨鏀筁oadAccel()鍑芥暟濡備笅錛?/p>
BOOL CMainFrame::LoadAccel()
{
char lpAppName[256];
char lpAppPath[256];
char* lpFilePart=NULL;
GetModuleFileName(AfxGetInstanceHandle(),lpAppName,255);
GetFullPathName(lpAppName,255,lpAppPath,&lpFilePart);
TRACE1("Application File Name:%s.\n",lpAppName);
strcpy(lpFilePart,strAccelFileName);
TRACE1("Accelerator File Name:%s.\n",lpAppPath);
try
{
DWORD dwHead;
DWORD dwCount;
CFile fAccel(lpAppPath,CFile::modeRead);
fAccel.SeekToBegin();
if(fAccel.Read(&dwHead,sizeof(DWORD))!=sizeof(DWORD))
AfxThrowFileException(CFileException::endOfFile,12,lpAppPath);
if(dwHead!=ACCEL_FILE_HEAD)
AfxThrowFileException(CFileException::invalidFile,13,lpAppPath);
if(fAccel.Read(&dwCount,sizeof(DWORD))!=sizeof(DWORD))
AfxThrowFileException(CFileException::endOfFile,12,lpAppPath);
ASSERT(m_lpAccel==NULL);
m_lpAccel=new ACCELITEM[dwCount];
memset(m_lpAccel,0,sizeof(ACCELITEM)*dwCount);
m_dwAccelCount=dwCount;
for(DWORD dw=0;dw<dwCount;dw++)
{
if(fAccel.Read(m_lpAccel+dw,sizeof(ACCELITEM))!=sizeof(ACCELITEM))
AfxThrowFileException(CFileException::endOfFile,12,lpAppPath);
}
ACCEL* pAccel=new ACCEL[dwCount];
for(dw=0;dw<dwCount;dw++){
pAccel[dw]=m_lpAccel[dw].accel;
}
m_hActAccel=CreateAcceleratorTable(pAccel,dwCount);
return TRUE;
}
catch(CFileException* e)
{
char buf[256];
char buf2[512];
int iError;
iError=e->m_cause;
e->GetErrorMessage(buf,256);
sprintf(buf2,"浠庢枃浠?\"%s\" 涓姞杞?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄦ椂鍙戠敓閿欒!\n"
"閿?璇?鍙?%d\n"
"閿欒鎻忚堪:%s\n"
"鏄惁鐢熸垚榛樿鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛?\n\0",
strAccelFileName,iError,buf);
if(IDYES==AfxMessageBox(buf2,MB_YESNO|MB_SYSTEMMODAL|MB_ICONSTOP|MB_DEFBUTTON1))
{
ASSERT(m_hActAccel==NULL);
ASSERT(m_lpAccel==NULL);
m_dwAccelCount=sizeof(accel)/sizeof(ACCEL);
m_lpAccel=new ACCELITEM[m_dwAccelCount];
memset(m_lpAccel,0,sizeof(ACCELITEM)*m_dwAccelCount);
DWORD dwCmdStr=sizeof(strCmd)/sizeof(char[30]);
for(DWORD dw=0;dw<m_dwAccelCount;dw++){
m_lpAccel[dw].accel=accel[dw];
strcpy(m_lpAccel[dw].cCmd,dw<dwCmdStr?strCmd[dw]:"Command Unknow");
}
m_hActAccel=CreateAcceleratorTable(accel,m_dwAccelCount);
SaveAccel();
return TRUE;
}
return FALSE;
}
}
銆銆鏈鍚庯紝鍦―estroyWindow()鍑芥暟澶撮儴澧炲姞瀵筍aveAccel()鍑芥暟鐨勮皟鐢細
SaveAccel();
...
銆銆濂戒簡錛屼綘鑷繁鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鏁版嵁宸茬粡鑳戒繚瀛樺湪鏂囦歡涓簡錛屽茍鑳戒粠涓紜姞杞姐傚鏋滄枃浠朵笉瀛樺湪鎴栫▼搴忚鍙栨椂鍙戠幇閿欒鍒欐彁閱掍綘鏄惁寤虹珛緙虹渷鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛紝濡備綘紜鐨勮瘽鍒欑敓鎴愮己鐪佺殑鍔犻熼敭琛ㄥ茍绔嬪埢淇濆瓨鑷蟲枃浠朵腑銆?br>銆銆鐢變簬姘村鉤鏈夐檺錛屽叾涓毦鍏嶆湁璇紝嬈㈣繋鎵硅瘎鎸囨銆佸彂琛ㄤ綘鐨勬剰瑙併傛湰浜轟笉鑳滄劅嬋銆?br>
涓嬈″伓鐒剁殑鎯呭喌涓嬫垜鍙戠幇浠ヤ笅浠g爜绔熺劧鏃犳硶琚紪璇戦氳繃錛堝鏋滀綘鐨勭紪璇戝櫒錛屾瘮濡俈C6鎴朧C2003錛屽厑璁稿畠緙栬瘧閫氳繃錛屾垜鎯充綘棣栧厛搴旇鎹釜緙栬瘧鍣紝姣斿GCC鎴朧C2005錛夛細
void foo( const char* [] ) { }
int main( void )
{
char* s[2];
foo( s );
}
綆鍖栨垚鏇翠竴鑸殑褰㈠紡鏄細
char** p1 = 0;
const char** p2 = p1;
閿欒鏄細invalid conversion from `char**' to `const char**'.
lostpencil鏇村姞浠旂粏錛屼嬌鐢–緙栬瘧鍣ㄧ粰鍑虹殑鏄竴涓鍛婏細
initialization from incompatible pointer type.
闅忓悗hpho緇欏嚭浜嗗悎鐞嗙殑瑙i噴錛屽悓鏃?a target=_blank>comp.lang.c++.moderated涓婄殑Ulrich Eckhardt涔熺敤浠g爜榪涜浜嗚鏄庛?/p>
鐢ㄤ唬鐮佹潵璇存槑鏈鐩磋浜嗭細
const char* s = "abc";
int main( void )
{
char* p0 = 0;
char** p1 = &p0;
const char** p2 = p1; // 鍏堝亣璁捐繖涓鍙ユ槸鍚堟硶鐨?( 嫻嬭瘯鏃訛紝鍙互鍏堝己鍒剁被鍨?strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">杞?/strong>鍖栦竴涓?)
*p2 = s;
*p0 = 'A'; // 閫氳繃p0鍦ㄤ慨鏀逛笉搴旇琚慨鏀圭殑s錛岃繖鏄劇劧鍜?strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">const鐩歌繚鑳岋紝鍏惰繍琛岀粨鏋滀笉鍙煡銆?br>}
鐪嬩簡 **鐨?鎯沖埌鐨?br>tekyDec 29, 2005 - Show original item
鐪嬪畬鍚?鏄庣櫧**璁茬殑涓轟粈涔?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">char** 涓嶈兘鑷姩杞?/strong>鍖栦負 const char**,(鍘熸枃)浣嗗鎴戝獎鍝嶆渶娣辯殑鏄笅闈㈢殑璇?
==================================================================
char *p="abc" 鑳戒笉鑳界紪璇戦氳繃瑕佺湅浣犱嬌鐢ㄧ殑緙栬瘧鍣ㄣ傞壌浜庡ぇ閲忛仐鐣欎唬鐮佺殑瀛樺湪錛屽ぇ閮ㄥ垎緙栬瘧鍣ㄥ厑璁稿叾閫氳繃錛屾垨鑰呯粰涓鍛娿傚綋鐒訛紝紼嬪簭鍛樿嚜宸卞繀欏諱繚璇佺粷涓嶅幓淇敼鍏跺箋?
紼嬪簭鍛樹笉搴旇鍦ㄤ唬鐮佷腑鍑虹幇*p='A'榪欐牱鐨勮鍙ャ傝繖鏄綋鍒濈害瀹氬ソ浜嗙殑錛氱紪璇戝櫒鍏佽char *p="abc"閫氳繃錛岃岀▼搴忓憳淇濊瘉涓嶅幓淇敼瀹冦?
b. *p='A'緙栬瘧鏃跺簲璇ュ厑璁擱氳繃錛屽洜涓哄崟灝辮繖鏉¤鍙ヨ岃█錛屽畠瀹屽叏鍚堟硶銆?
c. 榪愯鏃?p='A'鑳戒笉鑳介氳繃瑕佺湅瀹為檯鐨勮繍琛岀幆澧冿紝鍖呮嫭浣犱嬌鐢ㄧ殑鎿嶄綔緋葷粺銆佺紪璇戝櫒銆佺紪璇戝櫒閫夐」 絳夌瓑錛屼竴鍙ヨ瘽錛屽叾榪愯緇撴灉鐢變笉寰椾綘錛屼笖涓嶅簲璇ョ敱浣犲幓鍏沖績錛屽洜涓鴻繖縐嶈涓烘湰韜凡緇忚繚鍙嶇害瀹氫簡銆?
==================================================================
宸ヤ綔鍏崇郴鍚?鐢–String 鍜宻tring鐢ㄧ殑澶浜?寰堝皯榪欐牱瀹氫箟瀛楃涓?char *p=“abcde“浜?br>鍖濅竴鐪?榪樹笉閫傚簲,:(,娓愭笎鐨勫洖鎯蟲墠鎯寵搗涓浜涙潵(鍝?榪樻槸澶敓鐤?璧跺揩鍐欎笅鏉?浠ュ悗鍒繕浜?
榪欐牱瀹氫箟鐨勫瓧絎︿覆char *p=“abcde“ ; char *p1=“123445667“;
姝e涓婇潰鎻愬埌鐨勬槸涓嶈兘鍐?*p='A',榪愯鐨勬椂鍊欎細鍑洪敊,鍚屾牱,strcpy(p,p1)涔熶細鍑洪敊鍝?
"abcde"瀛楃涓插彲浠ョ湅鍋氭槸涓父閲忓瓧絎︿覆浜?鏄笉鑳借淇敼鐨?
浣嗗鏋?char p[]=“abcde“ 榪欐牱瀹氫箟,灝辨病鏈夐棶棰?浣犲彲浠ヤ慨鏀?p='A',鍙涓嶈秺鐣屽氨ok.
騫朵笖鍙戠幇榪欐牱涓ょ瀹氫箟
char *p=“abcde“
char p[]=“abcde“
鍦ㄨ繍琛岀殑鏃跺?p鎸囧悜鐨勫湴鍧涔熶笉鏄竴鏍風殑,鍙char *p=“abcde“榪樻槸鏈夌壒孌婄殑澶勭悊 :),鍏蜂綋鎬庝箞澶勭悊灝變笉鐭ラ亾浜?楂樻墜璇鋒寚鏁?)
闅忕潃嫻嬭瘯,鍙堝彂鐜頒釜闂,鍙兘鏄釜鑰侀棶棰樹簡鍚?
int main(int argc, char* argv[])
{
int t[10];
char p1[7]="123456";
const char *p2="1234567890123213123";
int len(0);
//*p1='C'; err
len=strlen(p1);
printf("%d\n",len);
strcpy(p1,p2); ///??????????
printf("%s\n",p1);
len=strlen(p1);
printf("%d\n",len);
return 0;
}
鎴戝畾涔夌殑鏄?涓瓧絎︽暟緇? 浣嗙敤strcpy鎶妏2鎷峰埌p1涓?p1鏄斁涓嶄笅鐨?浣嗙▼搴忓嵈姝e父鎵ц,warning ,err閮芥病鏈?榪愯涔熸甯?
杈撳嚭
6
1234567890123213123
19
搴旇鏄嬌鐢ㄥ唴瀛樿秺鐣屼簡闃??鎬庝箞浼氭甯歌繍琛屽憿?
闅鵑亾瀵逛簬鍐呭瓨瓚婄晫鐨勪嬌鐢?榪愭皵濂芥墠宕╂簝琛ㄧ幇鍑烘潵,榪愭皵涓嶅ソ灝辨甯歌繍琛??
posted on 2006-02-22 13:04 Vincent.Chen 闃呰(232) 璇勮(0) 緙栬緫 鏀惰棌 鎵灞炲垎綾? 鏉?/font>
榪樻槸鏉ヨ璇村師鐞嗘妸(鏈漢涔熸槸鑿滈笩鍟?!
榪滅▼娉ㄥ叆灝辨槸鍦ㄧ洰鏍囪繘紼嬩腑鐢╒irtualAllocEx鐢寵涓孌靛唴瀛?
鐒跺悗鐢╓riteProcessMemory鍑芥暟灝嗚嚜宸眃ll鐨勫畬鏁磋礬寰勫鍒跺埌榪滅▼榪涚▼涓?
鐒跺悗鍦↘ernel32涓綆桳oadLibraryA鐨勫湴鍧,鍐嶈皟鐢↙oadLibraryA鍑芥暟鍔犺澆榪滅▼dll,
騫跺湪CreateRemoteThread鍒涘緩榪滅▼榪涚▼!
Code Language : C
#include \"stdafx.h\"
#include \"windows.h\"
#include \"tlhelp32.h\"
#include \"stdio.h\"
#pragma comment(lib,\"ws2_32\")
int EnableDebugPriv(const char * name)//鎻愭彁鏉冨嚱鏁?br>{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
//鎵撳紑榪涚▼浠ょ墝鐜?br> if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
&hToken))
{
MessageBox(NULL,\"OpenProcessToken Error!\",\"Error!\",MB_OK);
return 1;
}
//鑾峰緱榪涚▼鏈湴鍞竴ID
if(!LookupPrivilegeValue(NULL,name,&luid))
{
MessageBox(NULL,\"LookupPrivivlegeValue Error!\",\"Error\",MB_OK);
}
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
//璋冩暣鏉冮檺
if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
MessageBox(NULL,\"AdjustTokenPrivileges Error!\",\"Error\",MB_OK);
return 1;
}
return 0;
}
BOOL injectit(const char *DllPath,const DWORD dwRemoteProcessld)//娉ㄥ叆涓誨嚱鏁?br>{
HANDLE hrp;
if(EnableDebugPriv(SE_DEBUG_NAME))
{
MessageBox(NULL,\"Add Privilege Error!\",\"Error\",MB_OK);
return FALSE;
}
if((hrp=OpenProcess(PROCESS_CREATE_THREAD|//鍏佽榪滅▼鍒涘緩綰跨▼
PROCESS_VM_OPERATION|//鍏佽榪滅▼VM鎿嶄綔
PROCESS_VM_WRITE,//鍏佽榪滅▼VM鍐?br> FALSE,dwRemoteProcessld))==NULL)
{
MessageBox(NULL,\"OpenProcess Error!\",\"Error\",MB_OK);
return FALSE;
}
char *psLibFileRemote;
//浣跨敤VirtualAllocEx鍑芥暟鍦ㄨ繙紼嬭繘紼嬬殑鍐呭瓨鍦板潃絀洪棿鍒嗛厤DLL鏂囦歡鍚嶇紦鍐?br> psLibFileRemote=(char *)VirtualAllocEx(hrp,NULL,lstrlen(DllPath)+1,
MEM_COMMIT,PAGE_READWRITE);
if(psLibFileRemote==NULL)
{
MessageBox(NULL,\"VirtualAllocEx Error!\",\"Error\",MB_OK);
return FALSE;
}
//浣跨敤WriteProcessMemory鍑芥暟灝咲LL鐨勮礬寰勫悕澶嶅埗鍒拌繙紼嬬殑鍐呭瓨絀洪棿
if(WriteProcessMemory(hrp,psLibFileRemote,(void *)DllPath,lstrlen(DllPath)+1,NULL)==0)
{
MessageBox(NULL,\"WriteProcessMemory Error!\",\"Error\",MB_OK);
return FALSE;
}
//璁$畻LoadLibraryA鐨勫叆鍙e湴鍧
PTHREAD_START_ROUTINE pfnStartAddr=(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT(\"Kernel32\")),\"LoadLibraryA\");
if(pfnStartAddr==NULL)
{
MessageBox(NULL,\"GetProcAddress Error!\",\"Error\",MB_OK);
return FALSE;
}
//pfnStartAddr鍦板潃灝辨槸LoadLibraryA鐨勫叆鍙e湴鍧
HANDLE hrt;
if((hrt=CreateRemoteThread(hrp,
NULL,
0,
pfnStartAddr,
psLibFileRemote,
0,
NULL))==NULL)
{
MessageBox(NULL,\"CreateRemote Error!\",\"Error\",MB_OK);
return FALSE;
}
return TRUE;
}
unsigned long getpid(char *pn)//寰楀埌榪涚▼pid
{
BOOL b;
HANDLE hnd;
PROCESSENTRY32 pe;
//寰楀埌榪涚▼蹇収
hnd=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize=sizeof(pe);
b=Process32First(hnd,&pe);
while(b)
{
if(strcmp(pn,pe.szExeFile)==0)
return pe.th32ProcessID;
b=Process32Next(hnd,&pe);
}
}
int main(int argc, char* argv[])
{
if(argc<2)
{
printf(\"++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\");
printf(\"injectpro V1.0!\nAuthor:text QQ:52674548\nusage:\n injectpro.exe targetprocess youdll\n\");
printf(\" eg:injectpro.exe iexplorer.exe c:\\youdll.dll\n\");
printf(\"++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\");
return 0;
}
EnableDebugPriv(SE_DEBUG_NAME);//鑷韓鎻愭潈
DWORD pid=getpid(argv[1]);
//printf(\"%d\",pid);
if(pid==0)
return 1;
if(injectit(argv[2],pid))
{
printf(\"inject success!\");
}
else
{
printf(\"inject error!\");
}
return 0;
}
鏈瘒鏂囩珷鏉ユ簮浜?榛戝弽鍦ㄧ嚎-淇℃伅瀹夊叏絎竴绔?鍘熸枃閾炬帴錛?a >http://www.hf110.com/hack/hackprg/200809/203556.html
int WideCharToMultiByte (
UINT CodePage, //1 Unicode緙栫爜鐨勫瓧絎﹂〉錛孶nicode緙栫爜鏈夊瓧絎﹂〉鐨勬蹇碉紝姣斿gb2312/936錛宐ig5/950絳?/span>
DWORD dwFlags, //2 濡備綍澶勭悊澶嶅悎unicode瀛楃錛岃緇嗘煡google
LPCWSTR lpWideCharStr, //3 寰呰漿鎹㈢殑unicode涓?/span>
int cchWideChar, //4 琛ㄧず鍙傛暟3鐨勯暱搴?nbsp; 浼犻?1琛ㄧず浠?x00緇撳熬
LPSTR lpMultiByteStr, //5 鎺ュ彈杞崲鍚庣殑涓茬殑瀛楃緙撳啿
int cbMultiByte, //6 琛ㄧず鍙傛暟5lpMutiByteStr鐨勫瓧鑺傚ぇ灝?nbsp;閫氬父sizeof涓涓?/span>
LPCSTR lpDefaultChar, //7 NULL 鍏蜂綋google
LPBOOL lpUsedDefaultChar//8 NULL 鍏蜂綋google
);
2. 璋冪敤CRT鍑芥暟wcstombs()
size_t wcstombs (
char* mbstr,
const wchar_t* wcstr,
size_t count );
3. 浣跨敤CString鏋勯犲櫒鎴栬祴鍊兼搷浣?/p>
// 鍋囪鏈変竴涓猆nicode涓瞱szSomeString

CString str1 ( wszSomeString ); // 鐢ㄦ瀯閫犲櫒杞崲
CString str2;
str2 = wszSomeString; // 鐢ㄨ祴鍊兼搷浣滆漿鎹?/span>
4. 浣跨敤ATL涓茶漿鎹㈠畯
#include <atlconv.h>
// 榪樻槸鍋囪鏈変竴涓猆nicode涓瞱szSomeString



{
char szANSIString [MAX_PATH];
USES_CONVERSION; // 澹版槑榪欎釜瀹忚浣跨敤鐨勫眬閮ㄥ彉閲?/span>
lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}銆銆閭d箞浠涔堟槸BSTR銆丩PSTR浠ュ強LPWSTR鍛紵
銆銆BSTR(Basic STRing錛孊asic瀛楃涓?鏄竴涓狾LECHAR*綾誨瀷鐨刄nicode瀛楃涓層傚畠琚弿榪版垚涓涓笌鑷姩鍖栫浉鍏煎鐨勭被鍨嬨傜敱浜庢搷浣滅郴緇熸彁渚涚浉搴旂殑API鍑芥暟(濡係ysAllocString)鏉ョ鐞嗗畠浠ュ強涓浜涢粯璁ょ殑璋冨害浠g爜錛屽洜姝STR瀹為檯涓婂氨鏄竴涓狢OM瀛楃涓詫紝浣嗗畠鍗村湪鑷姩鍖栨妧鏈互澶栫殑澶氱鍦哄悎涓嬪緱鍒板箍娉涗嬌鐢ㄣ傚浘1鎻忚堪浜咮STR鐨勭粨鏋勶紝鍏朵腑DWORD鍊兼槸瀛楃涓蹭腑瀹為檯鎵鍗犵敤鐨勫瓧鑺傛暟錛屼笖瀹冪殑鍊兼槸瀛楃涓蹭腑Unicode瀛楃鐨勪袱鍊嶃?/p>
銆銆LPSTR鍜孡PWSTR鏄疻in32鍜孷C++鎵浣跨敤鐨勪竴縐嶅瓧絎︿覆鏁版嵁綾誨瀷銆侺PSTR琚畾涔夋垚鏄竴涓寚鍚戜互NULL(‘\0’)緇撳熬鐨?浣岮NSI瀛楃鏁扮粍鎸囬拡錛岃孡PWSTR鏄竴涓寚鍚戜互NULL緇撳熬鐨?6浣嶅弻瀛楄妭瀛楃鏁扮粍鎸囬拡銆傚湪VC++涓紝榪樻湁綾諱技鐨勫瓧絎︿覆綾誨瀷錛屽LPTSTR銆丩PCTSTR絳夛紝瀹冧滑鐨勫惈涔夊鍥?鎵紺恒?/p>
銆銆渚嬪錛孡PCTSTR鏄寚“long pointer to a constant generic string”錛岃〃紺?#8220;涓涓寚鍚戜竴鑸瓧絎︿覆甯擱噺鐨勯暱鎸囬拡綾誨瀷”錛屼笌C/C++鐨刢onst char*鐩告槧灝勶紝鑰孡PTSTR鏄犲皠涓?char*銆?/p>
銆銆涓鑸湴錛岃繕鏈変笅鍒楃被鍨嬪畾涔夛細
#ifdef UNICODE
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
浜屻丆String銆丆StringA 鍜?CStringW
銆銆Visual C++.NET涓皢CStringT浣滀負ATL鍜孧FC鐨勫叡浜殑“涓鑸?#8221;瀛楃涓茬被錛屽畠鏈塁String銆丆StringA鍜孋StringW涓夌褰㈠紡錛屽垎鍒搷浣滀笉鍚屽瓧絎︾被鍨嬬殑瀛楃涓層傝繖浜涘瓧絎︾被鍨嬫槸TCHAR銆乧har鍜寃char_t銆俆CHAR鍦║nicode騫沖彴涓瓑鍚屼簬WCHAR(16浣峌nicode瀛楃)錛屽湪ANSI涓瓑浠蜂簬char銆倃char_t閫氬父瀹氫箟涓簎nsigned short銆傜敱浜嶤String鍦∕FC搴旂敤紼嬪簭涓粡甯哥敤鍒幫紝榪欓噷涓嶅啀閲嶅銆?/p>
涓夈乂ARIANT銆丆OleVariant 鍜宊variant_t
銆銆鍦∣LE銆丄ctiveX鍜孋OM涓紝VARIANT鏁版嵁綾誨瀷鎻愪緵浜嗕竴縐嶉潪甯告湁鏁堢殑鏈哄埗錛岀敱浜庡畠鏃㈠寘鍚簡鏁版嵁鏈韓錛屼篃鍖呭惈浜嗘暟鎹殑綾誨瀷錛屽洜鑰屽畠鍙互瀹炵幇鍚勭涓嶅悓鐨勮嚜鍔ㄥ寲鏁版嵁鐨勪紶杈撱備笅闈㈣鎴戜滑鏉ョ湅鐪婳AIDL.H鏂囦歡涓璙ARIANT瀹氫箟鐨勪竴涓畝鍖栫増錛?/p>
struct tagVARIANT {
VARTYPE vt;
union {
short iVal; // VT_I2.
long lVal; // VT_I4.
float fltVal; // VT_R4.
double dblVal; // VT_R8.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR.
…
short * piVal; // VT_BYREF|VT_I2.
long * plVal; // VT_BYREF|VT_I4.
float * pfltVal; // VT_BYREF|VT_R4.
double * pdblVal; // VT_BYREF|VT_R8.
DATE * pdate; // VT_BYREF|VT_DATE.
BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
};
};
銆銆鏄劇劧錛孷ARIANT綾誨瀷鏄竴涓狢緇撴瀯錛屽畠鍖呭惈浜嗕竴涓被鍨嬫垚鍛榲t銆佷竴浜涗繚鐣欏瓧鑺備互鍙婁竴涓ぇ鐨剈nion綾誨瀷銆備緥濡傦紝濡傛灉vt涓篤T_I2錛岄偅涔堟垜浠彲浠ヤ粠iVal涓鍑篤ARIANT鐨勫箋傚悓鏍鳳紝褰撶粰涓涓猇ARIANT鍙橀噺璧嬪兼椂錛屼篃瑕佸厛鎸囨槑鍏剁被鍨嬨備緥濡傦細
VARIANT va;
:: VariantInit(&va); // 鍒濆鍖?br>int a = 2002;
va.vt = VT_I4; // 鎸囨槑long鏁版嵁綾誨瀷
va.lVal = a; // 璧嬪?/p>
銆銆涓轟簡鏂逛究澶勭悊VARIANT綾誨瀷鐨勫彉閲忥紝Windows榪樻彁渚涗簡榪欐牱涓浜涢潪甯告湁鐢ㄧ殑鍑芥暟錛?/p>
銆銆VariantInit 鈥斺?灝嗗彉閲忓垵濮嬪寲涓篤T_EMPTY錛?/p>
銆銆VariantClear 鈥斺?娑堥櫎騫跺垵濮嬪寲VARIANT錛?/p>
銆銆VariantChangeType 鈥斺?鏀瑰彉VARIANT鐨勭被鍨嬶紱
銆銆VariantCopy 鈥斺?閲婃斁涓庣洰鏍嘨ARIANT鐩歌繛鐨勫唴瀛樺茍澶嶅埗婧怴ARIANT銆?/p>
銆銆COleVariant綾繪槸瀵筕ARIANT緇撴瀯鐨勫皝瑁呫傚畠鐨勬瀯閫犲嚱鏁板叿鏈夋瀬涓哄己澶уぇ鐨勫姛鑳斤紝褰撳璞℃瀯閫犳椂棣栧厛璋冪敤VariantInit榪涜鍒濆鍖栵紝鐒跺悗鏍規(guī)嵁鍙傛暟涓殑鏍囧噯綾誨瀷璋冪敤鐩稿簲鐨勬瀯閫犲嚱鏁幫紝騫朵嬌鐢╒ariantCopy榪涜杞崲璧嬪兼搷浣滐紝褰揤ARIANT瀵硅薄涓嶅湪鏈夋晥鑼冨洿鏃訛紝瀹冪殑鏋愭瀯鍑芥暟灝變細琚嚜鍔ㄨ皟鐢紝鐢變簬鏋愭瀯鍑芥暟璋冪敤浜哣ariantClear錛屽洜鑰岀浉搴旂殑鍐呭瓨灝變細琚嚜鍔ㄦ竻闄ゃ傞櫎姝や箣澶栵紝COleVariant鐨勮祴鍊兼搷浣滅鍦ㄤ笌VARIANT綾誨瀷杞崲涓負鎴戜滑鎻愪緵鏋佸ぇ鐨勬柟渚褲備緥濡備笅闈㈢殑浠g爜錛?/p>
COleVariant v1("This is a test"); // 鐩存帴鏋勯?br>COleVariant v2 = "This is a test";
// 緇撴灉鏄疺T_BSTR綾誨瀷錛屽間負"This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// 緇撴灉鏄疺T_I4綾誨瀷錛屽間負2002
銆銆_variant_t鏄竴涓敤浜嶤OM鐨刅ARIANT綾伙紝瀹冪殑鍔熻兘涓嶤OleVariant鐩鎬技銆備笉榪囧湪Visual C++.NET鐨凪FC搴旂敤紼嬪簭涓嬌鐢ㄦ椂闇瑕佸湪浠g爜鏂囦歡鍓嶉潰娣誨姞涓嬪垪涓ゅ彞錛?/p>
銆銆#include "comutil.h"
銆銆#pragma comment( lib, "comsupp.lib" )
鍥涖丆ComBSTR鍜宊bstr_t
銆銆CComBSTR鏄BSTR鏁版嵁綾誨瀷灝佽鐨勪竴涓狝TL綾伙紝瀹冪殑鎿嶄綔姣旇緝鏂逛究銆備緥濡傦細
CComBSTR bstr1;
bstr1 = "Bye"; // 鐩存帴璧嬪?br>OLECHAR* str = OLESTR("ta ta"); // 闀垮害涓?鐨勫瀛楃
CComBSTR bstr2(wcslen(str)); // 瀹氫箟闀垮害涓?
wcscpy(bstr2.m_str, str); // 灝嗗瀛楃涓插鍒跺埌BSTR涓?br>CComBSTR bstr3(5, OLESTR("Hello World"));
CComBSTR bstr4(5, "Hello World");
CComBSTR bstr5(OLESTR("Hey there"));
CComBSTR bstr6("Hey there");
CComBSTR bstr7(bstr6);
// 鏋勯犳椂澶嶅埗錛屽唴瀹逛負"Hey there"
銆銆_bstr_t鏄槸C++瀵笲STR鐨勫皝瑁咃紝瀹冪殑鏋勯犲拰鏋愭瀯鍑芥暟鍒嗗埆璋冪敤SysAllocString鍜孲ysFreeString鍑芥暟錛屽叾浠栨搷浣滄槸鍊熺敤BSTR API鍑芥暟銆備笌_variant_t鐩鎬技錛屼嬌鐢ㄦ椂涔熻娣誨姞comutil.h鍜宑omsupp.lib銆?/p>
浜斻丅STR銆乧har*鍜孋String杞崲
銆銆(1) char*杞崲鎴怌String
銆銆鑻ュ皢char*杞崲鎴怌String錛岄櫎浜嗙洿鎺ヨ祴鍊煎錛岃繕鍙嬌鐢–String::Format榪涜銆備緥濡傦細
char chArray[] = "This is a test";
char * p = "This is a test";
銆銆鎴?/p>
LPSTR p = "This is a test";
銆銆鎴栧湪宸插畾涔塙nicode搴旂殑鐢ㄧ▼搴忎腑
TCHAR * p = _T("This is a test");
銆銆鎴?/p>
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
銆銆(2) CString杞崲鎴恈har*
銆銆鑻ュ皢CString綾昏漿鎹㈡垚char*(LPSTR)綾誨瀷錛屽父甯鎬嬌鐢ㄤ笅鍒椾笁縐嶆柟娉曪細
銆銆鏂規(guī)硶涓錛屼嬌鐢ㄥ己鍒惰漿鎹€備緥濡傦細
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
銆銆鏂規(guī)硶浜岋紝浣跨敤strcpy銆備緥濡傦細
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
銆銆闇瑕佽鏄庣殑鏄紝strcpy(鎴栧彲縐誨糢nicode/MBCS鐨刜tcscpy)鐨勭浜屼釜鍙傛暟鏄?const wchar_t* (Unicode)鎴朿onst char* (ANSI)錛岀郴緇熺紪璇戝櫒灝嗕細鑷姩瀵瑰叾榪涜杞崲銆?/p>
銆銆鏂規(guī)硶涓夛紝浣跨敤CString::GetBuffer銆備緥濡傦細
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 鍦ㄨ繖閲屾坊鍔犱嬌鐢╬鐨勪唬鐮?br>if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 浣跨敤瀹屽悗鍙婃椂閲婃斁錛屼互渚胯兘浣跨敤鍏跺畠鐨凜String鎴愬憳鍑芥暟
銆銆(3) BSTR杞崲鎴恈har*
銆銆鏂規(guī)硶涓錛屼嬌鐢–onvertBSTRToString銆備緥濡傦細
#include "comutil.h"
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 鐢ㄥ畬閲婃斁
delete[] lpszText2;
return 0;
}
** 姝ゆ柟娉曚笉濂斤紝浼氶犳垚鍐呭瓨娉勯湶錛孲ysFreeString涔熸病鏈夋晥鏋溿?/font>
銆銆鏂規(guī)硶浜岋紝浣跨敤_bstr_t鐨勮祴鍊艱繍綆楃閲嶈澆銆備緥濡傦細
_bstr_t b = bstrText;
char* lpszText2 = b;
* 涓嶄細鏈夊唴瀛樻硠闇詫紝鎺ㄨ崘鏂規(guī)硶
銆銆(4) char*杞崲鎴怋STR
銆銆鏂規(guī)硶涓錛屼嬌鐢⊿ysAllocString絳堿PI鍑芥暟銆備緥濡傦細
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
銆銆鏂規(guī)硶浜岋紝浣跨敤COleVariant鎴朹variant_t銆備緥濡傦細
//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
銆銆鏂規(guī)硶涓夛紝浣跨敤_bstr_t錛岃繖鏄竴縐嶆渶綆鍗曠殑鏂規(guī)硶銆備緥濡傦細
BSTR bstrText = _bstr_t("This is a test");
銆銆鏂規(guī)硶鍥涳紝浣跨敤CComBSTR銆備緥濡傦細
BSTR bstrText = CComBSTR("This is a test");
銆銆鎴?/p>
CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
銆銆鏂規(guī)硶浜旓紝浣跨敤ConvertStringToBSTR銆備緥濡傦細
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
銆銆(5) CString杞崲鎴怋STR
銆銆閫氬父鏄氳繃浣跨敤CStringT::AllocSysString鏉ュ疄鐜般備緥濡傦細
CString str("This is a test");
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); // 鐢ㄥ畬閲婃斁
銆銆(6) BSTR杞崲鎴怌String
銆銆涓鑸彲鎸変笅鍒楁柟娉曡繘琛岋細
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;
銆銆鎴?/p>
CStringA str(bstrText);
銆銆(7) ANSI銆乁nicode鍜屽瀛楃涔嬮棿鐨勮漿鎹?/p>
銆銆鏂規(guī)硶涓錛屼嬌鐢∕ultiByteToWideChar灝咥NSI瀛楃杞崲鎴怳nicode瀛楃錛屼嬌鐢╓ideCharToMultiByte灝哢nicode瀛楃杞崲鎴怉NSI瀛楃銆?/p>
銆銆鏂規(guī)硶浜岋紝浣跨敤“_T”灝咥NSI杞崲鎴?#8220;涓鑸?#8221;綾誨瀷瀛楃涓詫紝浣跨敤“L”灝咥NSI杞崲鎴怳nicode錛岃屽湪鎵樼C++鐜涓繕鍙嬌鐢⊿灝咥NSI瀛楃涓茶漿鎹㈡垚String*瀵硅薄銆備緥濡傦細
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
銆銆鏂規(guī)硶涓夛紝浣跨敤ATL 7.0鐨勮漿鎹㈠畯鍜岀被銆侫TL7.0鍦ㄥ師鏈?.0鍩虹涓婂畬鍠勫拰澧炲姞浜嗚澶氬瓧絎︿覆杞崲瀹忎互鍙婃彁渚涚浉搴旂殑綾伙紝瀹冨叿鏈夊鍥?鎵紺虹殑緇熶竴褰㈠紡錛?/p>
銆銆鍏朵腑錛岀涓涓狢琛ㄧず“綾?#8221;錛屼互渚夸簬ATL 3.0瀹忕浉鍖哄埆錛岀浜屼釜C琛ㄧず甯擱噺錛?琛ㄧず“to”錛孍X琛ㄧず瑕佸紑杈熶竴瀹氬ぇ灝忕殑緙撳啿銆係ourceType鍜孌estinationType鍙互鏄疉銆乀銆乄鍜孫LE錛屽叾鍚箟鍒嗗埆鏄疉NSI銆乁nicode銆?#8220;涓鑸?#8221;綾誨瀷鍜孫LE瀛楃涓層備緥濡傦紝CA2CT灝辨槸灝咥NSI杞崲鎴愪竴鑸被鍨嬬殑瀛楃涓插父閲忋備笅闈㈡槸涓浜涚ず渚嬩唬鐮侊細
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);