锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
// APIHOOKImageDirectoryEntryToData.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <imagehlp.h>//ImageDirectoryEntryToData
#pragma comment(lib,"imagehlp.lib")
char *szModName = NULL ;
char *szHacked = "涓嶅ソ鎰忔漢ook鍒頒簡!" ;
DWORD dwHookFun ;
PROC dwHookApiAddr;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc ;
PIMAGE_THUNK_DATA32 pThunk;
ULONG uSize ; 
/**//************************************************************/
void MYhook() 

{
__asm 
{
mov esp,ebp
push szHacked
pop DWORD PTR [ebp+12]
pop ebp
jmp dwHookApiAddr
}
}
int main(int argc, char* argv[])

{
HMODULE hInstance =GetModuleHandle(NULL);
dwHookFun = (DWORD)MYhook;
dwHookApiAddr = GetProcAddress(LoadLibrary("USER32.dll"), "MessageBoxA") ;
//閫氳繃鍑芥暟)ImageDirectoryEntryToData鑾峰緱IAT
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hInstance,
TRUE,
IMAGE_DIRECTORY_ENTRY_IMPORT,
&uSize) ;
//鎵懼埌瑕丠OOK鐨勫嚱鏁版墍鍦ㄧ殑妯″潡
while(pImportDesc->Name) 
{
szModName = (char *)((PBYTE)hInstance+pImportDesc->Name) ;
if (strcmp(szModName,"USER32.dll")==0)
break ;
pImportDesc++ ;
}
//鍘熷鐨凾HUNK淇℃伅鎸囬拡
pThunk= (PIMAGE_THUNK_DATA32)((PBYTE)hInstance+pImportDesc->FirstThunk) ;
for(;pThunk->u1.Function;pThunk++) 
{
PROC* ppfn = (PROC*) &pThunk->u1.Function;
if (*ppfn == dwHookApiAddr) 
{
VirtualProtect(&pThunk->u1.Function, 4096,PAGE_READWRITE,0);
pThunk->u1.Function = (PDWORD)dwHookFun;
break ;
}
} 
//瑕乭ook涓嬮潰榪欎釜API
MessageBoxA(0,"榪欐槸姝e父鐨?","xicao",0); 
return 0;
}
PS:
棰勭紪璇戝ご鐨勬蹇碉細
鎵璋撶殑棰勭紪璇戝ご灝辨槸鎶婁竴涓伐紼嬩腑鐨勯偅涓閮ㄥ垎浠g爜,棰勫厛緙栬瘧濂芥斁鍦ㄤ竴涓枃浠墮噷(閫氬父鏄?
浠?pch涓烘墿灞曞悕鐨?錛岃繖涓枃浠跺氨縐頒負棰勭紪璇戝ご鏂囦歡榪欎簺棰勫厛緙栬瘧濂界殑浠g爜鍙互鏄換浣曠殑
C/C++浠g爜--------鐢氳嚦鏄痠nline鐨勫嚱鏁幫紝浣嗘槸蹇呴』鏄ǔ瀹氱殑錛屽湪宸ョ▼寮鍙戠殑榪囩▼涓笉浼?
琚粡甯告敼鍙樸傚鏋滆繖浜涗唬鐮佽淇敼錛屽垯闇瑕侀噸鏂扮紪璇戠敓鎴愰緙栬瘧澶存枃浠躲傛敞鎰忕敓鎴愰緙?
璇戝ご鏂囦歡鏄緢鑰楁椂闂寸殑銆傚悓鏃朵綘寰楁敞鎰忛緙栬瘧澶存枃浠墮氬父寰堝ぇ錛岄氬父鏈?-7M澶с傛敞鎰忓強
鏃舵竻鐞嗛偅浜涙病鏈夌敤鐨勯緙栬瘧澶存枃浠躲?
涔熻浣犱細闂細鐜板湪鐨勭紪璇戝櫒閮芥湁Time stamp鐨勫姛鑳斤紝緙栬瘧鍣ㄥ湪緙栬瘧鏁翠釜宸ョ▼鐨勬椂鍊欙紝瀹?
鍙細緙栬瘧閭d簺緇忚繃淇敼鐨勬枃浠訛紝鑰屼笉浼氬幓緙栬瘧閭d簺浠庝笂嬈$紪璇戣繃錛屽埌鐜板湪娌℃湁琚慨鏀硅繃
鐨勬枃浠躲傞偅涔堜負浠涔堣繕瑕侀緙栬瘧澶存枃浠跺憿錛熺瓟妗堝湪榪欓噷錛屾垜浠煡閬撶紪璇戝櫒鏄互鏂囦歡涓哄崟
浣嶇紪璇戠殑錛屼竴涓枃浠剁粡榪囦慨鏀瑰悗錛屼細閲嶆柊緙栬瘧鏁翠釜鏂囦歡錛屽綋鐒跺湪榪欎釜鏂囦歡閲屽寘鍚殑鎵鏈?
澶存枃浠朵腑鐨勪笢瑗匡紙.eg Macro, Preprocesser 錛夐兘瑕侀噸鏂板鐞嗕竴閬嶃俈C鐨勯緙栬瘧澶存枃浠?
淇濆瓨鐨勬鏄繖閮ㄥ垎淇℃伅銆備互閬垮厤姣忔閮借閲嶆柊澶勭悊榪欎簺澶存枃浠躲?
棰勭紪璇戝ご鐨勪綔鐢細
鏍規(guī)嵁涓婃枃浠嬬粛錛岄緙栬瘧澶存枃浠剁殑浣滅敤褰撶劧灝辨槸鎻愰珮渚垮疁閫熷害浜嗭紝鏈変簡瀹冧綘娌℃湁蹇呰姣忔
閮界紪璇戦偅浜涗笉闇瑕佺粡甯告敼鍙樼殑浠g爜銆傜紪璇戞ц兘褰撶劧灝辨彁楂樹簡銆?
棰勭紪璇戝ご鐨勪嬌鐢細
瑕佷嬌鐢ㄩ緙栬瘧澶達紝鎴戜滑蹇呴』鎸囧畾涓涓ご鏂囦歡錛岃繖涓ご鏂囦歡鍖呭惈鎴戜滑涓嶄細緇忓父鏀瑰彉鐨?
浠g爜鍜屽叾浠栫殑澶存枃浠訛紝鐒跺悗鎴戜滑鐢ㄨ繖涓ご鏂囦歡鏉ョ敓鎴愪竴涓緙栬瘧澶存枃浠訛紙.pch鏂囦歡錛?
鎯沖繀澶у閮界煡閬?StdAfx.h榪欎釜鏂囦歡銆傚緢澶氫漢閮借涓鴻繖鏄疺C鎻愪緵鐨勪竴涓?#8220;緋葷粺綰у埆”鐨?
錛岀紪璇戝櫒甯︾殑涓涓ご鏂囦歡銆傚叾瀹炰笉鏄殑錛岃繖涓枃浠跺彲浠ユ槸浠諱綍鍚嶅瓧鐨勩傛垜浠潵鑰冨療涓涓?
鍏稿瀷鐨勭敱AppWizard鐢熸垚鐨凪FC Dialog Based銆紼嬪簭鐨勯緙栬瘧澶存枃浠躲傦紙鍥犱負AppWizard
浼氫負鎴戜滑鎸囧畾濂藉浣曚嬌鐢ㄩ緙栬瘧澶存枃浠訛紝榛樿鐨勬槸StdAfx.h錛岃繖鏄疺C璧風殑鍚嶅瓧錛夈傛垜浠?
浼氬彂鐜拌繖涓ご鏂囦歡閲屽寘鍚簡浠ヤ笅鐨勫ご鏂囦歡錛?
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4
Common Controls
#include <afxcmn.h>
榪欎簺姝f槸浣跨敤MFC鐨勫繀欏誨寘鍚殑澶存枃浠訛紝褰撶劧鎴戜滑涓嶅お鍙兘鍦ㄦ垜浠殑宸ョ▼涓慨鏀硅繖浜涘ご鏂?
浠剁殑錛屾墍浠ヨ浠栦滑鏄ǔ瀹氱殑銆?
閭d箞鎴戜滑濡備綍鎸囧畾瀹冩潵鐢熸垚棰勭紪璇戝ご鏂囦歡銆傛垜浠煡閬撲竴涓ご鏂囦歡鏄笉鑳界紪璇戠殑銆傛墍浠ユ垜
浠繕闇瑕佷竴涓猚pp鏂囦歡鏉ョ敓鎴?pch 鏂囦歡銆傝繖涓枃浠墮粯璁ょ殑灝辨槸StdAfx.cpp銆傚湪榪欎釜鏂囦歡
閲屽彧鏈変竴鍙ヤ唬鐮佸氨鏄細#include “Stdafx.h”銆傚師鍥犳槸鐞嗘墍褰撶劧鐨勶紝鎴戜滑浠呬粎鏄瀹冭兘
澶熺紪璇戣屽凡?D?D?D涔熷氨鏄錛岃鐨勫彧鏄畠鐨?cpp鐨勬墿灞曞悕銆傛垜浠彲浠ョ敤/Yc緙栬瘧寮鍏蟲潵鎸?
瀹歋tdAfx.cpp鏉ョ敓鎴愪竴涓?pch鏂囦歡錛岄氳繃/Fp緙栬瘧寮鍏蟲潵鎸囧畾鐢熸垚鐨刾ch鏂囦歡鐨勫悕瀛椼傛墦
寮project ->Setting->C/C++ 瀵硅瘽妗嗐傛妸Category鎸囧悜Precompiled Header銆傚湪宸﹁竟鐨?
鏍戝艦瑙嗗浘閲岄夋嫨鏁翠釜宸ョ▼銆
Project Options(鍙充笅瑙掔殑閭d釜鐧界殑鍦版柟)鍙互鐪嬪埌 /Fp “debug/PCH.pch”錛岃繖灝辨槸鎸?
瀹氱敓鎴愮殑.pch鏂囦歡鐨勫悕瀛楋紝榛樿鐨勯氬父鏄<宸ョ▼鍚?gt;.pch錛堟垜鐨勭ず渚嬪伐紼嬪悕灝辨槸PCH錛夈?
鐒跺悗錛屽湪宸﹁竟鐨勬爲褰㈣鍥鵑噷閫夋嫨StdAfx.cpp.//榪欐椂鍙兘閫変竴涓猚pp鏂囦歡錛?
榪欐椂鍘熸潵鐨凱roject Option鍙樻垚浜?Source File Option錛堝師鏉ユ槸宸ョ▼錛岀幇鍦ㄦ槸涓涓枃浠?
錛屽綋鐒跺彉浜嗭級銆傚湪榪欓噷鎴戜滑鍙互鐪嬪埌 /Yc寮鍏籌紝/Yc鐨勪綔鐢ㄥ氨鏄寚瀹氳繖涓枃浠舵潵鍒涘緩涓涓?
Pch鏂囦歡銆?Yc鍚庨潰鐨勬枃浠跺悕鏄偅涓寘鍚簡紼沖畾浠g爜鐨勫ご鏂囦歡錛屼竴涓伐紼嬮噷鍙兘鏈変竴涓枃
浠剁殑鍙互鏈塝C寮鍏熾俈C灝辨牴鎹繖涓夐」鎶?StdAfx.cpp緙栬瘧鎴愪竴涓狾bj鏂囦歡鍜屼竴涓狿CH鏂囦歡
銆?
鐒跺悗鎴戜滑鍐嶉夋嫨涓涓叾瀹冪殑鏂囦歡鏉ョ湅鐪嬶紝//鍏朵粬cpp鏂囦歡
鍦ㄨ繖閲岋紝Precomplier 閫夋嫨浜?Use 鈰嫰鈰竴欏癸紝澶存枃浠舵槸鎴戜滑鎸囧畾鍒涘緩PCH 鏂囦歡鐨剆tda
fx.h
鏂囦歡銆備簨瀹炰笂錛岃繖閲屾槸浣跨敤宸ョ▼閲岀殑璁劇疆錛岋紙濡傚浘1錛?Yu”stdafx.h”銆?
榪欐牱錛屾垜浠氨璁劇疆濂戒簡棰勭紪璇戝ご鏂囦歡銆備篃灝辨槸璇達紝鎴戜滑鍙互浣跨敤棰勭紪璇戝ご鍔熻兘浜嗐備互
涓嬫槸娉ㄦ剰浜嬮」錛?
1):濡傛灉浣跨敤浜?Yu錛屽氨鏄浣跨敤浜嗛緙栬瘧錛屾垜浠湪姣忎釜.cpp鏂囦歡鐨勬渶寮澶達紝鎴戝己璋冧竴閬?
鏄渶寮澶達紝鍖呭惈 浣犳寚瀹氫駭鐢焢ch鏂囦歡鐨?h鏂囦歡錛堥粯璁ゆ槸stdafx.h錛変笉鐒跺氨浼氭湁闂銆傚
鏋滀綘娌℃湁鍖呭惈榪欎釜鏂囦歡錛屽氨鍛婅瘔浣燯nexpected file end. 濡傛灉浣犱笉鏄湪鏈寮澶村寘鍚殑錛?
浣犺嚜宸辮瘯浠ヤ笅灝辯煡閬撲簡錛岀粷瀵規(guī)湁寰堟儕浜虹殑鏁堟灉鈰?.
fatal error C1010: unexpected end of file while looking for precompiled
header directive
Generating Code...
2錛夊鏋滀綘鎶妏ch鏂囦歡涓嶅皬蹇冧涪浜嗭紝緙栬瘧鐨勬椂鍊欏氨浼氫駭鐢熷緢澶氱殑涓嶆甯哥殑琛屼負銆傛牴鎹互涓?
鐨勫垎鏋愶紝浣犲彧瑕佽緙栬瘧鍣ㄧ敓鎴愪竴涓猵ch鏂囦歡銆備篃灝辨槸璇存妸 stdafx.cpp錛堝嵆鎸囧畾/Yc鐨勯偅涓?
cpp鏂囦歡錛変粠鏂扮紪璇戜竴閬嶃傚綋鐒朵綘鍙互鍌誨偦鐨?Rebuild All銆傜畝鍗曚竴鐐瑰氨鏄夋嫨閭d釜cpp
鏂囦歡錛屾寜涓涓婥trl + F7灝卞彲浠ヤ簡銆備笉鐒跺彲鏄緢嫻垂鏃墮棿鐨勫摝銆?
榪欎袱澶╃湅csdn鏈変竴浜涘叧浜巗ocket綺樺寘錛宻ocket緙撳啿鍖鴻緗殑闂錛屽彂鐜拌嚜宸變笉鏄緢娓呮錛屾墍浠ユ煡璧勬枡浜嗚В璁板綍涓涓嬶細
涓涓や釜綆鍗曟蹇甸暱榪炴帴涓庣煭榪炴帴錛?br>1.闀胯繛鎺?/p>
Client鏂逛笌Server鏂瑰厛寤虹珛閫氳榪炴帴錛岃繛鎺ュ緩绔嬪悗涓嶆柇寮錛?鐒跺悗鍐嶈繘琛屾姤鏂囧彂閫佸拰鎺ユ敹銆?/p>
2.鐭繛鎺?/p>
Client鏂逛笌Server姣忚繘琛屼竴嬈℃姤鏂囨敹鍙戜氦鏄撴椂鎵嶈繘琛岄氳榪炴帴錛屼氦鏄撳畬姣曞悗绔嬪嵆鏂紑榪炴帴銆傛縐嶆柟寮忓父鐢ㄤ簬涓鐐瑰澶氱偣
閫氳錛屾瘮濡傚涓狢lient榪炴帴涓涓猄erver.
浜?浠涔堟椂鍊欓渶瑕佽冭檻綺樺寘闂?
1:濡傛灉鍒╃敤tcp姣忔鍙戦佹暟鎹紝灝變笌瀵規(guī)柟寤虹珛榪炴帴錛岀劧鍚庡弻鏂瑰彂閫佸畬涓孌墊暟鎹悗錛屽氨鍏抽棴榪炴帴錛岃繖鏍峰氨涓嶄細鍑虹幇綺樺寘闂錛堝洜涓哄彧鏈変竴縐嶅寘緇撴瀯,綾諱技浜巋ttp鍗忚錛夈傚叧闂繛鎺ヤ富瑕佽鍙屾柟閮藉彂閫乧lose榪炴帴錛堝弬鑰僼cp鍏抽棴鍗忚錛夈傚錛欰闇瑕佸彂閫佷竴孌靛瓧絎︿覆緇橞錛岄偅涔圓涓嶣寤虹珛榪炴帴錛岀劧鍚庡彂閫佸弻鏂歸兘榛樿濂界殑鍗忚瀛楃濡?hello give me sth abour yourself"錛岀劧鍚嶣鏀跺埌鎶ユ枃鍚庯紝灝卞皢緙撳啿鍖烘暟鎹帴鏀?鐒跺悗鍏抽棴榪炴帴錛岃繖鏍風矘鍖呴棶棰樹笉鐢ㄨ冭檻鍒幫紝鍥犱負澶у閮界煡閬撴槸鍙戦佷竴孌靛瓧絎︺?br>
2錛氬鏋滃彂閫佹暟鎹棤緇撴瀯錛屽鏂囦歡浼犺緭錛岃繖鏍峰彂閫佹柟鍙鍙戦侊紝鎺ユ敹鏂瑰彧綆℃帴鏀跺瓨鍌ㄥ氨ok錛屼篃涓嶇敤鑰冭檻綺樺寘
3錛氬鏋滃弻鏂瑰緩绔嬭繛鎺ワ紝闇瑕佸湪榪炴帴鍚庝竴孌墊椂闂村唴鍙戦佷笉鍚岀粨鏋勬暟鎹紝濡傝繛鎺ュ悗錛屾湁濂藉嚑縐嶇粨鏋勶細
1)"hello give me sth abour yourself"
2)"Don't give me sth abour yourself"
閭h繖鏍風殑璇濓紝濡傛灉鍙戦佹柟榪炵畫鍙戦佽繖涓袱涓寘鍑哄幓錛屾帴鏀舵柟涓嬈℃帴鏀跺彲鑳戒細鏄?hello give me sth abour yourselfDon't give me sth abour yourself" 榪欐牱鎺ユ敹鏂瑰氨鍌諱簡錛屽埌搴曟槸瑕佸共鍢涳紵涓嶇煡閬擄紝鍥犱負鍗忚娌℃湁瑙勫畾榪欎箞璇″紓鐨勫瓧絎︿覆錛屾墍浠ヨ澶勭悊鎶婂畠鍒嗗寘錛屾庝箞鍒嗕篃闇瑕佸弻鏂圭粍緇囦竴涓瘮杈冨ソ鐨勫寘緇撴瀯錛屾墍浠ヤ竴鑸彲鑳戒細鍦ㄥご鍔犱竴涓暟鎹暱搴︿箣綾葷殑鍖咃紝浠ョ‘淇濇帴鏀躲?br>
涓?綺樺寘鍑虹幇鍘熷洜錛氬湪嫻佷紶杈撲腑鍑虹幇錛孶DP涓嶄細鍑虹幇綺樺寘錛屽洜涓哄畠鏈夋秷鎭竟鐣?鍙傝僕indows 緗戠粶緙栫▼)
1 鍙戦佺闇瑕佺瓑緙撳啿鍖烘弧鎵嶅彂閫佸嚭鍘伙紝閫犳垚綺樺寘
2 鎺ユ敹鏂逛笉鍙婃椂鎺ユ敹緙撳啿鍖虹殑鍖咃紝閫犳垚澶氫釜鍖呮帴鏀?/p>
瑙e喅鍔炴硶錛?br>涓轟簡閬垮厤綺樺寘鐜拌薄錛屽彲閲囧彇浠ヤ笅鍑犵鎺柦銆備竴鏄浜庡彂閫佹柟寮曡搗鐨勭矘鍖呯幇璞★紝鐢ㄦ埛鍙氳繃緙栫▼璁劇疆鏉ラ伩鍏嶏紝TCP鎻愪緵浜嗗己鍒舵暟鎹珛鍗充紶閫佺殑鎿嶄綔鎸囦護push錛孴CP杞歡鏀跺埌璇ユ搷浣滄寚浠ゅ悗錛屽氨绔嬪嵆灝嗘湰孌墊暟鎹彂閫佸嚭鍘伙紝鑰屼笉蹇呯瓑寰呭彂閫佺紦鍐插尯婊★紱浜屾槸瀵逛簬鎺ユ敹鏂瑰紩璧風殑綺樺寘錛屽垯鍙氳繃浼樺寲紼嬪簭璁捐銆佺簿綆鎺ユ敹榪涚▼宸ヤ綔閲忋佹彁楂樻帴鏀惰繘紼嬩紭鍏堢駭絳夋帾鏂斤紝浣垮叾鍙婃椂鎺ユ敹鏁版嵁錛屼粠鑰屽敖閲忛伩鍏嶅嚭鐜扮矘鍖呯幇璞★紱涓夋槸鐢辨帴鏀舵柟鎺у埗錛屽皢涓鍖呮暟鎹寜緇撴瀯瀛楁錛屼漢涓烘帶鍒跺垎澶氭鎺ユ敹錛岀劧鍚庡悎騫訛紝閫氳繃榪欑鎵嬫鏉ラ伩鍏嶇矘鍖呫?/p>
浠ヤ笂鎻愬埌鐨勪笁縐嶆帾鏂斤紝閮芥湁鍏朵笉瓚充箣澶勩傜涓縐嶇紪紼嬭緗柟娉曡櫧鐒跺彲浠ラ伩鍏嶅彂閫佹柟寮曡搗鐨勭矘鍖咃紝浣嗗畠鍏抽棴浜嗕紭鍖栫畻娉曪紝闄嶄綆浜嗙綉緇滃彂閫佹晥鐜囷紝褰卞搷搴旂敤紼嬪簭鐨勬ц兘錛屼竴鑸笉寤鴻浣跨敤銆傜浜岀鏂規(guī)硶鍙兘鍑忓皯鍑虹幇綺樺寘鐨勫彲鑳芥э紝浣嗗茍涓嶈兘瀹屽叏閬垮厤綺樺寘錛屽綋鍙戦侀鐜囪緝楂樻椂錛屾垨鐢變簬緗戠粶紿佸彂鍙兘浣挎煇涓椂闂存鏁版嵁鍖呭埌杈炬帴鏀舵柟杈冨揩錛屾帴鏀舵柟榪樻槸鏈夊彲鑳芥潵涓嶅強鎺ユ敹錛屼粠鑰屽鑷寸矘鍖呫傜涓夌鏂規(guī)硶铏界劧閬垮厤浜嗙矘鍖咃紝浣嗗簲鐢ㄧ▼搴忕殑鏁堢巼杈冧綆錛屽瀹炴椂搴旂敤鐨勫満鍚堜笉閫傚悎銆?/p>
瑙e喅綺樺寘闂錛?a >http://www.vckbase.com/document/viewdoc/?id=1203
鍦╯ocket 鏂囦歡浼犺緭涓紝鑾峰彇鏌愪釜鐩綍涓嬬殑鎵鏈夋枃浠訛紝濡傛灉涓涓枃浠跺悕浼犺緭涓嬈¢氳鐨勮瘽錛?27.0.0.1涓婃祴璇曟病鏈変粈涔堥棶棰橈紝褰撳湪灞鍩熺綉涓紶杈?嬈′互涓婏紝灝變細鍑虹幇鍖呬涪澶遍棶棰樸傛垜鐚滆繖涓棶棰樿窡綺樺寘鏈夌偣鐩鎬技銆?
鍦?/span>Win7鏃楄埌鐗堜笅浣跨敤VS2008緙栬瘧紼嬪簭鏃跺嚭鐜?/span>LINK : fatal error LNK1000: Internal error during IncrBuildImage閿欐湁濡備笅涓ょ瑙e喅鏂規(guī)硶錛?/span>
鏂規(guī)硶涓錛氭墦琛ヤ竵
鍒板井杞綉绔欎笅杞?/span>343461_ENU_i386_zip琛ヤ竵鍖咃紝鐒跺悗鎵撹ˉ涓佹棦鍙?/span>
鏂規(guī)硶浜岋細淇敼欏圭洰璁劇疆
欏圭洰->灞炴?/span>->閾炬帴鍣?/span>->甯歌 涓嬮潰鐨?#8220;鍚敤澧為噺閾炬帴”錛屽皢“鏄?/span>(/INCREMENTAL)”鏀逛負“鍚?/span>(/INCREMENTAL:NO)”鏃㈠彲銆?br>
ps錛氭壘涓嶅埌琛ヤ竵鍖咃紝灝辨寜絎簩縐嶆柟娉曘?/span>
BOOL UpdateSysTime()

{
WORD wVersionRequested;
WSADATA wsaData;
// 鍒濆鍖栫増鏈?/span>
wVersionRequested = MAKEWORD( 1, 1 );
if (0!=WSAStartup(wVersionRequested, &wsaData)) 
{
WSACleanup();
return FALSE;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1) 
{
WSACleanup( );
return FALSE;
}
// 榪欎釜IP鏄腑鍥藉ぇ闄嗘椂闂村悓姝ユ湇鍔″櫒鍦板潃錛屽彲鑷淇敼
SOCKET soc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
struct sockaddr_in addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("210.72.145.44");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(123);
NTP_Packet NTP_Send,NTP_Recv;
NTP_Send.Control_Word = htonl(0x0B000000);
NTP_Send.root_delay = 0;
NTP_Send.root_dispersion = 0;
NTP_Send.reference_identifier = 0;
NTP_Send.reference_timestamp = 0;
NTP_Send.originate_timestamp = 0;
NTP_Send.receive_timestamp = 0;
NTP_Send.transmit_timestamp_seconds = 0;
NTP_Send.transmit_timestamp_fractions = 0;
if(SOCKET_ERROR==sendto(soc,(const char*)&NTP_Send,sizeof(NTP_Send),
0,(struct sockaddr*)&addrSrv,sizeof(addrSrv)))
{
closesocket(soc);
return FALSE;
}
int sockaddr_Size =sizeof(addrSrv);
if(SOCKET_ERROR==recvfrom(soc,(char*)&NTP_Recv,sizeof(NTP_Recv),
0,(struct sockaddr*)&addrSrv,&sockaddr_Size))
{
closesocket(soc);
return FALSE;
}
closesocket(soc);
WSACleanup();
SYSTEMTIME newtime;
float Splitseconds;
struct tm *lpLocalTime;
time_t ntp_time;
// 鑾峰彇鏃墮棿鏈嶅姟鍣ㄧ殑鏃墮棿
ntp_time = ntohl(NTP_Recv.transmit_timestamp_seconds)-2208988800;
lpLocalTime = localtime(&ntp_time);
if(lpLocalTime == NULL)
{
return FALSE;
}
// 鑾峰彇鏂扮殑鏃墮棿
newtime.wYear =lpLocalTime->tm_year+1900;
newtime.wMonth =lpLocalTime->tm_mon+1;
newtime.wDayOfWeek =lpLocalTime->tm_wday;
newtime.wDay =lpLocalTime->tm_mday;
newtime.wHour =lpLocalTime->tm_hour;
newtime.wMinute =lpLocalTime->tm_min;
newtime.wSecond =lpLocalTime->tm_sec;
// 璁劇疆鏃墮棿綺懼害
Splitseconds=(float)ntohl(NTP_Recv.transmit_timestamp_fractions);
Splitseconds=(float)0.000000000200 * Splitseconds;
Splitseconds=(float)1000.0 * Splitseconds;
newtime.wMilliseconds = (unsigned short)Splitseconds;
// 淇敼鏈満緋葷粺鏃墮棿
SetLocalTime(&newtime);
return TRUE;
}
CString url;
GetDlgItemText(IDC_EDIT1,url);
CInternetSession Sess;
CHttpFile* cFile = (CHttpFile*)Sess.OpenURL(url,1,INTERNET_FLAG_TRANSFER_ASCII||INTERNET_FLAG_RELOAD,NULL,0);
DWORD dwStatusCode;
cFile->QueryInfoStatusCode(dwStatusCode);
if(dwStatusCode == HTTP_STATUS_OK)
{
CString szData,szAllData;
while(cFile->ReadString(szData))
{
szAllData += szData;
szAllData += "\r\n";
}
cFile->Close();
Sess.Close();
CString name ;
name = "sd.htm";
CFile file(name, CFile::modeCreate | CFile::modeWrite);
file.Write(szAllData,szAllData.GetLength());
file.Close();
}
else
{
MessageBox("璇鋒眰澶辮觸銆傘傘傘?/span>");
}1 htons
htons(1986)寰楀埌鐨勭粨鏋滄槸49671
濡備綍寰楀埌49671榪欎釜緇撴灉鍛?
1986杞崲鎴?6榪涘埗鏄?7C2
涓繪満欏哄簭杞崲鎴愮綉緇滈『搴忎箣鍚庢槸C207
C207杞崲涓哄崄榪涘埗鏄?9671
渚嬪瓙:0x12 34 56 78緇忚繃htons鏄?x78 56 34 12
鍦ㄧ粰SOCKADDR_IN緇撴瀯涓殑绔彛鍙風洿鎺ヨ祴鍊?瀹㈡埛绔拰鏈嶅姟绔叏閮ㄩ兘鐩存帴璧嬪?br style="line-height: 22px; ">SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = 1986;
榪欐牱涔熷彲浠ラ氳,浣嗙粦瀹氱殑绔彛鍙峰凡緇忎笉鏄?986,鑰屾槸49671
2 INADDR_ANY
#define INADDR_ANY (u_long)0x00000000
INADDR_ANY琛ㄧず 鎵鏈夌殑IP,濡傛灉鑷繁鐨勪富鏈烘湁澶氫釜IP,鍦ㄧ粰SOCKADDR_IN 緇撴瀯鐨処P鍦板潃璧嬪兼椂灝辯敤INADDR_ANY.
濡傛灉鍙湁涓涓狪P涓旀槸鍥哄畾鐨?涔熷彲浠ヤ笉鐢↖NADDR_ANY,浣跨敤濡備笅璇彞
addrSrv.sin_addr.S_un.S_addr = inet_addr("221.217.218.111");
inet_addr鍑芥暟鏄皢涓涓偣鍒嗗崄榪涘埗鐨処P杞崲鎴愭棤絎﹀彿闀挎暣鍨?/p>
3 SOCKADDR_IN緇撴瀯
struct sockaddr_in
{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_family:緗戠粶綾誨瀷
sin_port:緗戠粶绔彛鍙?br style="line-height: 22px; ">in_addr:IP鍦板潃
sin_zero:淇濊瘉緇撴瀯鐨勫ぇ灝?br style="line-height: 22px; ">in_addr鐨勭粨鏋勪負
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
瀵逛簬IP鍦板潃涓?21.217.218.111,addrSrv.sin_addr.S_un鐨勮祴鍊兼柟娉曞涓?br style="line-height: 22px; ">絎竴縐?
addrSrv.sin_addr.S_un.S_addr =111<<24|218<<16|217<<8|221;
絎簩縐?
addrSrv.sin_addr.S_un.S_addr =htonl(221<<24|217<<16|218<<8|111);
絎笁縐?
addrSrv.sin_addr.S_un.S_addr = inet_addr("221.217.218.111");
絎洓縐?
addrSrv.sin_addr .S_un.S_un_w.s_w1 =217<<8|221;
addrSrv.sin_addr .S_un.S_un_w.s_w2 =111<<8|218;
絎簲縐?
addrSrv.sin_addr .S_un.S_un_b.s_b1=221;
addrSrv.sin_addr .S_un.S_un_b.s_b2=217;
addrSrv.sin_addr .S_un.S_un_b.s_b3=218;
addrSrv.sin_addr .S_un.S_un_b.s_b4=111;
DWORD dwSize;
CHAR szHead[] = "Accept: */*\r\n\r\n";
VOID* szTemp[16384];
HINTERNET hConnect;
CFile file;
if ( !(hConnect = InternetOpenUrlA ( hOpen, szUrl, szHead,
lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
{
AfxMessageBox("涓嶈兘鎵撳紑璇RL!");
return -1;
}
if (file.Open(szFileName,CFile::modeWrite|CFile::modeCreate)==FALSE )
{
AfxMessageBox("涓嶈兘鎵撳紑鏈湴鐨勬枃浠?");
return -1;
}
DWORD dwByteToRead = 0;
DWORD dwSizeOfRq = 4;
DWORD dwBytes = 0;
if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
(LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
{
dwByteToRead = 0;
}
DWORD start;
DWORD end;
DWORD time;
CString tempstring;
time = 10;
start = timeGetTime();
do
{
if (!InternetReadFile (hConnect, szTemp, 16384, &dwSize))
{
AfxMessageBox("璇繪枃浠跺嚭閿?");
file.Close();
return -1;
}
if (dwSize==0)
break;
else
file.Write(szTemp,dwSize);
dwBytes+=dwSize;
if(dwByteToRead)
{
tempstring.Format("%d%%",(dwBytes*100)/dwByteToRead);
SetDlgItemText(IDC_PERCENT_TEXT,tempstring);
}
FLOAT fSpeed = 0;
fSpeed = (float)dwBytes;
fSpeed /= ((float)time)/1000.0f;
fSpeed /= 1024.0f;
tempstring.Format("%dKB/s",fSpeed);
SetDlgItemText(IDC_SPEED_TEXT,tempstring);
end = timeGetTime();
time = end - start;
if(time == 0)
time = 10;
}while (TRUE);
file.Close();
InternetCloseHandle(hOpen);
涓 WinINet鏄井杞紑鍙戠殑涓涓簱錛屽彲浠ュ畬鎴恏ttp ftp瀹㈡埛绔殑宸ヤ綔銆傝紼嬪簭鍛樹粠澶嶆潅鐨勫崗璁腑鑺傜渷澶ч噺浣撳姏銆?/p>
浜?鎴戜細鐢ㄤ簡http, ftp綾諱技銆傜敤WinINet瀹屾垚涓涓猦ttp涓嬭澆闇瑕佷互涓嬫楠?銆?涓嬮潰榪欎釜鏄悓姝ユ搷浣滐紙涔熷氨鏄竴姝ユ鎿嶄綔錛屾瘡涓嚱鏁版墽琛屽畬鎵嶄細榪斿洖涓涓粨鏋滅殑鎰忔濓級
1 InternetOpen Initializes an application's use of the WinINet functions.
闇瑕佺殑璇?InternetSetOption 璁劇疆浠g悊鏈嶅姟鍣ㄥ湴鍧浠ュ強绔彛銆?br> http錛?nbsp; ip:port 鎴栬?http=http://ip:port
socks錛歋OCKS=ip:port
2 InternetConnect 鍏寵仈鐩爣鍦板潃鎴栬呭煙鍚嶄互鍙婃湇鍔p
3 HttpOpenRequest 鍏寵仈瑕佷笅杞界殑鍐呭鍚嶅瓧
InternetSetOption 璁劇疆鐢ㄦ埛鍚嶅瘑鐮?/p>
4 HttpSendRequest 榪欐灝辨槸鐢℉ttpOpenRequest 鐨勮繑鍥炲鹼紙宸茬粡鍏寵仈浜嗕笂闈㈢殑鎵鏈変俊鎭級鍙戦佸嚭鍘伙紝絎竴嬈$敤浜嗙綉緇溿傚悜鐩爣鏈嶅姟鍣ㄦ垨鑰呬唬鐞嗘湇鍔″櫒銆?/p>
5 HttpQueryInfo
璇ュ嚱鏁版煡璇㈣繑鍥炲鹼紝涓嶅弬涓庣綉緇滄搷浣溿傚彲浠ユ煡璇㈡湇鍔″櫒鐨勮繑鍥炰俊鎭紝姣斿鐩爣鏂囦歡鐨勫ぇ灝忥紝璇ユ枃浠舵槸鍚﹀瓨鍦紝浠g悊鏈嶅姟榪斿洖浜嗚姹傜敤鎴峰悕錛屽瘑鐮佺瓑絳夛紙榪欏嚑涓渶甯哥敤錛夛紝榪樻湁寰堝淇℃伅銆?/p>
6 InternetReadFile
寰堟櫘閫氱殑璇誨嚱鏁幫紝灝辨槸涓嬭澆鏂囦歡銆備笉鐭ラ亾鏄惁鍜屽簳灞傜綉緇滃悓姝ワ紝搴曞眰浼氫笉浼氭彁鍓嶄笅杞藉憿錛?/p>
7 InternetCloseHandle 閲婃斁璧勬簮
涓?nbsp; 寮傛鎿嶄綔錛屾瘮杈冨鏉傜殑銆?nbsp; 涓轟粈涔堥渶瑕佸紓姝ユ搷浣滃憿錛?鍥犱負娑夊強鍒扮綉緇滄搷浣滐紝鏌愪簺鍑芥暟鍦ㄦ搷浣滀腑鍙兘闇瑕佹椂闂達紝濡傛灉涓鐩翠笉榪斿洖錛堟瘮濡?縐掞級鏃訛紝榪欐椂涓葷嚎紼嬭緇撴潫紼嬪簭錛屽矀涓嶅氨鍑虹幇鎰忔兂涓嶅埌鐨勭粨鏋滀簡錛屼絾鏄鏋滄瘡涓嚱鏁伴兘鑳藉鐬棿榪斿洖錛岀劧鍚庨氳繃WaitForMultipleObjects鎴栬匴aitForSingleObject絳夊緟緇撴灉鐨勫嚭鐜幫紙姝ゆ椂灝變笉浼氭搷浣滈偅涓秷鑰?縐掔殑鍑芥暟浜嗭紝鑰岃繖涓?縐掑嚱鏁版鏄鐢ㄥ埌緋葷粺璧勬簮HINTERNET鐨勶級銆?/p>
寮傛鎿嶄綔鐨勭洰鐨勪笂濡傦紝鍘熺悊鍛紵 鍏跺疄鍘熺悊灝辨槸娉ㄥ唽涓涓嚱鏁幫紝鍦ㄨ繖閲屽彨InternetStatusCallback錛屽洜涓哄井杞啓寰楀簳灞備唬鐮佽鐢ㄥ埌錛屾墍浠ュ繀欏繪牸寮忕粺涓銆備竴鏃︽湁緇撴灉鏉ヤ簡灝遍氳繃浜嬩歡閫氱煡鎴戜滑錛學aitForSingleObject鍑芥暟灝卞彲浠ヨ蛋浜嗐傛瘮濡傜瓑鍒頒簡HINTERNET鍒涘緩鎴栬呭懡浠ゅ彂閫佹垚鍔熺瓑緇撴灉銆傜劧鍚庢垜浠氨鍙互絎竴鏃墮棿瀹夊叏鐨勪嬌鐢ㄤ簡銆?br> API 鍑芥暟濡傛灉鍚嶅瓧鏈鍚庡彲浠ュ甫EX錛岄偅涔堝甫ex鐨勫氨鏄紓姝ユ搷浣滅殑銆?/p>
鍥?涓瀹氳娉ㄦ剰錛屽嚒鏄湁unicode鍜宮utilbyte鍑芥暟鐨勪竴瀹氳緇熶竴錛屾渶濂介兘鐢╩utilbyte鐨勩?/p>
浜旓細 浠g爜濡備笅錛?br>// crt_assert.c
// compile with: /c
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <iostream>
#include "winsock2.h"
#include <string>
#include <Wininet.h>
#include <windows.h>
#include <fstream>銆//瑕佷嬌鐢ㄦ枃浠惰緭鍏ヨ緭鍑烘祦蹇呴』鐨勫ご鏂囦歡
using namespace std;
#define __HTTP_VERB_GET "GET"
#define __HTTP_VERB_POST "POST"
#define __HTTP_ACCEPT_TYPE "*/*"
#define __HTTP_ACCEPT "Accept: */*\r\n"
#define __SIZE_HTTP_BUFFER 100000
#define __SIZE_HTTP_RESPONSE_BUFFER 100000
#define __SIZE_HTTP_HEAD_LINE 2048
void CALLBACK InternetStatusCallback(
HINTERNET hInternet,
DWORD dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength);
HANDLE hEvent[3];
HINTERNET hFile;
HINTERNET hNet;
HINTERNET hSession,hConnect,hRequest;
int WaitExitEvent()
{
//return 1;
DWORD dwRet = ::WaitForMultipleObjects(3, hEvent, FALSE, 30000);//INFINITE);
int x=-1;
switch (dwRet)
{
//鍙ユ焺琚垱寤轟簨浠舵垨鑰呰鏁版嵁璇鋒眰鎴愬姛瀹屾垚浜嬩歡
case WAIT_OBJECT_0:
x=0;
cout<<"WAIT_OBJECT_0"<<endl;
//鍙ユ焺琚叧闂簨浠?br> break;
case WAIT_OBJECT_0+1:
x=1;
cout<<"WAIT_OBJECT_1"<<endl;
//鐢ㄦ埛瑕佹眰緇堟瀛愮嚎紼嬩簨浠舵垨鑰呭彂鐢熼敊璇簨浠?br> break;
case WAIT_OBJECT_0+2:
x=2;
cout<<"WAIT_OBJECT_2"<<endl;
break;
default:
cout<<"WaitForMultipleObjects time out"<<endl;
return -1;
}
return x;
}
// 鏀寔浠g悊璁劇疆錛?鏄惁寮傛璁劇疆錛?閲囩敤浜嬩歡椹卞姩
void WinINet3(bool setProxy, bool ASYNC)
{
hSession=NULL;
hConnect=NULL;
hRequest=NULL;
for (int i = 0; i < 3; i++)
{
hEvent[i] = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event object
FALSE, // initial state is nonsignaled
NULL); // unnamed object
if (hEvent[i] == NULL)
{
printf("CreateEvent error: %d\n", GetLastError() );
ExitProcess(0);
}
}
char *url = " char *pip = "down.360safe.com";
char *paim = "/setup.exe";
// step 1
if(ASYNC) cout<<"寮傛妯″紡"<<endl;
// setProxy =false;
if(setProxy)
{
cout<<"浠g悊妯″紡"<<endl;
if(ASYNC)
hSession = InternetOpen("name",
INTERNET_OPEN_TYPE_DIRECT,//|INTERNET_OPEN_TYPE_PROXY,// INTERNET_OPEN_TYPE_PROXY,
NULL,NULL,INTERNET_FLAG_ASYNC); // 寮傛
else
hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PROXY,NULL,NULL,0); // 鍚屾
}
else
{
if(ASYNC)
hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_ASYNC); // 寮傛
else
hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); // 鍚屾
}
if(!hSession){
DWORD er = ::GetLastError();
cout<<"InternetOpen error"<<endl;//, "Err", MB_OK);
return;
}
if(ASYNC)
{
//Sleep(500);
INTERNET_STATUS_CALLBACK res = ::InternetSetStatusCallback(hSession,InternetStatusCallback);
if(res == INTERNET_INVALID_STATUS_CALLBACK)
{
cout<<"InternetSetStatusCallback failed, so return "<<endl;
return ;
}
else
{
cout<<"InternetSetStatusCallback succeed, so go on "<<endl;
}
//Sleep(500);
}
char strProxyList[MAX_PATH], strUsername[64], strPassword[64];
strcpy(strProxyList, "SOCKS=58.56.87.2:1080"); // 鍐欎笂socks鎬庝箞灝辨棤鏁堜簡鍛紵錛燂紵SOCKS5=172.18.132.27:1080
strcpy(strUsername, "user01");
strcpy(strPassword, "baidu");
INTERNET_PROXY_INFO proxy;
proxy.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxy.lpszProxy = strProxyList;
proxy.lpszProxyBypass = NULL;
if( setProxy &&!InternetSetOption(hSession,INTERNET_OPTION_PROXY ,&proxy,sizeof(INTERNET_PROXY_INFO)))
{
cout<<"InternetSetOption failed"<<endl;
return ;
}
// step 2
//濡傛灉鏄庣‘鐭ラ亾闇瑕佽璇侊紝絎?錛?涓弬鏁板彲浠ヨ緭鍏ョ敤鎴峰悕錛屽瘑鐮?administrator","password"
//絎?錛?涓弬鏁頒負鐩爣涓繪満IP銆佺鍙e彿(涓嶆槸浠g悊鏈嶅姟鍣ㄧ殑鍙傛暟)
hConnect = InternetConnect(hSession,pip,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,INTERNET_FLAG_RELOAD,0);
if(!ASYNC &&!hConnect){
cout<<"鍚屾錛孖nternetConnect error"<<endl;//, "Err", MB_OK);
return;
}
if( ASYNC&& hConnect== NULL)// 寮傛 闇瑕佺瓑寰?nbsp; 绔熺劧鐩存帴鍒涘緩濂戒簡
{
int er = GetLastError();
DWORD dwError = ::GetLastError();
if (dwError != ERROR_IO_PENDING)
{
cout<<"CHttpDownload::OpenInternetConnection| 榪炴帴澶辮觸" <<endl;
return ;
}
else //
{
cout<<"hConnect == NULL, so run WaitExitEvent"<<endl;
WaitExitEvent(); // 絳夊緟鎴愬姛鍒涘緩 // 榪欓噷搴旇絳夊緟 榪欓噷搴旇鏄劇ず涓嬈″憖
::ResetEvent(hEvent[0]);
::ResetEvent(hEvent[1]);
::ResetEvent(hEvent[2]);
}
}
cout<<"step 2 :InternetConnect secced"<<endl;
// ::InternetSetStatusCallback(hConnect,InternetStatusCallback);
// step 3!!!
char szHead[] = "Accept: */*\r\n\r\n";
char **p = new char*[2];*p = szHead;*(p+1) = NULL;
//hRequest = HttpOpenRequest(hConnect,"GET","download/BaiduHi_1.0_Beta2.exe",NULL,NULL,/*(const char **)p*/NULL,0/*INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_RELOAD*/,0); // no request;
CONST TCHAR *szAcceptType=__HTTP_ACCEPT_TYPE;
hRequest = ::HttpOpenRequest(hConnect,
"GET",
paim,
HTTP_VERSION,
"",
&szAcceptType,
INTERNET_FLAG_RELOAD|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_CACHE_WRITE,
0);
//::HttpAddRequestHeaders( hRequest, __HTTP_ACCEPT, strlen(__HTTP_ACCEPT), HTTP_ADDREQ_FLAG_REPLACE);
/*_hHTTPRequest=::HttpOpenRequest( _hHTTPConnection,
__HTTP_VERB_GET, // HTTP Verb
szURI, // Object Name
HTTP_VERSION, // Version
"", // Reference
&szAcceptType, // Accept Type
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
0); // context call-back point
*/
if (!ASYNC&& !hRequest){
cout<<"鍚屾錛孒ttpOpenRequest error"<<endl;//, "Err", MB_OK);
return;
}
if( ASYNC&& hRequest== NULL)// 寮傛 闇瑕佺瓑寰?br> {
int er = GetLastError();
DWORD dwError = ::GetLastError();
if (dwError != ERROR_IO_PENDING)
{
cout<<"CHttpDownload::OpenInternetConnection| 榪炴帴澶辮觸" <<endl;
return ;
}
else //
{
cout<<"hRequest == NULL, so run WaitExitEvent"<<endl;
WaitExitEvent(); // 絳夊緟鎴愬姛鍒涘緩
::ResetEvent(hEvent[0]);
::ResetEvent(hEvent[1]);
::ResetEvent(hEvent[2]);
}
}
//Sleep(10000);
cout << "step 3 : HttpOpenRequest success"<<endl;
//::InternetSetStatusCallback(hRequest,InternetStatusCallback);
//////////////////////////////////////////////
if (setProxy )
{
// InternetSetOption 涓嶈寮傛絳夊緟
if( !InternetSetOption(hRequest,INTERNET_OPTION_PROXY_USERNAME ,strUsername,strlen(strUsername)+1))
{
cout<<"InternetSetOption Username failed"<<endl;
return ;
}
if( !InternetSetOption(hRequest,INTERNET_OPTION_PROXY_PASSWORD ,strPassword,strlen(strPassword)+1))
{
cout<<"InternetSetOption Password failed"<<endl;
return ;
}
}
// step 4
//HttpSendRequest(hRequest,NULL,0,NULL,0);
//Sleep(3000);
::ResetEvent(hEvent[0]);
::ResetEvent(hEvent[1]);
::ResetEvent(hEvent[2]);
if(!::HttpSendRequest(hRequest,NULL,0,NULL,0)) // 涓轟粈涔堝け璐ワ紵錛燂紵
{
//Sleep(3000);
if(!ASYNC)// 鍚屾
{
DWORD dwError = ::GetLastError();
cout<<"鍚屾錛孒ttpSendRequest failed, GetLastError=="<<dwError<<endl;
return ;
}
else
{
Sleep(3000);
DWORD dwError = ::GetLastError();
cout<<"dwError =="<<dwError<<endl;
if (dwError != ERROR_IO_PENDING)
{
cout<<"dwError != ERROR_IO_PENDING, so quit,dwError =="<<dwError<<endl;
return ;
}
else //
{
cout<<"HttpSendRequest, so run WaitExitEvent"<<endl;
Sleep(3000);
//if(WaitExitEvent()!=2)//; // 絳夊緟鎴愬姛鍒涘緩 絳夊緟鏄惁涓嶅錛燂紵錛?br> {
cout<<"had not recv complete event, so quit"<<endl;
// return ;
}
}
}
}
Sleep(3000);
cout << "step 4: HttpSendRequest success!"<<endl;
int bufh[1000];
DWORD dwLen,dwIndex;
/*if(!::HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, bufh, &dwLen, &dwIndex))// 榪欏彞璇濓紵錛燂紵
{
//return E_FAIL;
return;
}
*/
// 鍒ゆ柇鐘舵佺爜錛?br> char m_dwStatusCode[90];
DWORD dwStatusSize = sizeof(m_dwStatusCode);
/*if (FALSE == ::HttpQueryInfo(hRequest, // 鏌ヨ澶辨晥錛燂紵
HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&m_dwStatusCode,
&dwStatusSize,
NULL)) //鑾峰彇榪斿洖鐘舵佺爜
{
return ;
}
//鍒ゆ柇鐘舵佺爜鏄笉鏄?200
//if (HTTP_STATUS_OK != m_dwStatusCode)
{
//return ;
}
*/
DWORD dwByteToRead = 0;
DWORD dwSizeOfRq = 4;
DWORD dwBytes = 0;
//榪欎笁涓煎垎鍒瓨鍌ㄦ枃浠剁殑澶у皬錛孒ttpQueryInfo鍐呭鐨勫ぇ灝忓拰鎬誨叡璇誨彇鐨勫瓧鑺傛暟銆?br> //HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL);
//闇瑕佽鏄庣殑鏄?HttpQueryInfo 騫朵笉榪涜緗戠粶鎿嶄綔錛屽洜姝ゅ畠涓嶉渶瑕佽繘琛屽紓姝ユ搷浣滅殑澶勭悊銆?
if (!HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
{ // 榪欓噷澶辮觸浜嗭紵錛燂紵
DWORD dwError = ::GetLastError();
cout<<"HttpQueryInfo failed, so return錛?GetLastError() =="<<dwError<<endl;
return ;
}
FILE * pFile = fopen("e://baidu01.exe", "wb" );
//ofstream mfile("out.txt");//瀹氫箟鏂囦歡杈撳嚭嫻乷uf錛屽茍鍏寵仈鍒皁ut.txt
int i=0;
DWORD leftB = dwByteToRead;
cout<<"寮濮嬩笅杞?<<endl;
if( !ASYNC) // 鍚屾涓嬭澆
{
while(true)
{
const int MAX_BUFFER_SIZE = 65536;
unsigned long nSize = 0;
char szBuffer[MAX_BUFFER_SIZE+2];
int num = MAX_BUFFER_SIZE;
if( leftB < num);
num = leftB;
BOOL bRet = ::InternetReadFile(hRequest, szBuffer, num, &nSize); // 寮傛 闇瑕佺瓑寰?/p>
leftB -= nSize;
cout<<i++<<" size: "<<nSize<<endl;
if(!bRet || nSize <= 0)
break;
fwrite(szBuffer, sizeof(char), nSize, pFile);
}
}
else // 寮傛涓嬭澆
{
INTERNET_BUFFERS i_buf = {0};
i_buf.dwStructSize = sizeof(INTERNET_BUFFERS);
i_buf.lpvBuffer = new TCHAR[10242];
i_buf.dwBufferLength = 10240;
for( DWORD i=0;i<dwByteToRead;)
{
//閲嶇疆璇繪暟鎹簨浠?br> ::ResetEvent( hEvent[0]);
int num = 10240;
if(dwByteToRead-i<10240)
{
num = dwByteToRead-i;
i_buf.dwBufferLength = dwByteToRead-i;
}
if (FALSE == ::InternetReadFileEx(hRequest,
&i_buf,
IRF_ASYNC,
NULL))
{
if (ERROR_IO_PENDING == ::GetLastError())
{
if ( NULL)//WaitExitEvent()!=2)
{
delete[] i_buf.lpvBuffer;
return ;
}
}
else
{
cout<<"down failed,so return"<<endl;
delete[] i_buf.lpvBuffer;
return ;
}
}
else
{
//鍦ㄧ綉緇滀紶杈撻熷害蹇紝姝ラ暱杈冨皬鐨勬儏鍐典笅錛?br> //InternetReadFileEx 緇忓父浼氱洿鎺ヨ繑鍥炴垚鍔燂紝
//鍥犳瑕佸垽鏂槸鍚﹀彂鐢熶簡鐢ㄦ埛瑕佹眰緇堟瀛愮嚎紼嬩簨浠躲?br> cout<<"緗戠粶寰堝ソ錛孖nternetReadFileEx榪斿洖true"<<endl;
// 鏆備笉鑰冭檻鐢ㄦ埛閫鍑?br> }
i += i_buf.dwBufferLength; // 鏈鍚庝竴嬈″啓澶氫簡錛侊紒錛?br> fwrite(i_buf.lpvBuffer, sizeof(char), i_buf.dwBufferLength, pFile);
cout<<"i== "<<i<<endl;
//淇濆瓨鏁版嵁
//閫氱煡涓葷嚎紼嬩笅杞借繘搴?br>
}
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
cout<<"success download file"<<endl;
return;
}
int main( void )
{
WinINet3(true,true);
return 1;
}
void OnInternetHandleCreated(HINTERNET hInternet, LPINTERNET_ASYNC_RESULT lpInetStatusResult)
{
if(NULL == lpInetStatusResult)
{
//ATLASSERT( 0 );
return;
}
hFile = HINTERNET(lpInetStatusResult->dwResult);
HINTERNET hInet = HINTERNET(lpInetStatusResult->dwResult);
DWORD dwInetHandleType;
DWORD dwTypeLen = sizeof(dwInetHandleType);
InternetQueryOption( hInet, INTERNET_OPTION_HANDLE_TYPE, &dwInetHandleType, &dwTypeLen);
switch(dwInetHandleType)
{
case INTERNET_HANDLE_TYPE_CONNECT_HTTP:
//CloseInternetConnection(); // 榪欓噷鏄綍鎰忥紵錛燂紵錛?閫氳繃鍥炶皟 璁劇疆httpConnect
hConnect = hInet; //
break;
case INTERNET_HANDLE_TYPE_HTTP_REQUEST:
//CloseInternetFile(); // 榪欓噷鏄綍鎰忥紵錛?nbsp; 閫氳繃鍥炶皟 璁劇疆httpFile
hRequest = hInet; //
break;
default:
break;
}
cout<<"OnInternetHandleCreated, so ::SetEvent(hEvent[0])"<<endl;
// HANDLE宸插垱寤轟簨浠訛紙寮傛鎺у埗錛?br> ::SetEvent(hEvent[0]);
}
void OnInternetRequestComplete(HINTERNET hInternet, LPINTERNET_ASYNC_RESULT lpInetStatusResult)
{
if( lpInetStatusResult == NULL )
{
//ATLASSERT( 0 );
return;
}
cout<<"OnInternetRequestComplete, so ::SetEvent(hEvent[2])"<<endl;
// 嬋鍙戣姹傚畬鎴愪簨浠訛紙寮傛鎺у埗錛?br> ::SetEvent(hEvent[0]);
}
void CALLBACK InternetStatusCallback(
HINTERNET hInternet,
DWORD_PTR dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
)
{
cout<<"榪涘叆鍥炶皟"<<endl;
switch (dwInternetStatus)
{
case INTERNET_STATUS_RESOLVING_NAME:
break;
case INTERNET_STATUS_NAME_RESOLVED:
break;
case INTERNET_STATUS_CONNECTING_TO_SERVER:
break;
case INTERNET_STATUS_CONNECTED_TO_SERVER:
break;
case INTERNET_STATUS_SENDING_REQUEST:
break;
case INTERNET_STATUS_REQUEST_SENT:
break;
case INTERNET_STATUS_RECEIVING_RESPONSE:
break;
case INTERNET_STATUS_RESPONSE_RECEIVED:
break;
case INTERNET_STATUS_CLOSING_CONNECTION:
break;
case INTERNET_STATUS_CONNECTION_CLOSED:
break;
case INTERNET_STATUS_HANDLE_CREATED:
cout<<"鍥炶皟鏄疘NTERNET_STATUS_HANDLE_CREATED"<<endl;
OnInternetHandleCreated(hInternet, LPINTERNET_ASYNC_RESULT(lpvStatusInformation)); // 浼犻掍簡HINTERNET 榪欐槸綺鵑珦鍛
break;
case INTERNET_STATUS_HANDLE_CLOSING:
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
cout<<"鍥炶皟鏄疘NTERNET_STATUS_REQUEST_COMPLETE"<<endl;
OnInternetRequestComplete(hInternet, LPINTERNET_ASYNC_RESULT(lpvStatusInformation));
break;
case INTERNET_STATUS_REDIRECT:
case INTERNET_STATUS_INTERMEDIATE_RESPONSE:
case INTERNET_STATUS_STATE_CHANGE:
default:
break;
}
}
CRect BoxRect;
BoxRect=rect;
BoxRect.right =BoxRect.left +15;
dc.DrawFrameControl(BoxRect,DFC_BUTTON,DFCS_BUTTONCHECK|GetCheck()?DFCS_CHECKED :0);
CFont myFont;
myFont.CreatePointFont (100,_T("瀹嬩綋"));
CFont *pOldFont=(CFont *)dc.SelectObject(&myFont);
dc.SetBkMode(TRANSPARENT);
CString StrWndText;
GetWindowText(StrWndText);
rect.OffsetRect (20,0);
dc.SetTextColor(RGB(0,0,0));
dc.DrawText(StrWndText, rect, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
dc.SelectObject (pOldFont);
myFont.DeleteObject ();
}
銆銆姝h杞歡緇忓父鐢ㄥ埌涓存椂鏂囦歡錛屼綘緇忓父鍙互浼氱湅鍒癈:\Windows\Temp鐩綍涓嬫湁澶ч噺鐨勬墿灞曞悕涓簍mp鐨勬枃浠訛紝榪欎簺灝辨槸紼嬪簭榪愯鏄緩绔嬬殑涓存椂鏂囦歡銆備復鏃舵枃浠剁殑浣跨敤鏂規(guī)硶鍩烘湰涓庡父瑙勬枃浠朵竴鏍鳳紝鍙槸鏂囦歡鍚嶅簲璇ヨ皟鐢ㄥ嚱鏁癎etTempFileName()鑾峰緱銆傚畠鐨勭涓涓弬鏁版槸寤虹珛姝や復鏃舵枃浠剁殑璺緞錛岀浜屼釜鍙傛暟鏄緩绔嬩復鏃舵枃浠跺悕鐨勫墠緙錛岀鍥涗釜鍙傛暟鐢ㄤ簬寰楀埌寤虹珛鐨勪復鏃舵枃浠跺悕銆傚緱鍒版涓存椂鏂囦歡鍚嶄互鍚庯紝浣犲氨鍙互鐢ㄥ畠鏉ュ緩绔嬪茍鎿嶄綔鏂囦歡浜嗭紝濡傦細
銆銆char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
銆銆GetTempPath(_MAX_PATH, szTempPath);
銆銆GetTempFileName(szTempPath,_T ("my_"),0,szTempfile);
銆銆CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite);
銆銆char m_char='a';
銆銆m_tempFile.Write(&m_char,2);
銆銆m_tempFile.Close();
銆銆5錛庢枃浠剁殑澶嶅埗銆佸垹闄ょ瓑
銆銆MFC涓病鏈夋彁渚涚洿鎺ヨ繘琛岃繖浜涙搷浣滅殑鍔熻兘錛屽洜鑰岃浣跨敤SDK銆係DK涓殑鏂囦歡鐩稿叧鍑芥暟甯哥敤鐨勬湁CopyFile()銆丆reateDirectory()銆丏eleteFile()銆丮oveFile()銆傚畠浠殑鐢ㄦ硶寰堢畝鍗曪紝鍙弬鑰僊SDN銆?
1,鍒ゆ柇鏂囦歡鏄惁瀛樺湪
access(filename,mode);
2,瀵逛簬涓嶅悓鐢ㄩ斿張涓嶅悓鐨勬枃浠舵搷浣?鍏朵腑API鍑芥暟CreateFile()涔熸槸姣旇緝鏈夌敤澶勭悊鏂瑰紡,瀵逛簬宸ㄥ瀷鏂囦歡寰堝悎閫傜殑鍏朵粬鐨勬ゼ涓婄殑澶ч兘璇翠簡,涓嶉噸澶嶄簡.
[1]鏄劇ず瀵硅瘽妗嗭紝鍙栧緱鏂囦歡鍚?/p>
CString FilePathName;
CFileDialog dlg(TRUE);///TRUE涓篛PEN瀵硅瘽妗嗭紝FALSE涓篠***E AS瀵硅瘽妗?br>if (dlg.DoModal() == IDOK)
FilePathName=dlg.GetPathName();
鐩稿叧淇℃伅錛欳FileDialog 鐢ㄤ簬鍙栨枃浠跺悕鐨勫嚑涓垚鍛樺嚱鏁幫細
鍋囧閫夋嫨鐨勬枃浠舵槸C:\WINDOWS\TEST.EXE
鍒?1)GetPathName();鍙栨枃浠跺悕鍏ㄧО錛屽寘鎷畬鏁磋礬寰勩傚彇鍥濩:\WINDOWS\TEST.EXE
(2)GetFileTitle();鍙栨枃浠跺叏鍚嶏細TEST.EXE
(3)GetFileName();鍙栧洖TEST
(4)GetFileExt();鍙栨墿灞曞悕EXE
[2]鎵撳紑鏂囦歡
CFile file("C:\HELLO.TXT",CFile::modeRead);//鍙鏂瑰紡鎵撳紑
//CFile::modeRead鍙敼涓?CFile::modeWrite(鍙啓),
//CFile::modeReadWrite(璇誨啓),CFile::modeCreate(鏂板緩)
渚嬪瓙錛?br>{
CFile file;
file.Open("C:\HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);
.
.
.
}
[3]縐誨姩鏂囦歡鎸囬拡
file.Seek(100,CFile::begin);///浠庢枃浠跺ご寮濮嬪線涓嬬Щ鍔?00瀛楄妭
file.Seek(-50,CFile::end);///浠庢枃浠舵湯灝懼線涓婄Щ鍔?0瀛楄妭
file.Seek(-30,CFile::current);///浠庡綋鍓嶄綅緗線涓婄Щ鍔?0瀛楄妭
file.SeekToBegin();///縐誨埌鏂囦歡澶?br>file.SeekToEnd();///縐誨埌鏂囦歡灝?/p>
[4]璇誨啓鏂囦歡
璇繪枃浠訛細
char buffer[1000];
file.Read(buffer,1000);
鍐欐枃浠訛細
CString string("鑷己涓嶆伅");
file.Write(string,8);
[5]鍏抽棴鏂囦歡
file.Close();
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/zhuang_rui/archive/2007/09/28/1804875.aspx
鍦∕FC綾誨簱鎻愪緵浜?strong>CWnd::OnCtlColor鍑芥暟,鍦ㄥ伐浣滄鏋剁殑瀛愮獥鍙h閲嶇敾鏃跺皢璋冪敤璇ユ垚鍛樺嚱鏁?鍥犳鍙互閲嶈澆WM_CTLCOLOR娑堟伅鐨勫搷搴斿嚱鏁?姝ゅ嚱鏁扮殑鍘熷瀷:
afx_msg
HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
鍙傛暟nCtlColor鐢ㄤ簬鎸囧畾鎺т歡鐨勭被鍨?鍙互鏄?
.CTLCOLOR_BTN 鎸夐挳鎺т歡
.CTLCOLOR_DLG
瀵硅瘽妗?br> .CTLCOLOR_EDIT
緙栬緫妗?br> .CTLCOLOR_LISTBOX 鍒楄〃鎺т歡
.CTLCOLOR_MSGBOX
娑堟伅鎺т歡
.CTLCOLOR_SCROLLBAR 婊氬姩鏉℃帶浠?br>
.CTLCOLOR_STATIC
闈欐佹帶浠?br>[紼嬪簭瀹炵幇]
鍋囪浣犲凡鏈変簡鍚嶄負My鐨勫璇濇宸ョ▼.浣犳湁浜嗕竴涓?strong>STATIC鐨勬帶浠訛紝ID涓?strong>IDC_STATIC1.
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the
DC here
if (nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(255,0,0)); //瀛椾綋棰滆壊
pDC->SetBkColor(RGB(0, 0,
255)); //瀛椾綋鑳屾櫙鑹?/font>
}
//
TODO: Return a different brush if the default is not
desired
return hbr;
}
濡傛灉瑕佹寚瀹氭煇涓壒瀹氭帶浠跺彲浠ヨ繖鏍峰啓錛?strong>ID涓篒DC_STATIC1
if (pWnd->GetDlgCtrlID()==IDC_STATIC1)
{
pDC->SetTextColor(RGB(255,0,0)); //璁劇疆瀛椾綋棰滆壊
pDC->SetBkMode(TRANSPARENT); //璁劇疆瀛椾綋鑳屾櫙涓洪忔槑
//
TODO: Return a different brush if the default is not
desired
return (HBRUSH)::GetStockObject(BLACK_BRUSH); //
璁劇疆鑳屾櫙鑹?br>}
else
return hbr;
銆愭敞銆?/strong>
BLACK_BRUSH:榛戣壊
WHITE_BRUSH:鐧借壊
GRAY_BRUSH:鐏拌壊
NULL_BRUSH:閫忔槑
HOLLOW_BRUSH 錛氶忔槑
娉細濡傛灉鍦ㄧ獥浣撲腑浣跨敤榪欑鏂規(guī)硶錛屼細寮曡搗浠g爜鐨勮噧鑲匡紝寤鴻鑷畾涔夎嚜宸辯殑綾匯?/span>
Windows Template Library - WTL鐨勫畨瑁呮寚鍗楁弧鍦伴兘鏄紝鑰屼笖婧愮▼搴忎篃闄勫甫浜嗗畨瑁呰鏄庯紝浼間箮娌℃湁蹇呰鍐嶅鍐欎竴涓備絾鏄紝浜嬫儏騫舵病鏈夋兂璞$殑閭d箞綆鍗曪紝鏈漢鏈夎繃灝嗚繎4騫寸殑C++寮鍙戠粡楠岋紝鍦ㄤ袱騫村墠鍒氳漿鍏#錛屾湁寰堥暱鏃墮棿娌$C++浜嗭紙鏈鍚庝嬌鐢ㄧ殑宸ュ叿鏄疺C++6.0錛夈備粖澶╃獊鍙戝叴瓚o紝鎯寵鐜╃帺VC++ 2005鍜學TL錛岃皝鐭ワ紝浠ユ垜榪欑緇忛獙錛屾姌鑵捐繖鐪嬫槸綆鍗曠殑鐜╂剰錛屼篃鑺變簡澶у崐澶╃殑鏃墮棿鏂規(guī)墠鎼炲嚭絎竴涓猈TL鐨凥ello World錛屼釜涓洸鎶橈紝璇存潵瀹炲湪鎯劎錛屽彧濂芥妸姝g‘鐨勫畨瑁呰繃紼嬪啓涓涓嬶紝濡傛灉鑳界粰鍒漢涓鐐規(guī)彁紺猴紝閭f槸鏈濂界殑浜嗐傝嚦灝戯紝鍙互鍋氫釜絎旇錛屼袱涓夊勾浠ュ悗濡傛灉鍙堝繕浜嗭紝榪樺彲浠ュ洖鏉ョ炕緲匯?/font>
1銆佷粠http://sourceforge.net/projects/wtl涓嬭澆鏈鏂扮増鏈殑WTL錛屽綋鏃舵槸8.0
2銆佷笅杞藉緱鍒扮殑鏄竴涓嚜瑙e帇鏂囦歡錛屽彲浠ヨВ鍘嬪埌浠繪剰鐩綍銆傛瘮濡俤:\wtl80錛屼笅闈㈡湁鍑犱釜瀛愮洰褰晄amples, include, AppWizMobile, AppWizCE, AppWiz錛岃繕鏈変竴涓猼xt鏂囦歡鍜宧tm鏂囦歡銆傚叾涓璱nclude鏄ご鏂囦歡錛宻amples鏄嚑涓ず渚嬶紝AppWiz*鏄悇縐嶅悜瀵兼枃浠躲?br>3銆佸湪鍛戒護琛岄噷鎵ц錛歸script.exe "D:\WTL80\AppWiz\setup80.js"錛屽鏋滄槸vs2005 express銆乿s2003絳夛紝鍒嗗埆鎵цsetup80x.js, setup70.js,鍙互鐪嬬湅閲岄潰鐨勬枃妗h鏄庛?br> 娉細榪欐槸涓涓緢瀹規(guī)槗璁╀漢鍥版儜鐨勫湴鏂癸紝緗戜笂鐨勬枃妗e叏閮借瑙e帇鍚庢墽琛宻etup80.js鏂囦歡錛屼絾閮芥病璇村浣曟墽琛屻傚悗鏉ュ湪浠g爜閲岀湅鍒版湁WScript錛屾墠鎯沖埌鐢╓SCript.exe鏉ユ墽琛屻?/font>
4銆佹墦寮VS2005, 閫夋嫨VC++欏圭洰錛屽氨鍙互鐪嬪埌WTL欏圭洰鐨勫悜瀵間簡銆?/font>
5銆佸湪VS2005閲岋紝鎵撳紑鑿滃崟“宸ュ叿”鈥斺旈夐」鈥斺旈」鐩拰瑙e喅鏂規(guī)鈥斺擵C++鐩綍錛屽湪“鏄劇ず浠ヤ笅鍐呭鐨勭洰褰?#8221;涓嬫媺妗嗕腑錛岄夋嫨“鍖呭惈鏂囦歡”錛屽姞鍏ュ垰鎵嶈В鍘嬬殑wtl涓嬬殑include錛屾湰渚嬩腑鏄?d:\wtl80\include"銆?/font>
6銆佹寜鐓у悜瀵煎垱寤轟竴涓▼搴忥紝緙栬瘧錛屾墽琛岋紝OK銆?/font>
鐢ㄥ悜瀵煎緩绔嬩竴涓猈in32紼嬪簭“hello, world!”錛岀劧鍚庣敤涓嬮潰鐨勫唴瀹規(guī)浛鎹㈡暣涓狢PP鏂囦歡鍐呭灝卞彲浠ヤ簡
#include "stdafx.h"
#include "resource.h"
#include "ShellApi.h"
HINSTANCE hInst = NULL;
HDESK hDesktopCurrent;
HDESK hDesktopLlx;
LONG APIENTRY WndProc(
HWND hWnd,
UINT message, // type of message
WPARAM wParam, // additional information
LPARAM lParam) // additional information
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
//DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
//DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
/*
case WM_DESTROY:
PostQuitMessage(0);
break;
//*/
case WM_LBUTTONDOWN:
break;
case WM_HOTKEY:
if(7777 == wParam)
{
PostQuitMessage(0);
}
else if(7778 == wParam)
{
SwitchDesktop(hDesktopCurrent);
}
else if(7779 == wParam)
{
SwitchDesktop(hDesktopLlx);
}
break;
case WM_QUIT:
case WM_DESTROY:
SwitchDesktop(hDesktopCurrent);
return DefWindowProc(hWnd, message, wParam, lParam);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void StartMyExplore(void)
{
STARTUPINFO sui; // Process startup info
PROCESS_INFORMATION pi; // info returned from CreateProcess
//
// Most sui members will be 0
//
ZeroMemory ((PVOID)&sui, sizeof(sui));
sui.cb = sizeof (sui);
//
// Need the lpDesktop member so the new process runs on this desktop
// The lpDesktop member was reserved in previous versions of NT
//
sui.lpDesktop = _T("llx");
CreateProcess (NULL, // image name
"explorer", // command line
NULL, // process security attributes
NULL, // thread security attributes
TRUE, // inherit handles
CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,
NULL, // environment block
NULL, // current directory
&sui, // STARTUPINFO
&pi); // PROCESS_INFORMATION
}
int CALLBACK WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, "IDI_SETTHREADDESKTOP");
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "lilinxiang";
if(!RegisterClass(&wc))
{
return TRUE;
}
hDesktopCurrent = NULL;
hDesktopCurrent = GetThreadDesktop(GetCurrentThreadId());
hDesktopLlx = NULL;
hDesktopLlx = OpenDesktop("llx", 0, FALSE, NULL);
if (hDesktopLlx != NULL)
{
CloseDesktop(hDesktopLlx);
}
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
hDesktopLlx = CreateDesktop("llx", NULL,
NULL,0,MAXIMUM_ALLOWED,
NULL);
if(hDesktopLlx == NULL)
{
return 0;
}
if(!SetThreadDesktop(hDesktopLlx))
{
char szError[256] = {0};
ltoa( (long)(GetLastError()) , szError, 10);
}
SwitchDesktop(hDesktopLlx);
HWND hWnd = NULL;
hWnd = CreateWindow ("lilinxiang",
"hello, world!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
if(NULL == hWnd)
{
return TRUE;
}
//register hotkey for exit this desktop or switch to another desktop
//ShowWindow(hWnd, SW_SHOW);
//UpdateWindow(hWnd);
if(!RegisterHotKey(hWnd, 7777, MOD_CONTROL, 'Q'))
{//exit process
return TRUE;
}
if(!RegisterHotKey(hWnd, 7778, MOD_CONTROL | MOD_SHIFT, 'Q'))
{//switch to new desktop
return TRUE;
}
if(!RegisterHotKey(hWnd, 7779, MOD_CONTROL | MOD_SHIFT, 'W'))
{//switch to original desktop
return TRUE;
}
StartMyExplore();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);// Translates virtual key codes
DispatchMessage(&msg); // Dispatches message to window
}
SwitchDesktop(hDesktopCurrent);
return TRUE;
}
// : ) 濂戒笢瑗垮櫌
鐢–reateDesktop鏂板緩涓涓闈紝浠涔堥兘娌℃湁鐨勬闈紝鐒跺悗鍦ㄦ柊妗岄潰鐜涓繍琛屼簡explorer鎵浠ュ氨鏈変簡鍜寃indows涓鏍峰姛鑳界殑妗岄潰錛岃繖涓椂鍊欎綘灝辨湁浜嗕袱涓闈簡錛屼笅闈㈣鍋氱殑灝辨槸鐢⊿witchDesktop鍒囨崲涓嶅悓鐨勬闈簡
鍦ㄤ笉鍚屾闈腑鎵撳紑鐨勭▼搴忓湪鍏朵粬妗岄潰鐨勪換鍔℃爮鍖呮嫭緋葷粺鎵樼洏涓婁笉鍙錛屼笉榪囦換鍔$鐞嗗櫒涓繕鏄彲瑙佺殑榪欐牱浣犲氨闈炲父鏂逛究鐨勫仛寰堝浜嬩簡錛屽緢澶?.. 鑰屼笖榪樺彲浠ラ潪甯稿揩鐨勮漿鍒版甯哥姸鎬佷笂鍙互璁╀細璐i獋浣犵殑浜烘瘮濡傝佹澘浠涔堢殑鏃犺瘽鍙錛屽洜涓轟粬浠粈涔堜篃鐪嬩笉鍒?nbsp; : )
鎴栬呬綘涔熷彲浠ョ粰浣犵敤鎴峰畾鍒朵竴涓釜鎬у寲鐨勬闈€傛敼鏀逛笂闈㈢殑浠g爜鍙互寰楀埌浣犺鐨勬晥鏋滅殑銆?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/goingup/archive/2006/03/07/618323.aspx鐢ㄥ悜瀵煎緩绔嬩竴涓猈in32紼嬪簭“hello, world!”錛岀劧鍚庣敤涓嬮潰鐨勫唴瀹規(guī)浛鎹㈡暣涓狢PP鏂囦歡鍐呭灝卞彲浠ヤ簡
#include "stdafx.h"
#include "resource.h"
#include "ShellApi.h"
HINSTANCE hInst = NULL;
HDESK hDesktopCurrent;
HDESK hDesktopLlx;
LONG APIENTRY WndProc(
HWND hWnd,
UINT message, // type of message
WPARAM wParam, // additional information
LPARAM lParam) // additional information
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
//DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
//DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
/*
case WM_DESTROY:
PostQuitMessage(0);
break;
//*/
case WM_LBUTTONDOWN:
break;
case WM_HOTKEY:
if(7777 == wParam)
{
PostQuitMessage(0);
}
else if(7778 == wParam)
{
SwitchDesktop(hDesktopCurrent);
}
else if(7779 == wParam)
{
SwitchDesktop(hDesktopLlx);
}
break;
case WM_QUIT:
case WM_DESTROY:
SwitchDesktop(hDesktopCurrent);
return DefWindowProc(hWnd, message, wParam, lParam);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void StartMyExplore(void)
{
STARTUPINFO sui; // Process startup info
PROCESS_INFORMATION pi; // info returned from CreateProcess
//
// Most sui members will be 0
//
ZeroMemory ((PVOID)&sui, sizeof(sui));
sui.cb = sizeof (sui);
//
// Need the lpDesktop member so the new process runs on this desktop
// The lpDesktop member was reserved in previous versions of NT
//
sui.lpDesktop = _T("llx");
CreateProcess (NULL, // image name
"explorer", // command line
NULL, // process security attributes
NULL, // thread security attributes
TRUE, // inherit handles
CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,
NULL, // environment block
NULL, // current directory
&sui, // STARTUPINFO
&pi); // PROCESS_INFORMATION
}
int CALLBACK WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, "IDI_SETTHREADDESKTOP");
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "lilinxiang";
if(!RegisterClass(&wc))
{
return TRUE;
}
hDesktopCurrent = NULL;
hDesktopCurrent = GetThreadDesktop(GetCurrentThreadId());
hDesktopLlx = NULL;
hDesktopLlx = OpenDesktop("llx", 0, FALSE, NULL);
if (hDesktopLlx != NULL)
{
CloseDesktop(hDesktopLlx);
}
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
hDesktopLlx = CreateDesktop("llx", NULL,
NULL,0,MAXIMUM_ALLOWED,
NULL);
if(hDesktopLlx == NULL)
{
return 0;
}
if(!SetThreadDesktop(hDesktopLlx))
{
char szError[256] = {0};
ltoa( (long)(GetLastError()) , szError, 10);
}
SwitchDesktop(hDesktopLlx);
HWND hWnd = NULL;
hWnd = CreateWindow ("lilinxiang",
"hello, world!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
if(NULL == hWnd)
{
return TRUE;
}
//register hotkey for exit this desktop or switch to another desktop
//ShowWindow(hWnd, SW_SHOW);
//UpdateWindow(hWnd);
if(!RegisterHotKey(hWnd, 7777, MOD_CONTROL, 'Q'))
{//exit process
return TRUE;
}
if(!RegisterHotKey(hWnd, 7778, MOD_CONTROL | MOD_SHIFT, 'Q'))
{//switch to new desktop
return TRUE;
}
if(!RegisterHotKey(hWnd, 7779, MOD_CONTROL | MOD_SHIFT, 'W'))
{//switch to original desktop
return TRUE;
}
StartMyExplore();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);// Translates virtual key codes
DispatchMessage(&msg); // Dispatches message to window
}
SwitchDesktop(hDesktopCurrent);
return TRUE;
}
// : ) 濂戒笢瑗垮櫌
鐢–reateDesktop鏂板緩涓涓闈紝浠涔堥兘娌℃湁鐨勬闈紝鐒跺悗鍦ㄦ柊妗岄潰鐜涓繍琛屼簡explorer鎵浠ュ氨鏈変簡鍜寃indows涓鏍峰姛鑳界殑妗岄潰錛岃繖涓椂鍊欎綘灝辨湁浜嗕袱涓闈簡錛屼笅闈㈣鍋氱殑灝辨槸鐢⊿witchDesktop鍒囨崲涓嶅悓鐨勬闈簡
鍦ㄤ笉鍚屾闈腑鎵撳紑鐨勭▼搴忓湪鍏朵粬妗岄潰鐨勪換鍔℃爮鍖呮嫭緋葷粺鎵樼洏涓婁笉鍙錛屼笉榪囦換鍔$鐞嗗櫒涓繕鏄彲瑙佺殑榪欐牱浣犲氨闈炲父鏂逛究鐨勫仛寰堝浜嬩簡錛屽緢澶?.. 鑰屼笖榪樺彲浠ラ潪甯稿揩鐨勮漿鍒版甯哥姸鎬佷笂鍙互璁╀細璐i獋浣犵殑浜烘瘮濡傝佹澘浠涔堢殑鏃犺瘽鍙錛屽洜涓轟粬浠粈涔堜篃鐪嬩笉鍒?nbsp; : )
鎴栬呬綘涔熷彲浠ョ粰浣犵敤鎴峰畾鍒朵竴涓釜鎬у寲鐨勬闈€傛敼鏀逛笂闈㈢殑浠g爜鍙互寰楀埌浣犺鐨勬晥鏋滅殑銆?/font>
The WM_NCLBUTTONDOWN message is posted when the user presses the left mouse button while the cursor is within the nonclient area of a window. This message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
浣跨敤WM_NCLBUTTONDOWN 娑堟伅錛?br>鍒╃敤鏍囬鏍忕殑娑堟伅錛屾楠梬indows浣垮緱鐐瑰嚮瀹㈡埛鍖哄彲瀹炵幇紿椾綋鐨勭Щ鍔ㄣ傚湪鎵撳嚮瀹㈡埛鍖虹殑鏃跺欏亣浼犳秷鎭粰windows錛屽憡璇変粬鐜板湪宸﹀嚮鏍囬鏍忋?br>class A
{
public:
virtual void FA() = 0;
};
class B
{
public:
virtual void FB() = 0;
};
class C : public A , public B
{
public:
void FA(){cout<<"FA"<<endl;}
void FB(){cout<<"FB"<<endl;}
};
int main()
{
C* mc = new C();
B* mb = static_cast<B*>(mc);
((A*)mb)->FA();
return 0;
}
杈撳嚭鐨勬槸FB, com涓埄鐢ㄨ繖鏈哄埗瀹炵幇浜嗚仛鍚堛?/p>
鎸塐K鍚庯紝濡傛灉椹笂緙栬瘧鐨勮瘽浼氬嚭鐜板涓嬮敊璇細
LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/Dll.dll : fatal error LNK1120: 1 unresolved externals
鎵撳紑VC++鑿滃崟Project\Settings\C/C++閫夐」鍗★紝濡備笅鍥撅紝鍦≒roject Options錛氭湯灝劇殑鍦版柟娣誨姞”/D”錛堝浘涓摑鑹查珮浜殑鍦版柟錛夛紝瑕佹敞鎰忎綅緗紝鎴戣瘯浜嗭紝瑕佹妸/D鏀懼埌/GZ鍚庨潰涔熶細閾炬帴閿欒錛屾垜涔熶笉鎳備負浠涔堬紝^_^銆傛寜OK錛屽啀嬈$紪璇戯紝鎴愬姛銆傚ぇ瀹跺彲浠ヨ嚜宸辨祴璇曚笅鍒板簳鏈夋病鏈夋洿鏀規(guī)垚鍔燂紝浠涔堬紝濡傛灉嫻嬭瘯錛熸墦鍑鴻皟寮忎俊鎭晩銆?/p>
1.4 DisableThreadLibraryCalls
鐪嬪府鍔╁氨鐭ラ亾瀹冩槸騫蹭箞鐢ㄧ殑錛?br>The DisableThreadLibraryCalls function disables the DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for the dynamic-link library (DLL) specified by hLibModule. This can reduce the size of the working code set for some applications.
鍘熸枃鍦板潃錛?a >http://www.blogjava.net/Yipak/articles/182025.html
int __stdcall Sub(int numa, int numb)
{
return (numa - numb);
}
鐒跺悗鍒涘緩涓涓?def鐨勬枃浠訛紝鍦ㄩ噷闈㈠姞涓?br>
;DllTestDef.lib : 瀵煎嚭DLL鍑芥暟
;浣滆咃細----
LIBRARY defDll.dll
EXPORTS
Add @ 1
Sub @ 2
鏈鍚庡垱寤轟竴涓祴璇曠▼搴忥細.cpp鏂囦歡濡備笅錛?br>#include <iostream>
#include <windows.h>
using namespace std;
typedef int (__stdcall *Fun)(int , int);
HINSTANCE hInstance;
Fun fun;
int main()
{
hInstance = LoadLibrary("defDll.dll");
if (!hInstance)
cout<<"Not Find this Dll"<<endl;
fun = (Fun)GetProcAddress(hInstance, MAKEINTRESOURCE(1));
cout<<fun(12,3)<<endl;;
fun = (Fun)GetProcAddress(hInstance, "Sub");
cout<<fun(7, 3)<<endl;
FreeLibrary(hInstance);
}
msdn涓細
Handle to a bitmap.typedef HANDLE HBITMAP;
cbitmap鏄痬fc涓皝瑁卋itmap鐨勭被錛?/p>
msdn涓細
Encapsulates錛堝泭鎷級 a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate錛堟搷浣滐級 the bitmap.
class CBitmap : public CGdiObject杞寲鏂規(guī)硶涓ょ錛?br>Attach鍜孎romHandle錛?br>CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
HBITMAP hbm = (HBITMAP)bmp;
CBitmap bmp1;
bmp1.Attach(hbm);
HBITMAP = CBitmap.m_hObject;
CBitmap* = CBitmap.FromHandle(HBITMAP)//宸茬煡
HBITMAP hbit;
CBitmap cb;
cb.FromHandle(hbit);//宸茬煡
CBitmap cb;
HBITMAP hbit=(HBITMAP)cb;
CBitmap bmp;HBITMAP hBmp;
鐩鎬簰杞崲錛歨Bmp=(HBITMAP)bmp.GetSafeHandle();bmp.Attach(hBmp);
娉ㄦ剰鐐癸細Attach鍜孎romHandle鐨勫尯鍒獸romHandle寰楀埌鐨勬寚閽堟槸涓存椂鍙橀噺錛?閫氳繃Attach榪炴帴鐨勫彞鏌勫彲浠ラ暱涔呬繚鐣?浣嗛氳繃FromHandle寰楀埌鐨勫彧鏄殏鏃剁殑,澶ф鍙湪涓涓秷鎭尯闂村唴鏈夋晥,寰堝揩渚夸細琚垹闄?鎵浠ュ熀鏈笂涓嶈兘鐢ㄣ傛垜鐢ㄤ簡FromHandle鐒跺悗涓鐩村嚭閿欙紒錛侊紒
CBitmap 鏃犳硶浠庢枃浠朵腑鍔犺澆浣嶅浘錛屽彲浠ョ敤涓嬮潰鐨勬柟娉曡В鍐熾?/p>
HBITMAP hBitmap;
//hBitmap = (HBITMAP)::LoadImage(::AfxGetInstanceHandle(), "NetFriend.bmp", IMAGE_BITMAP, 0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//浠庢枃浠朵腑鍔犺澆錛?br> hBitmap = (HBITMAP)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION);//浠庤祫婧愭枃浠朵腑鍔犺澆
MFC 娑堟伅鎺у埗嫻佹渶鍏風壒鑹茬殑鍦版柟鏄疌Wnd綾葷殑铏氭嫙鍑芥暟PreTranslateMessage()錛岄氳繃閲嶈澆榪欎釜鍑芥暟錛屽彲浠ユ敼鍙楳FC鐨勬秷鎭帶鍒舵祦紼嬶紝鐢氳嚦鍙互浣滀竴涓叏鏂扮殑鎺у埗嫻佸嚭鏉ャ傚彧鏈夌┛榪囨秷鎭槦鍒楃殑娑堟伅鎵嶅彈PreTranslateMessage()褰卞搷錛岄噰鐢⊿endMessage()鎴栧叾浠栫被浼肩殑鏂瑰紡鍚戠獥鍙g洿鎺ュ彂閫佺殑鑰屼笉緇忚繃娑堟伅闃熷垪鐨勬秷鎭牴鏈笉浼氱悊鐫琍reTranslateMessage()鐨勫瓨鍦ㄣ?nbsp;
鏄惁璋冪敤TranslateMessage()鍜孌ispatchMessage()鏄敱涓涓悕縐頒負PreTranslateMessage()鍑芥暟鐨勮繑鍥炲煎喅瀹氱殑錛屽鏋滆鍑芥暟榪斿洖TRUE錛屽垯涓嶄細鎶婅娑堟伅鍒嗗彂緇欑獥鍙e嚱鏁板鐞嗐?
浼犵粰PreTranslateMessage()鐨勬秷鎭槸鏈粡緲昏瘧榪囩殑娑堟伅錛屽畠娌℃湁緇忚繃TranslateMessage()澶勭悊銆傚彲浠ュ湪璇ュ嚱鏁頒腑浣跨敤(pMsg->wParam==VK_RETURN)鏉ユ嫤鎴洖杞﹂敭銆倃Param涓瓨鏀劇殑鏄敭鐩樹笂瀛楃鐨勮櫄鎷熺爜銆?
PeekMessage鍜孏etMessage鐨勫尯鍒細
GetMessage鍦ㄦ病鏈夋秷鎭殑鏃跺欑瓑寰呮秷鎭紝cpu褰撶劧浣?
PeekMessage娌℃湁娑堟伅鐨勬椂鍊欑珛鍒昏繑鍥烇紝鎵浠pu鍗犵敤鐜囬珮銆?
鍥犱負娓告垙涓嶈兘闈爓indows娑堟伅椹卞姩錛屾墍浠ヨ鐢≒eekMessage();
PretranslateMessage 鐨勫疄鐜幫紝涓嶅緱涓嶈皥鍒癕FC娑堟伅寰幆鐨勫疄鐜般侻FC閫氳繃CWinApp綾諱腑鐨凱umpmessage鍑芥暟瀹炵幇娑堟伅寰幆錛屼絾鏄疄闄呯殑娑堟伅寰幆浠g爜浣嶄簬 CWinThread涓紝CWinApp鍙槸浠嶤WinThread緇ф壙榪囨潵銆傚叾綆鍖栧悗鐨勪唬鐮佸ぇ姒傚涓嬶細
銆銆BOOL CWinThread::PumpMessage()
銆銆{
銆銆_AFX_THREAD_STATE *pState = AfxGetThreadState();
銆銆
銆銆::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
銆銆
銆銆if (!AfxPreTranslateMessage(&(pState->m_msgCur)))
銆銆{
銆銆::TranslateMessage(&(pState->m_msgCur));
銆銆::DispatchMessage(&(pState->m_msgCur));
銆銆}
銆銆return TRUE;
銆銆}
銆銆鍙互鐪嬪埌錛孭umpMessage鍦ㄥ疄闄呯殑TranslateMessage鍜孌ispatchMessage鍙戠敓涔嬪墠浼氳皟鐢?AfxPreTranslateMessage錛孉fxPreTranslateMessage鍙堜細璋冪敤 CWnd::WalkPreTranslateTree(铏界劧涔熶細璋冪敤鍏朵粬鍑芥暟錛屼絾鏄繖涓渶涓哄叧閿級錛屽叾浠g爜濡備笅錛?
銆銆BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg)
銆銆{
銆銆ASSERT(hWndStop == NULL || ::IsWindow(hWndStop));
銆銆ASSERT(pMsg != NULL);
銆銆
銆銆// walk from the target window up to the hWndStop window checking
銆銆// if any window wants to translate this message
銆銆
銆銆for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
銆銆{
銆銆CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
銆銆if (pWnd != NULL)
銆銆{
銆銆// target window is a C window
銆銆if (pWnd->PreTranslateMessage(pMsg))
銆銆return TRUE; // trapped by target window (eg: accelerators)
銆銆}
銆銆
銆銆// got to hWndStop window without interest
銆銆if (hWnd == hWndStop)
銆銆break;
銆銆}
銆銆return FALSE; // no special processing
銆銆}
銆銆
銆銆鍙互鐪嬪埌錛屼唬鐮佽繕鏄緢鐩存帴鐨勩備粠鎺ュ彈鍒版秷鎭殑紿楀彛灞傚眰寰涓婇亶鍘嗭紝騫惰皟鐢≒retranslateMessage鐪嬫槸鍚﹁繑鍥濼RUE錛屾槸鍒欑粨鏉燂紝鍚﹀垯緇х畫銆?
銆銆榪欓噷鏈変竴涓湴鏂歸潪甯稿叧閿細CWnd *pWnd = CWnd::FromHandlePermanent(hWnd) 榪欎竴鍙ヤ唬鐮佷粠褰撳墠AfxModuleThreadState鎷垮埌Permanent鍙ユ焺琛紝浠庤屾壘鍒癶Wnd瀵瑰簲鐨凜Wnd
MFC 涓璓reTranslateMessage鏄疓etMessage(...)鍑芥暟鐨勪笅涓綰ф搷浣滐紝鍗矴etMessage(...)浠庢秷鎭槦鍒椾腑鑾峰彇娑堟伅鍚庯紝浜ょ敱PreTranslateMessage錛堬級澶勭悊錛岃嫢鍏惰繑鍥濬ALSE鍒欏啀浜ょ粰TranslateMessage鍜?DispatchMessage澶勭悊錛堣繘鍏indowProc錛夛紱
濡傛灉鐢⊿endMessage, 鍒欐秷鎭洿鎺ヤ氦鍒癢indowProc澶勭悊錛屾墍浠etMessage涓嶄細鍙栧緱SendMessage鐨勬秷鎭紝褰撶劧PreTranslateMessage涔熷氨涓嶄細琚皟鐢ㄣ?nbsp; [Page]
濡傛灉鐢≒ostMessage,鍒欐秷鎭繘鍏ユ秷鎭槦鍒楋紝鐢盙etMessage鍙栧緱錛孭reTranslateMessage灝辨湁鏈轟細榪涜澶勭悊銆?
渚嬪瓙錛?br>鎸塃nter,ESC鎸夋槸涓嶄細閫鍑轟簡
BOOL CComboBoxExDlg::PreTranslateMessage(MSG* pMsg)
{
if(WM_KEYDOWN == pMsg->message )
{
UINT nKey = (int) pMsg->wParam;
if( VK_RETURN == nKey || VK_ESCAPE == nKey )
return TRUE ;
}
return CDialog::PreTranslateMessage(pMsg);
}
緙栬緫妗嗭紝濡備綍鍝嶅簲鐨勮繖涓洖杞︾殑淇℃伅
濡傛灉浣犵殑緙栬緫妗嗗畾涔夊涓?
CEdidt m_cName; //ID鍙蜂負IDC_E_NAME
BOOL CSecondDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call class
if (pMsg->message==WM_KEYDOWN)
{
//CWnd *p=GetDlgItem(IDC_E_NAME);
CWnd * hWnd=GetFocus();
//if(pMsg->wParam==13 && pMsg->hwnd==m_cName)
if(pMsg->wParam==13 && hWnd==&m_cName)
{
澶勭悊鍑芥暟
return TRUE;
}
else
{
澶勭悊鍑芥暟
}
}
return CDialog::PreTranslateMessage(pMsg);
}