锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 銆銆銆銆銆銆涓涓嚱鏁板湪緙栬瘧鏃惰鍒嗛厤涓涓叆鍙e湴鍧錛屽皢榪欎釜鍏ュ彛鍦板潃縐頒負鍑芥暟鐨勬寚閽堬紝鍙?span lang="EN-US"> 銆銆銆銆銆銆浠ョ敤涓涓寚閽堝彉閲忔寚鍚戣鍑芥暟鎸囬拡錛岀劧鍚庨氳繃璇ュ彉閲忔潵璋冪敤鍑芥暟銆?span lang="EN-US"> 銆銆銆銆銆銆鏈夊叧璇存槑錛?span lang="EN-US"> 銆銆銆銆銆銆1銆佸嚱鏁版寚閽堢殑澹版槑鏍煎紡錛?span lang="EN-US"> 銆銆銆銆銆銆銆 鍑芥暟榪斿洖鍊肩被鍨嬶紙錛婃寚閽堝彉閲忓悕錛夛紙鍙傛暟綾誨瀷鍒楄〃錛?span lang="EN-US"> 銆銆銆銆銆銆 鎴栬呮槸錛?span lang="EN-US"> 銆銆銆銆銆銆 typedef銆鍑芥暟榪斿洖鍊肩被鍨嬨錛堬紛鎸囬拡鍙橀噺鍚嶏級錛堝弬鏁扮被鍨嬪垪琛級 2銆佷竴涓嚱鏁版寚閽堝彧鑳芥寚鍚戜竴縐嶇被鍨嬬殑鍑芥暟錛屽嵆鍏鋒湁鐩稿悓鐨勮繑鍥炲煎拰鐩稿悓鐨勫弬銆銆銆銆銆銆銆銆銆銆銆銆 銆銆銆銆銆銆銆 鏁扮殑鍑芥暟 銆銆銆銆銆銆錛撱佸叧浜庡嚱鏁版寚閽堢殑鍔犲噺榪愮畻娌℃湁鎰忎箟 銆銆銆銆銆銆 鍑芥暟鎸囬拡鏁扮粍瀹氫箟錛?span lang="EN-US"> 鍑芥暟瀹氫箟錛?span lang="EN-US"> void fun1(void *p); void fun2(void *p); void fun3(void *p); 銆銆銆銆銆銆 鍑芥暟鎸囬拡鏁扮粍瀹氫箟錛?span lang="EN-US"> 銆銆銆銆銆銆 void(*fun[3])(void*);//typedef void(*pfun)(void*);pfun fun[3]; 銆銆銆銆銆銆 鎸囬拡璧嬪鹼細 fun[0] = fun1; fun[1] = fun2; fun[2] = fun3; 鍑芥暟璋冪敤錛?span lang="EN-US"> 銆銆銆銆銆銆 fun[0](&a); //int a; fun[1](&b); //int b; fun[3](&c); //int c; 涓涓寚鍚戞垚鍛樺嚱鏁扮殑鎸囬拡鍖呮嫭鎴愬憳鍑芥暟鐨勮繑鍥炵被鍨嬶紝甯?em>::絎﹀彿鐨勭被鍚嶇О錛屽嚱鏁板弬鏁拌〃銆傝櫧鐒惰繖涓璇硶鐪嬩技澶嶆潅錛屽叾瀹炲畠鍜屾櫘閫氱殑鎸囬拡鏄竴鏍風殑銆傛寚鍚戝閮ㄥ嚱鏁扮殑鎸囬拡鍙涓嬪0鏄庯細 void (*pf)(char *, const char *); 鐩稿簲鎸囧悜綾?span lang="EN-US">A鐨勬垚鍛樺嚱鏁扮殑鎸囬拡濡備笅琛ㄧず錛?span lang="EN-US"> 浠ヤ笂pmf鏄寚鍚戠被A鐨勪竴涓垚鍛樺嚱鏁扮殑鎸囬拡錛屼紶閫掍袱涓彉閲?em>char *鍜?const char *錛屾病鏈夎繑鍥炲箋傛敞鎰忔槦鍙峰墠闈㈢殑A::絎﹀彿錛岃繖鍜屽墠闈㈢殑澹版槑鏄竴鑷寸殑銆?span lang="EN-US"> 浣犲彲浠ヤ嬌鐢?span lang="EN-US">typedef鏉ラ殣钘忎竴浜涙寚鍚戞垚鍛樺嚱鏁扮殑澶嶆潅鎸囬拡銆備緥濡傦紝涓嬮潰鐨勪唬鐮佸畾涔変簡涓涓被A涓殑鎴愬憳鍑芥暟鐨勬寚閽?em>PMA錛屽茍浼犻?em>char *鍜?em>const char *鍙傛暟銆?span lang="EN-US"> 浣跨敤typedef鐗瑰埆鏈夌敤錛屽挨鍏舵槸瀵逛簬鎸囧悜鎴愬憳鍑芥暟鐨勬暟緇勬寚閽堛?span lang="EN-US"> 鈻?/font> void綾誨瀷鐨勬寚閽?span lang="EN-US"> void鍚箟錛?span lang="EN-US"> void鏄?#8220;鏃犵被鍨?#8221;錛?span lang="EN-US">void*鍒欎負鏃犵被鍨嬫寚閽堬紝void*鍙互鎸囧悜浠諱綍綾誨瀷鐨勬暟鎹?span lang="EN-US"> void a錛?span lang="EN-US">//姝ゅ彉閲忔病鏈変換浣曞疄闄呮剰涔夛紝鏃犳硶緙栬瘧閫氳繃“illegal use of type” void 鐨勪綔鐢細 1銆佸紼嬪簭榪斿洖鐨勯檺瀹?span lang="EN-US"> 2銆佸鍑芥暟鍙傛暟鐨勯檺瀹?span lang="EN-US"> 鎴戜滑鐭ラ亾錛屽浣曟寚閽?span lang="EN-US">p1鍜?span lang="EN-US">p2鐨勭被鍨嬬浉鍚岋紝閭d箞鎴戜滑鍙互鐩存帴鍦?span lang="EN-US">p1鍜?span lang="EN-US">p2闂磋祴鍊鹼紝濡傛灉涓嶅悓錛屽繀欏諱嬌鐢ㄥ己鍒剁被鍨嬭漿鎹€?span lang="EN-US"> 濡傦細float *p1; int *p2; 鑻ワ細p1 = p2; 緙栬瘧鍑洪敊錛?#8220;can not covert from int* to float*” 蹇呴』涓猴細p1 = (float*)p2; 鑰?span lang="EN-US">void*涓嶅悓錛屼換浣曠被鍨嬬殑鎸囬拡閮藉彲浠ョ洿鎺ヨ祴涓哄畠錛屼笉闇瑕佸己鍒剁被鍨嬭漿鎹細 濡傦細void *p1; int *p2; 鍙綔錛?span lang="EN-US">p1 =p2; 鏃犵被鍨嬪彲浠ュ寘瀹規湁綾誨瀷錛屾湁綾誨瀷涓嶈兘鍖呭鏃犵被鍨嬶細 蹇呴』涓猴細p2 = (int*)p1; viod 鍜?span lang="EN-US"> void*浣跨敤瑙勫垯鎬葷粨錛?span lang="EN-US"> 鈼?/font> 濡傛灉鍑芥暟娌℃湁榪斿洖鍊鹼紝閭d箞搴斿0鏄庝負void綾誨瀷 鍦?/span>C璇█涓紝鍑′笉鍔犺繑鍥炲肩被鍨嬮檺瀹氱殑鍑芥暟錛屽氨浼氳緙栬瘧鍣ㄤ綔涓鴻繑鍥炴暣鍨嬪煎鐞嗐備絾鏄澶氱▼搴忓憳鍗磋浠ヤ負鍏朵負void綾誨瀷. 鍥犳錛屼負浜嗛伩鍏嶆販涔憋紝鎴戜滑鍦ㄧ紪鍐?/span>C/C++紼嬪簭鏃訛紝瀵逛簬浠諱綍鍑芥暟閮藉繀欏諱竴涓笉婕忓湴鎸囧畾鍏剁被鍨嬨傚鏋滃嚱鏁版病鏈夎繑鍥炲鹼紝涓瀹氳澹版槑涓?/span>void綾誨瀷銆傝繖鏃㈡槸紼嬪簭鑹ソ鍙鎬х殑闇瑕侊紝涔熸槸緙栫▼瑙勮寖鎬х殑瑕佹眰銆傚彟澶栵紝鍔犱笂void綾誨瀷澹版槑鍚庯紝涔熷彲浠ュ彂鎸ヤ唬鐮佺殑“鑷敞閲?/span>”浣滅敤銆備唬鐮佺殑“鑷敞閲?/span>”鍗充唬鐮佽兘鑷繁娉ㄩ噴鑷繁銆?/span> 鈼?/span> 濡傛灉鍑芥暟鏃犲弬鏁幫紝閭d箞搴斿0鏄庡叾鍙傛暟涓?/span>void 鈼?/span> 灝忓績浣跨敤void鎸囬拡綾誨瀷 鎸夌収ANSI鐨勬爣鍑嗭紝涓嶈兘瀵?/span>void鎸囬拡榪涜綆楁硶鎿嶄綔錛屽嵆涓嬪垪鎿嶄綔鏄笉鍚堟硶鐨勶細 void *pvoid; pvoid ++; //ansi閿欒 pvoid += 1; //ansi 閿欒 ansi鏍囧噯涔嬫墍浠ヨ繖鏍瘋瀹氾紝鏄洜涓哄畠鍧氭寔錛岃繘琛岀畻娉曟搷浣滅殑鎸囬拡蹇呴』鏄‘瀹氱煡閬撳叾鎸囧悜鏁版嵁綾誨瀷鐨勫ぇ灝忕殑銆?/span> 浣?/span>GUN錛?/span>GUN’s Not Unix錛夊垯涓嶈繖涔堣涓猴紝瀹冩寚瀹?/span>void*鐨勭畻娉曟搷浣滀笌char*涓鑷淬傚洜姝ゅ湪GUN緙栬瘧鍣ㄤ腑涓婅堪璇彞鏄紜殑銆?/span> 鍦ㄥ疄闄呯殑紼嬪簭涓紝涓轟簡榪庡悎ansi鏍囧噯錛屽茍鎻愰珮紼嬪簭鐨勫彲縐繪鎬э紝鎴戜滑鍙互榪欐牱瀹炵幇鍚屾牱鍔熻兘鐨勪唬鐮侊細 void *pvoid; (char*)pvoid++; (char*)pvoid += 1; 鈼?濡傛灉鍑芥暟鐨勫弬鏁板彲浠ユ槸浠繪剰綾誨瀷鎸囬拡錛岄偅涔堝簲澹版槑鍏跺弬鏁頒負void * 鍏稿瀷鐨勫鍐呭瓨鎿嶄綔鍑芥暟memcpy鍜?/span>memset鐨勫嚱鏁板師鍨嬪垎鍒負錛?/span> void* memcpy(void *dest, const void *src, size_t len); void* memset(void *buffer,int c, size_t num); 榪欐牱錛屼換浣曠被鍨嬬殑鎸囬拡閮藉彲浠ヤ紶鍏?/span>memcpy鍜?/span>memset涓紝榪欎篃鐪熷疄鍦頒綋鐜頒簡鍐呭瓨鎿嶄綔鍑芥暟鐨勬剰涔夛紝鍥犱負瀹冩搷浣滅殑瀵硅薄浠呬粎鏄竴鐗囧唴瀛橈紝鑰屼笉璁哄唴瀛樻槸浠綾誨瀷銆?/span> 鈼?void涓嶈兘浠h〃涓涓湡瀹炵殑鍙橀噺 void a; //閿欒 function(void a); //閿欒 鈻?/font> this鎸囬拡 銆婃繁鍏ユ祬鍑?span lang="EN-US">MFC銆嬩腑瑙i噴錛?span lang="EN-US"> 瀹氫箟綾?span lang="EN-US">CRect錛屽畾涔変袱涓璞?span lang="EN-US">rect1銆?span lang="EN-US">rect2錛屽悇鏈夎嚜宸辯殑m_color鎴愬憳鍙橀噺錛屼絾rect1.setcolor鍜?span lang="EN-US">rect2.setcolor鍗撮兘鏄氬線鍞竴鐨?span lang="EN-US">CRect::setcolor鎴愬憳鍑芥暟錛岄偅涔?span lang="EN-US">CRect::setcolor濡備綍澶勭悊涓嶅悓瀵硅薄鐨?span lang="EN-US">m_color錛熺瓟妗堟槸鐢變竴涓殣钘忓弬鏁幫紝鍚嶄負this鎸囬拡銆傚綋浣犺皟鐢細 rect1.setcolro(2); rect2.setcolor(3); 鏃訛紝緙栬瘧鍣ㄥ疄闄呬笂涓轟綘鍋氬嚭鏉ヤ竴涓嬬殑浠g爜錛?span lang="EN-US"> CRect::setcolor(2,(CRect*)&rect1); CRect::setcolor(3,(CRect*)&rect2); 澶氬嚭鏉ョ殑鍙傛暟錛屽氨鏄墍璋撶殑this鎸囬拡銆?span lang="EN-US"> class CRect { …… public: void setcolor(int color){m_color = color}; }; 琚紪璇戝悗錛屽叾瀹炰負錛?span lang="EN-US"> class CRect { …… public: void setcolor(int color,(CRect*)this){this->m_color = color}; };
浣滆咃細鎴愭檽鏃?br> 鏃墮棿錛?001騫?0鏈?1鏃?11:35:38-12:35:00)
鍐呭錛氬畬鎴愭彃鑺遍棶棰樼殑“鍔ㄦ佽鍒掓硶”綆楁硶鍙婃敞瑙?br>*/
#include "stdafx.h"
#include "string.h"
#define MAX(A,B) ((A) > (B) ? (A):(B))
//--------------------椴滆姳闂--------------------
#define F 100
#define V 100
/*
鎻掕姳闂鎻忚堪:
灝唂鏉熼矞鑺辨彃鍏涓姳鐡朵腑,浣胯揪鍒版渶寰嶇殑瑙嗚鏁堟灉,
闂鐩稿叧綰﹀畾鍙婃彃鑺辮姹?
椴滆姳琚紪鍙蜂負1--f,鑺辯摱琚紪鍙蜂負1--v,鑺辯摱鎸変粠灝忓埌
澶ч『搴忔帓鍒?涓鍙姳鐡跺彧鑳芥彃涓鏀姳,椴滆姳i鎻掑叆鑺辯摱j涓殑
瑙嗚鏁堟灉鏁堟灉鍊煎凡鐭?緙栧彿灝忕殑椴滆姳鎵鏀懼叆鐨勮姳鐡剁紪鍙蜂篃灝?nbsp;
闂姹傝В鎬濊礬:
鑺辯摱j(1<=j<=v)涓彃鍏ラ矞鑺辯殑鍙兘緙栧彿涓篬1..j](緙栧彿
灝忕殑椴滆姳鎵鏀懼叆鐨勮姳鐡剁紪鍙蜂篃灝?;
璁炬暟緇刾[i][j]琛ㄧず椴滆姳i鎻掑叆鑺辯摱j鐨勫ソ鐪嬬▼搴?鏁扮粍
q[i][j]琛ㄧず[1..i]鏉熼矞鑺辨彃鍏1..j]涓姳鐡舵墍鑳藉緱鍒扮殑鏈澶?br> 濂界湅紼嬪害,鍒濆鍖杚[0][0] = 0;q[0][j]=0(1<=j<=v),鍒檘[f][v]
鏄棶棰樼殑瑙?
鐗瑰埆鍦?j鏉熼矞鑺辨彃鍏ュ埌鍓嶉潰鐨刯鍙姳鐡朵腑,鎵寰楀埌鐨勫ソ鐪?br> 紼嬪害鏄痲[j][j] = p[1][1]+p[2][2]+...+[j][j].鐜板皢鎻掕姳榪?br> 紼嬫寜鑺辯摱鎺掑垪欏哄簭鍒掑垎鎴愪笉鍚岄樁孌?鍒欏湪絎琷闃舵,絎琲鏉熼矞鑺?br> 鑻ユ斁鍏ョj鍙瘋姳鐡?鏈澶уソ鐪嬬▼搴︽槸q[i-1][j-1]+p[i][j];絎琲鏉熼矞
鑺辮嫢鏀懼叆鍓峧-1涓姳鐡朵腑鐨勬煇涓涓?鎵寰楃殑濂界湅紼嬪害鏄痲[i][j-1],
閭d箞鍦ㄧj闃舵,鎻掑叆絎琲鏉熼矞鑺辨墍鑳藉緱鍒扮殑鏈澶уソ鐪嬬▼搴︿負:
q[i][j] = MAX(q[i-1][j-1]+p[i][j],q[i][j-1]),瑕佷嬌q[i][j]
鏈澶?搴斾嬌q[i-1][j-1]鍜宷[i][j-1]涔熸渶澶?br>*/
//鍒濆鍖栧嚱鏁?br>void Initialize(int *f,int *v,int p[][V])
{
int i,j;
printf("杈撳叆椴滆姳鏁伴噺鍙婅姳鐡朵釜鏁?");
scanf("%d%d",f,v);
printf("欏哄簭杈撳叆鍚勯矞鑺辨彃鍏ュ悇鑺辯摱鐨勫ソ鐪嬬▼搴?\n");
for(i=1;i<=*f;i++)
for(j=1;j<=*v;j++)
p[i][j] = i+j;
//scanf("%d",&p[i][j]);
}
//椴滆姳闂澶勭悊鍑芥暟
int Sove(int p[][V],int f,int v,int *way)
{
int i,j,newv,q[F][V];
q[0][0] = 0;
/*璁劇疆v涓姳鐡跺垎鍒鎻掑叆v鏉熼矞鑺辨椂鍚勫彿鑺辯摱瀵瑰簲鐨?鍒濆)鏈澶уソ鐪嬬▼搴?/
for(j=1;j<=v;j++)
{
q[0][j] = 0;
/*璁劇疆絎琷鏉熼矞鑺辨斁鍏ョj鍙瘋姳鐡朵腑鐨勬渶澶уソ鐪嬬▼搴?/
q[j][j] = q[j-1][j-1]+p[j][j];
}
for(j=1;j<=v;j++)
for(i=1;i<j;i++)
q[i][j] = MAX(q[i-1][j-1]+p[i][j],q[i][j-1]);
newv = v;
for(i=f;i>0;i--)
{
while(q[i-1][newv-1]+p[i][newv] < q[i][newv])
newv--;
//紜畾椴滆姳i鎻掑湪鑺辯摱newv涓?騫跺噯澶囪冭檻鍓嶄竴鍙姳鐡躲
way[i] = newv--;
}
return(q[f][v]);
}
//--------------------椴滆姳闂--------------------
//--------------------鏈闀垮瓙涓查棶棰?-------------------
#define N 100
char a[N],b[N],str[N];
//璁$畻涓や釜搴忓垪鏈闀垮叕鍏卞瓙搴忓垪鐨勯暱搴?br>int Get_LongSubStr_Len(char *a,char *b,int c[][N])
{
int m=strlen(a),n=strlen(b),//涓や釜搴忓垪鐨勯暱搴?br> i,j;//寰幆鍙橀噺
for(i=0;i<=m;i++) c[i][0] = 0;
for(i=1;i<=n;i++) c[0][i] = 0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i-1]==b[j-1])
c[i][j] = c[i-1][j-1]+1;
else
c[i][j] = MAX(c[i-1][j],c[i][j-1]);
/*
if(c[i-1][j]>=c[i][j-1])
c[i][j] = c[i-1][j];
else
c[i][j] = c[i][j-1];
*/
return(c[m][n]);
}
//鏋勯犳渶闀垮叕鍏卞瓙搴忓垪
char *Build_LongSubStr(char s[],char *a,char *b)
{
int i=strlen(a),j=strlen(b),
k,c[N][N];
k = Get_LongSubStr_Len(a,b,c);
s[k] = '\0';
while(k>0)
{
if(c[i][j]==c[i-1][j])
i--;
else
{
if(c[i][j]==c[i][j-1])
j--;
else
{
s[--k]=a[i-1];
i--;
j--;
}
}
}
return(s);
}
//--------------------鏈闀垮瓙涓查棶棰?-------------------
int main(int argc, char* argv[])
{
int i,f,v,p[F][V],way[F];
//-----------------------------------
/*
Initialize(&f,&v,p);
printf("鏈澶уソ鐪嬬▼搴︿負%d\n",Sove(p,f,v,way));
printf("鎻掓湁椴滆姳鐨勮姳鐡舵槸:\n");
for(i=1;i<=f;i++)
printf("%4d",way[i]);
*/
//-----------------------------------
printf("杈撳叆涓や釜瀛楃涓?闀垮害<%d):\n",N);
scanf("%s%s",a,b);
printf("涓や釜涓茬殑鏈闀垮叕鍏卞瓙搴忓垪鏄?%s\n",Build_LongSubStr(str,a,b));
//-----------------------------------
printf("\n\n搴旂敤紼嬪簭姝e湪榪愯......\n");
return 0;
}
]]>
]]>
銆銆鍜屾垚鍛樺嚱鏁版寚閽堜笉鍚岋紝浣犱笉闅懼彂鐜板鎵樼殑鐢ㄥ銆傛渶閲嶈鐨勶紝浣跨敤濮旀墭鍙互寰堝鏄撳湴瀹炵幇涓涓?Subject/Observer璁捐妯″紡鐨勬敼榪涚増[GoF, p. 293]銆侽bserver錛堣瀵熻咃級妯″紡鏄劇劧鍦℅UI涓湁寰堝鐨勫簲鐢紝浣嗘垜鍙戠幇瀹冨搴旂敤紼嬪簭鏍稿績鐨勮璁′篃鏈夊緢澶х殑浣滅敤銆傚鎵樹篃鍙敤鏉ュ疄鐜扮瓥鐣ワ紙Strategy錛塠GoF, p. 315]鍜岀姸鎬侊紙State錛塠GoF, p. 305]妯″紡銆?br>銆銆
銆銆鐜板湪錛屾垜鏉ヨ鏄庝竴涓簨瀹烇紝濮旀墭鍜屾垚鍛樺嚱鏁版寚閽堢浉姣斿茍涓嶄粎浠呮槸濂界敤錛岃屼笖姣旀垚鍛樺嚱鏁版寚閽堢畝鍗曞緱澶氾紒鏃㈢劧鎵鏈夌殑.NET璇█閮藉疄鐜頒簡濮旀墭錛屼綘鍙兘浼氱寽鎯沖姝ら珮灞傜殑姒傚康鍦ㄦ眹緙栦唬鐮佷腑騫朵笉濂藉疄鐜般備絾浜嬪疄騫朵笉鏄繖鏍鳳細濮旀墭鐨勫疄鐜扮‘瀹炴槸涓涓簳灞傜殑姒傚康錛岃屼笖灝卞儚鏅氱殑鍑芥暟璋冪敤涓鏍風畝鍗曪紙騫朵笖寰堥珮鏁堬級銆備竴涓狢++濮旀墭鍙渶瑕佸寘鍚竴涓猼his 鎸囬拡鍜屼竴涓畝鍗曠殑鍑芥暟鎸囬拡灝卞浜嗐傚綋浣犲緩绔嬩竴涓鎵樻椂錛屼綘鎻愪緵榪欎釜濮旀墭涓涓猼his鎸囬拡錛屽茍鍚戝畠鎸囨槑闇瑕佽皟鐢ㄥ摢涓涓嚱鏁般傜紪璇戝櫒鍙互鍦ㄥ緩绔嬪鎵樻椂璁$畻鍑鴻皟鏁磘his鎸囬拡闇瑕佺殑鍋忕Щ閲忋傝繖鏍峰湪浣跨敤濮旀墭鐨勬椂鍊欙紝緙栬瘧鍣ㄥ氨浠涔堜簨鎯呴兘涓嶇敤鍋氫簡銆傝繖涓鐐規洿濂界殑鏄紝緙栬瘧鍣ㄥ彲浠ュ湪緙栬瘧鏃跺氨鍙互瀹屾垚鍏ㄩ儴榪欎簺宸ヤ綔錛岃繖鏍風殑璇濓紝濮旀墭鐨勫鐞嗗緙栬瘧鍣ㄦ潵璇村彲浠ヨ鏄井涓嶈凍閬撶殑宸ヤ綔浜嗐傚湪x86緋葷粺涓嬪皢濮旀墭澶勭悊鎴愮殑姹囩紪浠g爜灝卞簲璇ユ槸榪欎箞綆鍗曪細
銆銆
銆銆mov ecx, [this]
銆銆
銆銆call [pfunc]
銆銆
銆銆浣嗘槸錛屽湪鏍囧噯C++涓嵈涓嶈兘鐢熸垚濡傛楂樻晥鐨勪唬鐮併?Borland涓轟簡瑙e喅濮旀墭鐨勯棶棰樺湪瀹冪殑C++緙栬瘧鍣ㄤ腑鍔犲叆浜嗕竴涓柊鐨勫叧閿瓧錛坃_closure錛?鐢ㄦ潵閫氳繃綆媧佺殑璇硶鐢熸垚浼樺寲鐨勪唬鐮併侴NU緙栬瘧鍣ㄤ篃瀵硅璦榪涜浜嗘墿灞曪紝浣嗗拰Borland鐨勭紪璇戝櫒涓嶅吋瀹廣傚鏋滀綘浣跨敤浜嗚繖涓ょ璇█鎵╁睍涓殑涓縐嶏紝浣犲氨浼氶檺鍒惰嚜宸卞彧浣跨敤涓涓巶瀹剁殑緙栬瘧鍣ㄣ傝屽鏋滀綘浠嶇劧閬靛驚鏍囧噯C++鐨勮鍒欙紝浣犱粛鐒跺彲浠ュ疄鐜板鎵橈紝浣嗗疄鐜扮殑濮旀墭灝變笉浼氭槸閭d箞楂樻晥浜嗐?br>銆銆
銆銆鏈夎叮鐨勬槸錛屽湪C#鍜屽叾浠?NET璇█涓紝鎵ц涓涓鎵樼殑鏃墮棿瑕佹瘮涓涓嚱鏁拌皟鐢ㄦ參8鍊嶏紙鍙傝http://msdn.microsoft.com/library/en- us/dndotnet/html/fastmanagedcode.asp錛夈傛垜鐚滄祴榪欏彲鑳芥槸鍨冨溇鏀墮泦鍜?NET瀹夊叏媯鏌ョ殑闇瑕併傛渶榪戯紝寰蔣灝?#8220;緇熶竴浜嬩歡妯″瀷錛坲nified event model錛?#8221;鍔犲叆鍒癡isual C++涓紝闅忕潃榪欎釜妯″瀷鐨勫姞鍏ワ紝澧炲姞浜哶_event銆?__raise銆乢_hook銆乢_unhook銆乪vent_source鍜宔vent_receiver絳変竴浜涘叧閿瓧銆傚潶鐧藉湴璇達紝鎴戝鍔犲叆鐨勮繖浜涚壒鎬у緢鍙嶆劅錛屽洜涓鴻繖鏄畬鍏ㄤ笉絎﹀悎鏍囧噯鐨勶紝榪欎簺璇硶鏄笐闄嬬殑錛屽洜涓哄畠浠嬌榪欑C++涓嶅儚C++錛屽茍涓斾細鐢熸垚涓鍫嗘墽琛屾晥鐜囨瀬浣庣殑浠g爜銆?br>銆銆
銆銆瑙e喅榪欎釜闂鐨勬帹鍔ㄥ姏錛氬楂樻晥濮旀墭錛坒ast delegate錛夌殑榪垏闇姹?br>銆銆
銆銆浣跨敤鏍囧噯C++瀹炵幇濮旀墭鏈変竴涓繃搴﹁噧鑲跨殑鐥囩姸銆傚ぇ澶氭暟鐨勫疄鐜版柟娉曚嬌鐢ㄧ殑鏄悓涓縐嶆濊礬銆傝繖浜涙柟娉曠殑鍩烘湰瑙傜偣鏄皢鎴愬憳鍑芥暟鎸囬拡鐪嬫垚濮旀墭錕斤拷浣嗚繖鏍風殑鎸囬拡鍙兘琚竴涓崟鐙殑綾諱嬌鐢ㄣ備負浜嗛伩鍏嶈繖縐嶅眬闄愶紝浣犻渶瑕侀棿鎺ュ湴浣跨敤鍙︿竴縐嶆濊礬錛氫綘鍙互浣跨敤妯$増涓烘瘡涓涓被寤虹珛涓涓?#8220;鎴愬憳鍑芥暟璋冪敤鍣紙member function invoker錛?#8221;銆傚鎵樺寘鍚簡this鎸囬拡鍜屼竴涓寚鍚戣皟鐢ㄥ櫒錛坕nvoker錛夌殑鎸囬拡錛屽茍涓旈渶瑕佸湪鍫嗕笂涓烘垚鍛樺嚱鏁拌皟鐢ㄥ櫒鍒嗛厤絀洪棿銆?br>銆銆
銆銆瀵逛簬榪欑鏂規宸茬粡鏈夊緢澶氱瀹炵幇錛屽寘鎷湪CodeProject涓婄殑瀹炵幇鏂規銆傚悇縐嶅疄鐜板湪澶嶆潅鎬т笂銆佽娉曪紙姣斿錛屾湁鐨勫拰C#鐨勮娉曞緢鎺ヨ繎錛変笂銆佷竴鑸т笂鏈夋墍涓嶅悓銆傛渶鍏鋒潈濞佺殑涓涓疄鐜版槸boost::function銆傛渶榪戯紝瀹冨凡緇忚閲囩敤浣滀負涓嬩竴涓彂甯冪殑C++鏍囧噯鐗堟湰涓殑涓閮ㄥ垎[Sutter1]銆傚笇鏈涘畠鑳藉琚箍娉涘湴浣跨敤銆?br>銆銆
銆銆灝卞儚浼犵粺鐨勫鎵樺疄鐜版柟娉曚竴鏍鳳紝鎴戝悓鏍峰彂瑙夎繖縐嶆柟娉曞茍涓嶅崄鍒嗗彟浜烘弧鎰忋傝櫧鐒跺畠鎻愪緵浜嗗ぇ瀹舵墍鏈熸湜鐨勫姛鑳斤紝浣嗘槸浼氭販娣嗕竴涓綔鍦ㄧ殑闂錛氫漢浠己涔忓涓涓璦鐨勫簳灞傜殑鏋勯犮?“鎴愬憳鍑芥暟璋冪敤鍣?#8221;鐨勪唬鐮佸鍑犱箮鎵鏈夌殑綾婚兘鏄竴鏍風殑錛屽湪鎵鏈夊鉤鍙頒笂閮藉嚭鐜拌繖縐嶆儏鍐墊槸浠や漢娌撫鐨勩傛瘯绔燂紝鍫嗚鐢ㄤ笂浜嗐備絾鍦ㄤ竴浜涘簲鐢ㄥ満鍚堜笅錛岃繖縐嶆柊鐨勬柟娉曚粛鐒舵棤娉曡鎺ュ彈銆?br>銆銆
銆銆鎴戝仛鐨勪竴涓」鐩槸紱繪暎浜嬩歡妯℃嫙鍣紝瀹冪殑鏍稿績鏄竴涓簨浠惰皟搴︾▼搴忥紝鐢ㄦ潵璋冪敤琚ā鎷熺殑瀵硅薄鐨勬垚鍛樺嚱鏁般傚ぇ澶氭暟鎴愬憳鍑芥暟闈炲父綆鍗曪細瀹冧滑鍙敼鍙樺璞$殑鍐呴儴鐘舵侊紝鏈夋椂鍦ㄤ簨浠墮槦鍒楋紙event queue錛変腑娣誨姞灝嗘潵瑕佸彂鐢熺殑浜嬩歡錛屽湪榪欑鎯呭喌涓嬫渶閫傚悎浣跨敤濮旀墭銆備絾鏄紝姣忎竴涓鎵樺彧琚皟鐢紙invoked錛変竴嬈°備竴寮濮嬶紝鎴戜嬌鐢ㄤ簡boost:: function錛屼絾鎴戝彂鐜扮▼搴忚繍琛屾椂錛岀粰濮旀墭鎵鍒嗛厤鐨勫唴瀛樼┖闂村崰鐢ㄤ簡鏁翠釜紼嬪簭絀洪棿鐨勪笁鍒嗕箣涓榪樿澶氾紒“鎴戣鐪熸鐨勫鎵橈紒”鎴戝湪鍐呭績鍛煎枈鐫錛?#8220;鐪熸鐨勫鎵樺彧闇瑕佷粎浠呬袱琛屾眹緙栨寚浠ゅ晩錛?#8221;
銆銆
銆銆鎴戝茍涓嶈兘鎬繪槸鑳藉寰楀埌鎴戞兂瑕佺殑錛屼絾鍚庢潵鎴戝緢騫歌繍銆傛垜鍦ㄨ繖鍎垮睍紺虹殑浠g爜錛堜唬鐮佷笅杞介摼鎺ヨ璇戣呮敞錛夊嚑涔庡湪鎵鏈夌紪璇戠幆澧冧腑閮戒駭鐢熶簡浼樺寲鐨勬眹緙栦唬鐮併傛渶閲嶈鐨勬槸錛岃皟鐢ㄤ竴涓惈鏈夊崟涓洰鏍囩殑濮旀墭錛坰ingle-target delegate錛夌殑閫熷害鍑犱箮鍚岃皟鐢ㄤ竴涓櫘閫氬嚱鏁頒竴鏍峰揩銆傚疄鐜拌繖鏍風殑浠g爜騫舵病鏈夌敤鍒頒粈涔堥珮娣辯殑涓滆タ錛屽敮涓鐨勯仐鎲懼氨鏄紝涓轟簡瀹炵幇鐩爣錛屾垜鐨勪唬鐮佸拰鏍囧噯C++ 鐨勮鍒欐湁浜涘亸紱匯傛垜浣跨敤浜嗕竴浜涙湁鍏蟲垚鍛樺嚱鏁版寚閽堢殑鏈叕寮鐭ヨ瘑鎵嶄嬌瀹冭兘澶熻繖鏍峰伐浣溿傚鏋滀綘寰堢粏蹇冿紝鑰屼笖涓嶅湪鎰忓湪灝戞暟鎯呭喌涓嬬殑涓浜涚紪璇戝櫒鐩稿叧錛坈ompiler-specific錛夌殑浠g爜錛岄偅涔堥珮鎬ц兘鐨勫鎵樻満鍒跺湪浠諱綍C++緙栬瘧鍣ㄤ笅閮芥槸鍙鐨勩?br>銆銆
銆銆璇紿嶏細灝嗕換浣曠被鍨嬬殑鎴愬憳鍑芥暟鎸囬拡杞寲涓轟竴涓爣鍑嗙殑褰㈠紡
銆銆
銆銆鎴戠殑浠g爜鐨勬牳蹇冩槸涓涓兘澶熷皢浠諱綍綾葷殑鎸囬拡鍜屼換浣曟垚鍛樺嚱鏁版寚閽堝垎鍒漿鎹負涓涓氱敤綾葷殑鎸囬拡鍜屼竴涓氱敤鎴愬憳鍑芥暟鐨勬寚閽堢殑綾匯傜敱浜嶤++娌℃湁“閫氱敤鎴愬憳鍑芥暟錛坓eneic member function錛?#8221;鐨勭被鍨嬶紝鎵浠ユ垜鎶婃墍鏈夌被鍨嬬殑鎴愬憳鍑芥暟閮借漿鍖栦負涓涓湪浠g爜涓湭瀹氫箟鐨凜GenericClass綾葷殑鎴愬憳鍑芥暟銆?br>銆銆
銆銆澶у鏁扮紪璇戝櫒瀵規墍鏈夌殑鎴愬憳鍑芥暟鎸囬拡騫崇瓑鍦板寰咃紝涓嶇浠栦滑灞炰簬鍝釜綾匯傛墍浠ュ榪欎簺緙栬瘧鍣ㄦ潵璇達紝鍙互浣跨敤reinterpret_cast灝嗕竴涓壒瀹氱殑鎴愬憳鍑芥暟鎸囬拡杞寲涓轟竴涓氱敤鎴愬憳鍑芥暟鎸囬拡銆備簨瀹炰笂錛屽亣濡傜紪璇戝櫒涓嶅彲浠ワ紝閭d箞榪欎釜緙栬瘧鍣ㄦ槸涓嶇鍚堟爣鍑嗙殑銆傚浜庝竴浜涙帴榪戞爣鍑嗭紙almost-compliant錛夌殑緙栬瘧鍣紝姣斿Digital Mars錛屾垚鍛樺嚱鏁版寚閽堢殑reinterpret_cast杞崲涓鑸細娑夊強鍒頒竴浜涢澶栫殑鐗規畩浠g爜錛屽綋榪涜杞寲鐨勬垚鍛樺嚱鏁扮殑綾諱箣闂存病鏈変換浣曞叧鑱旀椂錛岀紪璇戝櫒浼氬嚭閿欍傚榪欎簺緙栬瘧鍣紝鎴戜滑浣跨敤涓涓悕涓篽orrible_cast鐨勫唴鑱斿嚱鏁幫紙鍦ㄥ嚱鏁頒腑浣跨敤浜嗕竴涓猽nion鏉ラ伩鍏岰++鐨勭被鍨嬫鏌ワ級銆備嬌鐢ㄨ繖縐嶆柟娉曠湅鏉ユ槸涓嶅彲閬垮厤鐨勶拷錕絙oost::function涔熺敤鍒頒簡榪欑鏂規硶銆?br>銆銆
銆銆瀵逛簬鍏朵粬鐨勪竴浜涚紪璇戝櫒錛堝Visual C++, Intel C++鍜孊orland C++錛夛紝鎴戜滑蹇呴』灝嗗閲嶏紙multiple-錛夌戶鎵垮拰铏氭嫙錛坴irtual-錛夌戶鎵跨被鐨勬垚鍛樺嚱鏁版寚閽堣漿鍖栦負鍗曚竴錛坰ingle-錛夌戶鎵跨被鐨勫嚱鏁版寚閽堛備負浜嗗疄鐜拌繖涓洰鐨勶紝鎴戝閥濡欏湴浣跨敤浜嗘ā鏉垮茍鍒╃敤浜嗕竴涓濡欑殑鎴忔硶銆傛敞鎰忥紝榪欎釜鎴忔硶鐨勪嬌鐢ㄦ槸鍥犱負榪欎簺緙栬瘧鍣ㄥ茍涓嶆槸瀹屽叏絎﹀悎鏍囧噯鐨勶紝浣嗘槸浣跨敤榪欎釜鎴忔硶寰楀埌浜嗗洖鎶ワ細瀹冧嬌榪欎簺緙栬瘧鍣ㄤ駭鐢熶簡浼樺寲鐨勪唬鐮併?br>銆銆
銆銆鏃㈢劧鎴戜滑鐭ラ亾緙栬瘧鍣ㄦ槸鎬庢牱鍦ㄥ唴閮ㄥ瓨鍌ㄦ垚鍛樺嚱鏁版寚閽堢殑錛屽茍涓旀垜浠煡閬撳湪闂涓簲璇ユ庢牱涓烘垚鍛樺嚱鏁版寚閽堣皟鏁磘his鎸囬拡錛屾垜浠殑浠g爜鍦ㄨ緗鎵樻椂鍙互鑷繁璋冩暣this鎸囬拡銆傚鍗曚竴緇ф壙綾葷殑鍑芥暟鎸囬拡錛屽垯涓嶉渶瑕佽繘琛岃皟鏁達紱瀵瑰閲嶇戶鎵匡紝鍒欏彧闇瑕佷竴嬈″姞娉曞氨鍙畬鎴愯皟鏁達紱瀵硅櫄鎷熺戶鎵?..灝辨湁浜涢夯鐑︿簡銆備絾鏄繖鏍峰仛鏄鐢ㄧ殑錛屽茍涓斿湪澶у鏁版儏鍐典笅錛屾墍鏈夌殑宸ヤ綔閮藉湪緙栬瘧鏃跺畬鎴愶紒
銆銆
銆銆榪欐槸鏈鍚庝竴涓瘈紿嶃傛垜浠庢牱鍖哄垎涓嶅悓鐨勭戶鎵跨被鍨嬶紵騫舵病鏈夊畼鏂圭殑鏂規硶鏉ヨ鎴戜滑鍖哄垎涓涓被鏄閲嶇戶鎵跨殑榪樻槸鍏朵粬綾誨瀷鐨勭戶鎵褲備絾鏄湁涓縐嶅閥濡欑殑鏂規硶錛屼綘鍙互鏌ョ湅鎴戝湪鍓嶉潰緇欏嚭浜嗕竴涓垪琛紙瑙佷腑綃囷級鈥斺斿MSVC錛屾瘡縐嶇戶鎵挎柟寮忎駭鐢熺殑鎴愬憳鍑芥暟鎸囬拡鐨勫ぇ灝忔槸涓嶅悓鐨勩傛墍浠ワ紝鎴戜滑鍙互鍩轟簬鎴愬憳鍑芥暟鎸囬拡鐨勫ぇ灝忎嬌鐢ㄦā鐗堬紒姣斿瀵瑰閲嶇戶鎵跨被鍨嬫潵璇達紝榪欏彧鏄釜綆鍗曠殑璁$畻銆傝屽湪紜畾unknown_inheritance錛?6瀛楄妭錛夌被鍨嬬殑鏃跺欙紝涔熶細閲囩敤綾諱技鐨勮綆楁柟娉曘?br>銆銆
銆銆瀵逛簬寰蔣鍜岃嫳鐗瑰皵鐨勭紪璇戝櫒涓噰鐢ㄤ笉鏍囧噯12瀛楄妭鐨勮櫄鎷熺戶鎵跨被鍨嬬殑鎸囬拡鐨勬儏鍐碉紝鎴戝紩鍙戜簡涓涓紪璇戞椂閿欒錛坈ompile-time error錛夛紝鍥犱負闇瑕佷竴涓壒瀹氱殑榪愯鐜錛坵orkaround錛夈傚鏋滀綘鍦∕SVC涓嬌鐢ㄨ櫄鎷熺戶鎵匡紝瑕佸湪澹版槑綾諱箣鍓嶄嬌鐢?FASTDELEGATEDECLARE瀹忋傝岃繖涓被蹇呴』浣跨敤unknown_inheritance錛堟湭鐭ョ戶鎵跨被鍨嬶級鎸囬拡錛堣繖鐩稿綋浜庝竴涓亣瀹氱殑 __unknown_inheritance鍏抽敭瀛楋級銆備緥濡傦細
銆銆
銆銆
銆銆class CDerivedClass : virtual public CBaseClass1, virtual public CBaseClass2 {
銆銆
銆銆// : (etc)
銆銆
銆銆};
銆銆
銆銆榪欎釜瀹忓拰涓浜涘父鏁扮殑澹版槑鏄湪涓涓殣钘忕殑鍛藉悕絀洪棿涓疄鐜扮殑錛岃繖鏍峰湪鍏朵粬緙栬瘧鍣ㄤ腑浣跨敤鏃朵篃鏄畨鍏ㄧ殑銆侻SVC錛?.0鎴栨洿鏂扮増鏈級鐨勫彟涓縐嶆柟娉曟槸鍦ㄥ伐紼嬩腑浣跨敤/vmg緙栬瘧鍣ㄩ夐」銆傝孖nter鐨勭紪璇戝櫒瀵?vmg緙栬瘧鍣ㄩ夐」涓嶈搗浣滅敤錛屾墍浠ヤ綘蹇呴』鍦ㄨ櫄鎷熺戶鎵跨被涓嬌鐢ㄥ畯銆傛垜鐨勮繖涓唬鐮佹槸鍥犱負緙栬瘧鍣ㄧ殑bug鎵嶅彲浠ユ紜繍琛岋紝浣犲彲浠ユ煡鐪嬩唬鐮佹潵浜嗚В鏇村緇嗚妭銆傝屽湪閬典粠鏍囧噯鐨勭紪璇戝櫒涓笉闇瑕佹敞鎰忚繖涔堝錛屽喌涓斿湪浠諱綍鎯呭喌涓嬮兘涓嶄細濡ㄧFASTDELEGATEDECLARE瀹忕殑浣跨敤銆?br>銆銆
銆銆涓鏃︿綘灝嗙被鐨勫璞℃寚閽堝拰鎴愬憳鍑芥暟鎸囬拡杞寲涓烘爣鍑嗗艦寮忥紝瀹炵幇鍗曚竴鐩爣鐨勫鎵橈紙single-target delegate錛夊氨姣旇緝瀹規槗浜嗭紙铏界劧鍋氳搗鏉ユ劅瑙夊啑闀夸箯鍛籌級銆備綘鍙涓烘瘡涓縐嶅叿鏈変笉鍚屽弬鏁扮殑鍑芥暟鍒朵綔鐩稿簲鐨勬ā鏉跨被灝辮浜嗐傚疄鐜板叾浠栫被鍨嬬殑濮旀墭鐨勪唬鐮佷篃澶ч兘涓庢鐩鎬技錛屽彧鏄鍙傛暟紼嶅仛淇敼緗簡銆?br>銆銆
銆銆榪欑鐢ㄩ潪鏍囧噯鏂瑰紡杞崲瀹炵幇鐨勫鎵樿繕鏈変竴涓ソ澶勶紝灝辨槸濮旀墭瀵硅薄涔嬮棿鍙互鐢ㄧ瓑寮忔瘮杈冦傜洰鍓嶅疄鐜扮殑澶у鏁板鎵樻棤娉曞仛鍒拌繖涓鐐癸紝榪欎嬌榪欎簺濮旀墭涓嶈兘鑳滀換涓浜涚壒瀹氱殑浠誨姟錛屾瘮濡傚疄鐜板鎾鎵橈紙multi-cast delegates錛?[Sutter3]銆?br>銆銆
銆銆闈欐佸嚱鏁頒綔涓哄鎵樼洰鏍囷紙delegate target錛?br>銆銆
銆銆鐞嗚涓婏紝涓涓畝鍗曠殑闈炴垚鍛樺嚱鏁幫紙non-member function錛夛紝鎴栬呬竴涓潤鎬佹垚鍛樺嚱鏁幫紙static member function錛夊彲浠ヨ浣滀負濮旀墭鐩爣錛坉elegate target錛夈傝繖鍙互閫氳繃灝嗛潤鎬佸嚱鏁拌漿鎹負涓涓垚鍛樺嚱鏁版潵瀹炵幇銆傛垜鏈変袱縐嶆柟娉曞疄鐜拌繖涓鐐癸紝涓ょ鏂規硶閮芥槸閫氳繃浣垮鎵樻寚鍚戣皟鐢ㄨ繖涓潤鎬佸嚱鏁扮殑“璋冪敤鍣紙invoker錛?#8221;鐨勬垚鍛樺嚱鏁扮殑鏂規硶鏉ュ疄鐜扮殑銆?br>
]]>
寮曞瓙
鏍囧噯C++涓病鏈夌湡姝g殑闈㈠悜瀵硅薄鐨勫嚱鏁版寚閽堛傝繖涓鐐瑰C++鏉ヨ鏄笉騫哥殑錛屽洜涓洪潰鍚戝璞$殑鎸囬拡錛堜篃鍙仛“闂寘錛坈losure錛?#8221;鎴?#8220;濮旀墭錛坉elegate錛?#8221;錛夊湪涓浜涜璦涓凡緇忚瘉鏄庝簡瀹冨疂璐電殑浠峰箋傚湪Delphi (Object Pascal)涓紝闈㈠悜瀵硅薄鐨勫嚱鏁版寚閽堟槸Borland鍙鍖栫粍寤哄簱錛圴CL錛孷isual Component Library錛夌殑鍩虹銆傝屽湪鐩墠錛孋#浣?#8220;濮旀墭”鐨勬蹇墊棩瓚嬫祦琛岋紝榪欎篃姝f樉紺哄嚭C#榪欑璇█鐨勬垚鍔熴傚湪寰堝搴旂敤紼嬪簭涓紝“濮旀墭”綆鍖栦簡鏉捐﹀悎瀵硅薄鐨勮璁℃ā寮廩GoF]銆傝繖縐嶇壒鎬ф棤鐤戝湪鏍囧噯C++涓篃浼氫駭鐢熷緢澶х殑浣滅敤銆?br>
寰堥仐鎲撅紝C++涓病鏈?#8220;濮旀墭”錛屽畠鍙彁渚涗簡鎴愬憳鍑芥暟鎸囬拡錛坢ember function pointers錛夈傚緢澶氱▼搴忓憳浠庢病鏈夌敤榪囧嚱鏁版寚閽堬紝榪欐槸鏈夌壒瀹氱殑鍘熷洜鐨勩傚洜涓哄嚱鏁版寚閽堣嚜韜湁寰堝濂囨殑璇硶瑙勫垯錛堟瘮濡?#8220;->*”鍜?#8220;.*”鎿嶄綔絎︼級錛岃屼笖寰堥毦鎵懼埌瀹冧滑鐨勫噯紜惈涔夛紝騫朵笖浣犱細鎵懼埌鏇村ソ鐨勫姙娉曚互閬垮厤浣跨敤鍑芥暟鎸囬拡銆傛洿鍏鋒湁璁藉埡鎰忓懗鐨勬槸錛氫簨瀹炰笂錛岀紪璇戝櫒鐨勭紪鍐欒呭鏋滃疄鐜?#8220;濮旀墭”鐨勮瘽浼氭瘮浠栬垂鍔插湴瀹炵幇鎴愬憳鍑芥暟鎸囬拡瑕佸鏄撳湴澶氾紒
鍦ㄨ繖綃囨枃绔犱腑錛屾垜瑕佹彮寮鎴愬憳鍑芥暟鎸囬拡閭?#8220;紲炵鐨勭洊瀛?#8221;銆傚湪鎵艱鍦伴噸榪版垚鍛樺嚱鏁版寚閽堢殑璇硶鍜岀壒鎬т箣鍚庯紝鎴戜細鍚戣鑰呰В閲婃垚鍛樺嚱鏁版寚閽堝湪涓浜涘父鐢ㄧ殑緙栬瘧鍣ㄤ腑鏄庢牱瀹炵幇鐨勶紝鐒跺悗鎴戜細鍚戝ぇ瀹跺睍紺虹紪璇戝櫒鎬庢牱鏈夋晥鍦板疄鐜?#8220;濮旀墭”銆傛渶鍚庢垜浼氬埄鐢ㄨ繖浜涚簿娣辯殑鐭ヨ瘑鍚戜綘灞曠ず鍦–++緙栬瘧鍣ㄤ笂瀹炵幇浼樺寲鑰屽彲闈犵殑“濮旀墭”鐨勬妧鏈傛瘮濡傦紝鍦╒isual C++(6.0, .NET, and .NET 2003)涓鍗曚竴鐩爣濮旀墭錛坰ingle-target delegate錛夌殑璋冪敤錛岀紪璇戝櫒浠呬粎鐢熸垚涓よ姹囩紪浠g爜錛?br>
鍑芥暟鎸囬拡
涓嬮潰鎴戜滑澶嶄範涓涓嬪嚱鏁版寚閽堛傚湪C鍜孋++璇█涓紝涓涓懡鍚嶄負my_func_ptr鐨勫嚱鏁版寚閽堟寚鍚戜竴涓互涓涓猧nt鍜屼竴涓猚har*涓哄弬鏁扮殑鍑芥暟錛岃繖涓嚱鏁拌繑鍥炰竴涓誕鐐瑰鹼紝澹版槑濡備笅錛?br>
//涓轟簡渚夸簬鐞嗚В錛屾垜寮虹儓鎺ㄨ崘浣犱嬌鐢╰ypedef鍏抽敭瀛椼?br>
//濡傛灉涓嶈繖鏍風殑璇濓紝褰撳嚱鏁版寚閽堜綔涓轟竴涓嚱鏁扮殑鍙傛暟浼犻掔殑鏃跺欙紝
// 紼嬪簭浼氬彉寰楁櫐娑╅毦鎳傘?br>
// 榪欐牱鐨勮瘽錛屽0鏄庡簲濡備笅鎵紺猴細
MyFuncPtrType my_func_ptr;
搴旀敞鎰忥紝瀵規瘡涓涓嚱鏁扮殑鍙傛暟緇勫悎錛屽嚱鏁版寚閽堢殑綾誨瀷搴旇鏄笉鍚岀殑銆傚湪Microsoft Visual C++錛堜互涓嬬ОMSVC錛変腑錛屽涓夌涓嶅悓鐨勮皟鐢ㄦ柟寮忔湁涓嶅悓鐨勭被鍨嬶細__cdecl, __stdcall, 鍜宊_fastcall銆傚鏋滀綘鐨勫嚱鏁版寚閽堟寚鍚戜竴涓瀷濡俧loat some_func(int, char *)鐨勫嚱鏁幫紝榪欐牱鍋氬氨鍙互浜嗭細
//褰撲綘鎯寵皟鐢ㄥ畠鎵鎸囧悜鐨勫嚱鏁版椂錛屼綘鍙互榪欐牱鍐欙細
(*my_func_ptr)(7, "Arbitrary String");
浣犲彲浠ュ皢涓縐嶇被鍨嬬殑鍑芥暟鎸囬拡杞崲鎴愬彟涓縐嶅嚱鏁版寚閽堢被鍨嬶紝浣嗕綘涓嶅彲浠ュ皢涓涓嚱鏁版寚閽堟寚鍚戜竴涓獀oid *鍨嬬殑鏁版嵁鎸囬拡銆傚叾浠栫殑杞崲鎿嶄綔灝變笉鐢ㄨ鍙欎簡銆備竴涓嚱鏁版寚閽堝彲浠ヨ璁劇疆涓?鏉ヨ〃鏄庡畠鏄竴涓┖鎸囬拡銆傛墍鏈夌殑姣旇緝榪愮畻絎︼紙==, !=, <, >, <=, >=錛夐兘鍙互浣跨敤錛屽彲浠ヤ嬌鐢?#8220;==0”鎴栭氳繃涓涓樉寮忕殑甯冨皵杞崲鏉ユ祴璇曟寚閽堟槸鍚︿負絀猴紙null錛夈?br>
鍦–璇█涓紝鍑芥暟鎸囬拡閫氬父鐢ㄦ潵鍍弎sort涓鏍峰皢鍑芥暟浣滀負鍙傛暟錛屾垨鑰呬綔涓篧indows緋葷粺鍑芥暟鐨勫洖璋冨嚱鏁扮瓑絳夈傚嚱鏁版寚閽堣繕鏈夊緢澶氬叾浠栫殑搴旂敤銆傚嚱鏁版寚閽堢殑瀹炵幇寰堢畝鍗曪細瀹冧滑鍙槸“浠g爜鎸囬拡錛坈ode pointer錛?#8221;錛屽畠浠綋鐜板湪姹囩紪璇█涓槸鐢ㄦ潵淇濆瓨瀛愮▼搴忎唬鐮佺殑棣栧湴鍧銆傝岃繖縐嶅嚱鏁版寚閽堢殑瀛樺湪鍙槸涓轟簡淇濊瘉浣跨敤浜嗘紜殑璋冪敤瑙勮寖銆?br>
鎴愬憳鍑芥暟鎸囬拡
鍦–++紼嬪簭涓紝寰堝鍑芥暟鏄垚鍛樺嚱鏁幫紝鍗寵繖浜涘嚱鏁版槸鏌愪釜綾諱腑鐨勪竴閮ㄥ垎銆備綘涓嶅彲浠ュ儚涓涓櫘閫氱殑鍑芥暟鎸囬拡閭f牱鎸囧悜涓涓垚鍛樺嚱鏁幫紝姝g‘鐨勫仛娉曞簲璇ユ槸錛屼綘蹇呴』浣跨敤涓涓垚鍛樺嚱鏁版寚閽堛備竴涓垚鍛樺嚱鏁扮殑鎸囬拡鎸囧悜綾諱腑鐨勪竴涓垚鍛樺嚱鏁幫紝騫跺拰浠ュ墠鏈夌浉鍚岀殑鍙傛暟錛屽0鏄庡涓嬶細
//瀵逛簬浣跨敤const鍏抽敭瀛椾慨楗扮殑鎴愬憳鍑芥暟錛屽0鏄庡涓嬶細
float (SomeClass::*my_const_memfunc_ptr)(int, char *) const;
娉ㄦ剰浣跨敤浜嗙壒孌婄殑榪愮畻絎︼紙::*錛夛紝鑰?#8220;SomeClass”鏄0鏄庝腑鐨勪竴閮ㄥ垎銆傛垚鍛樺嚱鏁版寚閽堟湁涓涓彲鎬曠殑闄愬埗錛氬畠浠彧鑳芥寚鍚戜竴涓壒瀹氱殑綾諱腑鐨勬垚鍛樺嚱鏁般傚姣忎竴縐嶅弬鏁扮殑緇勫悎錛岄渶瑕佹湁涓嶅悓鐨勬垚鍛樺嚱鏁版寚閽堢被鍨嬶紝鑰屼笖瀵規瘡縐嶄嬌鐢╟onst淇グ鐨勫嚱鏁板拰涓嶅悓綾諱腑鐨勫嚱鏁幫紝涔熻鏈変笉鍚岀殑鍑芥暟鎸囬拡綾誨瀷銆傚湪MSVC涓紝瀵逛笅闈㈣繖鍥涚璋冪敤鏂瑰紡閮芥湁涓縐嶄笉鍚岀殑璋冪敤綾誨瀷錛歘_cdecl, __stdcall, __fastcall, 鍜?__thiscall銆傦紙__thiscall鏄己鐪佺殑鏂瑰紡錛屾湁瓚g殑鏄紝鍦ㄤ換浣曞畼鏂規枃妗d腑浠庢病鏈夊__thiscall鍏抽敭瀛楃殑璇︾粏鎻忚堪錛屼絾鏄畠緇忓父鍦ㄩ敊璇俊鎭腑鍑虹幇銆傚鏋滀綘鏄懼紡鍦頒嬌鐢ㄥ畠錛屼綘浼氱湅鍒?#8220;瀹冭淇濈暀浣滀負浠ュ悗浣跨敤錛坕t is reserved for future use錛?#8221;鐨勯敊璇彁紺恒傦級濡傛灉浣犱嬌鐢ㄤ簡鎴愬憳鍑芥暟鎸囬拡錛屼綘鏈濂戒嬌鐢╰ypedef浠ラ槻姝㈡販娣嗐?br>
灝嗗嚱鏁版寚閽堟寚鍚戝瀷濡俧loat SomeClass::some_member_func(int, char *)鐨勫嚱鏁幫紝浣犲彲浠ヨ繖鏍峰啓錛?br>
寰堝緙栬瘧鍣紙姣斿MSVC錛変細璁╀綘鍘繪帀“&”錛岃屽叾浠栦竴浜涚紪璇戝櫒錛堟瘮濡侴NU G++錛夊垯闇瑕佹坊鍔?#8220;&”錛屾墍浠ュ湪鎵嬪啓紼嬪簭鐨勬椂鍊欐垜寤鴻鎶婂畠娣諱笂銆傝嫢瑕佽皟鐢ㄦ垚鍛樺嚱鏁版寚閽堬紝浣犻渶瑕佸厛寤虹珛SomeClass鐨勪竴涓疄渚嬶紝騫朵嬌鐢ㄧ壒孌婃搷浣滅“->*”錛岃繖涓搷浣滅鐨勪紭鍏堢駭杈冧綆錛屼綘闇瑕佸皢鍏墮傚綋鍦版斁鍏ュ渾鎷彿鍐呫?br>
(x->*my_memfunc_ptr)(6, "Another Arbitrary Parameter");
//濡傛灉綾誨湪鏍堜笂錛屼綘涔熷彲浠ヤ嬌鐢?#8220;.*”榪愮畻絎︺?/span>
SomeClass y;
(y.*my_memfunc_ptr)(15, "Different parameters this time");
涓嶈鎬垜浣跨敤濡傛濂囨殑璇硶鈥斺旂湅璧鋒潵C++鐨勮璁¤呭鏍囩偣絎﹀彿鏈夌潃鐢辮》鐨勬劅鎯咃紒C++鐩稿浜嶤澧炲姞浜嗕笁縐嶇壒孌婅繍綆楃鏉ユ敮鎸佹垚鍛樻寚閽堛?#8220;::*”鐢ㄤ簬鎸囬拡鐨勫0鏄庯紝鑰?#8220;->*”鍜?#8220;.*”鐢ㄦ潵璋冪敤鎸囬拡鎸囧悜鐨勫嚱鏁般傝繖鏍風湅璧鋒潵瀵逛竴涓璦妯$硦鑰屽張寰堝皯浣跨敤鐨勯儴鍒嗙殑榪囧垎鍏蟲敞鏄浣欑殑銆傦紙浣犲綋鐒跺彲浠ラ噸杞?#8220;->*”榪欎簺榪愮畻絎︼紝浣嗚繖涓嶆槸鏈枃鎵瑕佹秹鍙婄殑鑼冨洿銆傦級
涓涓垚鍛樺嚱鏁版寚閽堝彲浠ヨ璁劇疆鎴?錛屽茍鍙互浣跨敤“==”鍜?#8220;!=”姣旇緝榪愮畻絎︼紝浣嗗彧鑳介檺瀹氬湪鍚屼竴涓被涓殑鎴愬憳鍑芥暟鐨勬寚閽堜箣闂磋繘琛岃繖鏍風殑姣旇緝銆備換浣曟垚鍛樺嚱鏁版寚閽堥兘鍙互鍜?鍋氭瘮杈冧互鍒ゆ柇瀹冩槸鍚︿負絀恒備笌鍑芥暟鎸囬拡涓嶅悓錛屼笉絳夎繍綆楃錛?lt;, >, <=, >=錛夊鎴愬憳鍑芥暟鎸囬拡鏄笉鍙敤鐨勩?br>
鎴愬憳鍑芥暟鎸囬拡鐨勬紓涔嬪
鎴愬憳鍑芥暟鎸囬拡鏈夋椂琛ㄧ幇寰楀緢濂囨傞鍏堬紝浣犱笉鍙互鐢ㄤ竴涓垚鍛樺嚱鏁版寚閽堟寚鍚戜竴涓潤鎬佹垚鍛樺嚱鏁幫紝浣犲繀欏諱嬌鐢ㄦ櫘閫氱殑鍑芥暟鎸囬拡鎵嶈錛堝湪榪欓噷“鎴愬憳鍑芥暟鎸囬拡”浼氫駭鐢熻瑙o紝瀹冨疄闄呬笂搴旇鏄?#8220;闈為潤鎬佹垚鍛樺嚱鏁版寚閽?#8221;鎵嶅錛夈傚叾嬈★紝褰撲嬌鐢ㄧ被鐨勭戶鎵挎椂錛屼細鍑虹幇涓浜涙瘮杈冨鎬殑鎯呭喌銆傛瘮濡傦紝涓嬮潰鐨勪唬鐮佸湪MSVC涓嬩細緙栬瘧鎴愬姛錛堟敞鎰忎唬鐮佹敞閲婏級錛?br>
class SomeClass {
public:
virtual void some_member_func(int x, char *p) {
printf("In SomeClass"); };
};
class DerivedClass : public SomeClass {
public:
// 濡傛灉浣犳妸涓嬩竴琛岀殑娉ㄩ噴閿鎺夛紝甯︽湁 line (*)鐨勯偅涓琛屼細鍑虹幇閿欒
// virtual void some_member_func(int x, char *p) { printf("In DerivedClass"); };
};
int main() {
//澹版槑SomeClass鐨勬垚鍛樺嚱鏁版寚閽?/span>
typedef void (SomeClass::*SomeClassMFP)(int, char *);
SomeClassMFP my_memfunc_ptr;
my_memfunc_ptr = &DerivedClass::some_member_func; // ---- line (*)
return 0;
}
濂囨殑鏄紝&DerivedClass::some_member_func鏄竴涓猄omeClass綾葷殑鎴愬憳鍑芥暟鎸囬拡錛岃屼笉鏄疍erivedClass綾葷殑鎴愬憳鍑芥暟鎸囬拡錛侊紙涓浜涚紪璇戝櫒紼嶅井鏈変簺涓嶅悓錛氭瘮濡傦紝瀵逛簬Digital Mars C++錛屽湪涓婇潰鐨勪緥瀛愪腑錛?amp;DerivedClass::some_member_func浼氳璁や負娌℃湁瀹氫箟銆傦級浣嗘槸錛屽鏋滃湪DerivedClass綾諱腑閲嶅啓錛坥verride錛変簡some_member_func鍑芥暟錛屼唬鐮佸氨鏃犳硶閫氳繃緙栬瘧錛屽洜涓虹幇鍦ㄧ殑&DerivedClass::some_member_func宸叉垚涓篋erivedClass綾諱腑鐨勬垚鍛樺嚱鏁版寚閽堬紒
鎴愬憳鍑芥暟鎸囬拡涔嬮棿鐨勭被鍨嬭漿鎹㈡槸涓涓璁鴻搗鏉ラ潪甯告ā緋婄殑璇濋銆傚湪C++鐨勬爣鍑嗗寲鐨勮繃紼嬩腑錛屽湪娑夊強緇ф壙鐨勭被鐨勬垚鍛樺嚱鏁版寚閽堟椂錛屽浜庡皢鎴愬憳鍑芥暟鎸囬拡杞寲涓哄熀綾葷殑鎴愬憳鍑芥暟鎸囬拡榪樻槸杞寲涓哄瓙綾繪垚鍛樺嚱鏁版寚閽堢殑闂鍜屾槸鍚﹀彲浠ュ皢涓涓被鐨勬垚鍛樺嚱鏁版寚閽堣漿鍖栦負鍙︿竴涓笉鐩稿叧鐨勭被鐨勬垚鍛樺嚱鏁版寚閽堢殑闂錛屼漢浠浘鏈夎繃寰堟縺鐑堢殑浜夎銆傜劧鑰屼笉騫哥殑鏄紝鍦ㄦ爣鍑嗗鍛樹細鍋氬嚭鍐沖畾涔嬪墠錛屼笉鍚岀殑緙栬瘧鍣ㄧ敓浜у晢宸茬粡鏍規嵁鑷繁瀵硅繖浜涢棶棰樼殑涓嶅悓鐨勫洖絳斿疄鐜頒簡鑷繁鐨勭紪璇戝櫒銆傛牴鎹爣鍑嗭紙絎?.2.10/9鑺傦級錛屼綘鍙互浣跨敤reinterpret_cast鍦ㄤ竴涓垚鍛樺嚱鏁版寚閽堜腑淇濆瓨涓涓笌鏈潵鐨勭被涓嶇浉鍏崇殑綾葷殑鎴愬憳鍑芥暟銆傛湁鍏蟲垚鍛樺嚱鏁版寚閽堣漿鎹㈢殑闂鐨勬渶緇堢粨鏋滀篃娌℃湁紜畾涓嬫潵銆備綘鐜板湪鎵鑳藉仛鐨勮繕鏄儚浠ュ墠閭f牱鈥斺斿皢鎴愬憳鍑芥暟鎸囬拡杞寲涓烘湰綾葷殑鎴愬憳鍑芥暟鐨勬寚閽堛傚湪鏂囩珷鐨勫悗闈㈡垜浼氱戶緇璁鴻繖涓棶棰橈紝鍥犱負榪欐鏄悇涓紪璇戝櫒瀵硅繖鏍蜂竴涓爣鍑嗘病鏈夎揪鎴愬叡璇嗙殑涓涓瘽棰樸?br>
鍦ㄤ竴浜涚紪璇戝櫒涓紝鍦ㄥ熀綾誨拰瀛愮被鐨勬垚鍛樺嚱鏁版寚閽堜箣闂寸殑杞崲鏃跺父鏈夋簨鍙戠敓銆傚綋娑夊強鍒板閲嶇戶鎵挎椂錛屼嬌鐢╮einterpret_cast灝嗗瓙綾昏漿鎹㈡垚鍩虹被鏃訛紝瀵規煇涓鐗瑰畾緙栬瘧鍣ㄦ潵璇存湁鍙兘閫氳繃緙栬瘧錛岃屼篃鏈夊彲鑳介氫笉榪囩紪璇戯紝榪欏彇鍐充簬鍦ㄥ瓙綾葷殑鍩虹被鍒楄〃涓殑鍩虹被鐨勯『搴忥紒涓嬮潰灝辨槸涓涓緥瀛愶細
class Derived2: public Base2, public Base1 // 鎯呭喌 (b)
typedef void (Derived::* Derived_mfp)();
typedef void (Derived2::* Derived2_mfp)();
typedef void (Base1::* Base1mfp) ();
typedef void (Base2::* Base2mfp) ();
Derived_mfp x;
瀵逛簬鎯呭喌(a)錛宻tatic_cast<Base1mfp> (x) 鏄悎娉曠殑錛岃宻tatic_cast<Base2mfp> (x) 鍒欐槸閿欒鐨勩傜劧鑰屾儏鍐?b)鍗翠笌涔嬬浉鍙嶃備綘鍙彲浠ュ畨鍏ㄥ湴灝嗗瓙綾葷殑鎴愬憳鍑芥暟鎸囬拡杞寲涓虹涓涓熀綾葷殑鎴愬憳鍑芥暟鎸囬拡錛佸鏋滀綘瑕佸疄楠屼竴涓嬶紝MSVC浼氬彂鍑篊4407鍙瘋鍛婏紝鑰孌igital Mars C++浼氬嚭鐜扮紪璇戦敊璇傚鏋滅敤reinterpret_cast浠f浛static_cast錛岃繖涓や釜緙栬瘧鍣ㄩ兘浼氬彂鐢熼敊璇紝浣嗘槸涓ょ緙栬瘧鍣ㄥ姝ゆ湁鐫涓嶅悓鐨勫師鍥犮備絾鏄竴浜涚紪璇戝櫒瀵規緇嗚妭緗箣涓嶇悊錛屽ぇ瀹跺彲瑕佸皬蹇冧簡錛?br>
鏍囧噯C++涓彟涓鏉℃湁瓚g殑瑙勫垯鏄細浣犲彲浠ュ湪綾誨畾涔変箣鍓嶅0鏄庡畠鐨勬垚鍛樺嚱鏁版寚閽堛傝繖瀵逛竴浜涚紪璇戝櫒浼氭湁涓浜涙棤娉曢鏂欑殑鍓綔鐢ㄣ傛垜寰呬細璁ㄨ榪欎釜闂錛岀幇鍦ㄤ綘鍙鐭ラ亾瑕佸敖鍙兘寰楅伩鍏嶈繖縐嶆儏鍐靛氨鏄簡銆?br>
闇瑕佸煎緱娉ㄦ剰鐨勬槸錛屽氨鍍忔垚鍛樺嚱鏁版寚閽堬紝鏍囧噯C++涓悓鏍鋒彁渚涗簡鎴愬憳鏁版嵁鎸囬拡錛坢ember data pointer錛夈傚畠浠叿鏈夌浉鍚岀殑鎿嶄綔絎︼紝鑰屼笖鏈変竴浜涘疄鐜板師鍒欎篃鏄浉鍚岀殑銆傚畠浠敤鍦╯tl::stable_sort鐨勪竴浜涘疄鐜版柟妗堜腑錛岃屽姝ゅ緢澶氬叾浠栫殑搴旂敤鎴戝氨涓嶅啀鎻愬強浜嗐?br>
鎴愬憳鍑芥暟鎸囬拡鐨勪嬌鐢?br>
鐜板湪浣犲彲鑳戒細瑙夊緱鎴愬憳鍑芥暟鎸囬拡鏄湁浜涘寮傘備絾瀹冨彲浠ョ敤鏉ュ仛浠涔堝憿錛熷姝ゆ垜鍦ㄧ綉涓婂仛浜嗛潪甯稿箍娉涚殑璋冩煡銆傛渶鍚庢垜鎬葷粨鍑轟嬌鐢ㄦ垚鍛樺嚱鏁版寚閽堢殑涓ょ偣鍘熷洜錛?br>
* 鐢ㄦ潵鍋氫緥瀛愮粰
* C++鍒濆鑰呯湅錛屽府鍔╁畠浠涔犺娉曪紱鎴栬?涓轟簡瀹炵幇“濮旀墭錛?br> delegate錛?#8221;錛?
鎴愬憳鍑芥暟鎸囬拡鍦⊿TL鍜孊oost搴撶殑鍗曡鍑芥暟閫傞厤鍣紙one-line function adaptor錛変腑鐨勪嬌鐢ㄦ槸寰笉瓚抽亾鐨勶紝鑰屼笖鍏佽浣犲皢鎴愬憳鍑芥暟鍜屾爣鍑嗙畻娉曟販鍚堜嬌鐢ㄣ備絾鏄畠浠渶閲嶈鐨勫簲鐢ㄦ槸鍦ㄤ笉鍚岀被鍨嬬殑搴旂敤紼嬪簭妗嗘灦涓紝姣斿瀹冧滑褰㈡垚浜哅FC娑堟伅緋葷粺鐨勬牳蹇冦?br>
褰撲綘浣跨敤MFC鐨勬秷鎭槧灝勫畯錛堟瘮濡侽N_COMMAND錛夋椂錛屼綘浼氱粍瑁呬竴涓寘鍚秷鎭疘D鍜屾垚鍛樺嚱鏁版寚閽堬紙鍨嬪錛欳CmdTarget::*鎴愬憳鍑芥暟鎸囬拡錛夌殑搴忓垪銆傝繖鏄疢FC綾誨繀欏葷戶鎵緾CmdTarget鎵嶅彲浠ュ鐞嗘秷鎭殑鍘熷洜涔嬩竴銆備絾鏄紝鍚勭涓嶅悓鐨勬秷鎭鐞嗗嚱鏁板叿鏈変笉鍚岀殑鍙傛暟鍒楄〃錛堟瘮濡侽nDraw澶勭悊鍑芥暟鐨勭涓涓弬鏁扮殑綾誨瀷涓篊DC *錛夛紝鎵浠ュ簭鍒椾腑蹇呴』鍖呭惈鍚勭涓嶅悓綾誨瀷鐨勬垚鍛樺嚱鏁版寚閽堛侻FC鏄庢牱鍋氬埌榪欎竴鐐圭殑鍛紵MFC鍒╃敤浜嗕竴涓彲鎬曠殑緙栬瘧鍣ㄦ紡媧烇紙hack錛夛紝瀹冨皢鎵鏈夊彲鑳藉嚭鐜扮殑鎴愬憳鍑芥暟鎸囬拡鏀懼埌涓涓簽澶х殑鑱斿悎錛坲nion錛変腑錛屼粠鑰岄伩鍏嶄簡閫氬父闇瑕佽繘琛岀殑C++綾誨瀷鍖歸厤媯鏌ャ傦紙鐪嬩竴涓媋fximpl.h鍜宑mdtarg.cpp涓悕涓篗essageMapFunctions鐨剈nion錛屼綘灝變細鍙戠幇榪欎竴鎭愭栫殑浜嬪疄銆傦級鍥犱負MFC鏈夊姝ら噸瑕佺殑涓閮ㄥ垎浠g爜錛屾墍浠ヤ簨瀹炴槸錛屾墍鏈夌殑緙栬瘧鍣ㄩ兘涓鴻繖涓紡媧炲紑浜嗙豢鐏傦紙浣嗘槸錛屽湪鍚庨潰鎴戜滑浼氱湅鍒幫紝濡傛灉涓浜涚被鐢ㄥ埌浜嗗閲嶇戶鎵匡紝榪欎釜婕忔礊鍦∕SVC涓氨涓嶄細璧蜂綔鐢紝榪欐鏄湪浣跨敤MFC鏃跺彧鑳藉繀欏諱嬌鐢ㄥ崟涓緇ф壙鐨勫師鍥犮傦級
鍦╞oost::function涓湁綾諱技鐨勬紡媧烇紙浣嗕笉鏄お涓ラ噸錛夈傜湅璧鋒潵濡傛灉浣犳兂鍋氫換浣曟湁鍏蟲垚鍛樺嚱鏁版寚閽堢殑姣旇緝鏈夎叮鐨勪簨錛屼綘灝卞繀欏誨仛濂戒笌榪欎釜璇█鐨勬紡媧炶繘琛屾寫鎴樼殑鍑嗗銆傝鏄綘鎯沖惁瀹欳++鐨勬垚鍛樺嚱鏁版寚閽堣璁℃湁緙洪櫡鐨勮鐐癸紝鐪嬫潵鏄緢闅劇殑銆?br>
鍦ㄥ啓榪欑瘒鏂囩珷涓紝鎴戞湁涓鐐歸渶瑕佹寚鏄庯細“鍏佽鎴愬憳鍑芥暟鎸囬拡涔嬮棿榪涜杞崲錛坈ast錛夛紝鑰屼笉鍏佽鍦ㄨ漿鎹㈠畬鎴愬悗璋冪敤鍏朵腑鐨勫嚱鏁?#8221;錛屾妸榪欎釜瑙勫垯綰沖叆C++鐨勬爣鍑嗕腑鏄彲絎戠殑銆傞鍏堬紝寰堝嫻佽鐨勭紪璇戝櫒瀵硅繖縐嶈漿鎹笉鏀寔錛堟墍浠ワ紝杞崲鏄爣鍑嗚姹傜殑錛屼絾涓嶆槸鍙Щ妞嶇殑錛夈傚叾嬈★紝鎵鏈夌殑緙栬瘧鍣紝濡傛灉杞崲鎴愬姛錛岃皟鐢ㄨ漿鎹㈠悗鐨勬垚鍛樺嚱鏁版寚閽堟椂浠嶇劧鍙互瀹炵幇浣犻鏈熺殑鍔熻兘錛氶偅緙栬瘧鍣ㄥ氨娌℃湁鎵璋撶殑“undefined behavior錛堟湭瀹氫箟鐨勮涓猴級”榪欑被閿欒鍑虹幇鐨勫繀瑕佷簡錛堣皟鐢紙Invocation錛夋槸鍙鐨勶紝浣嗚繖涓嶆槸鏍囧噯錛侊級銆傜涓夛紝鍏佽杞崲鑰屼笉鍏佽璋冪敤鏄畬鍏ㄦ病鏈夌敤澶勭殑錛屽彧鏈夎漿鎹㈠拰璋冪敤閮藉彲琛岋紝鎵嶈兘鏂逛究鑰屾湁鏁堝湴瀹炵幇濮旀墭錛屼粠鑰屼嬌榪欑璇█鍙楃泭銆?br>
涓轟簡璁╀綘紜俊榪欎竴鍏鋒湁浜夎鐨勮鏂紝鑰冭檻涓涓嬪湪涓涓枃浠朵腑鍙湁涓嬮潰鐨勪竴孌典唬鐮侊紝榪欐浠g爜鏄悎娉曠殑錛?br>
typedef void (SomeClass::* SomeClassFunction)(void);
void Invoke(SomeClass *pClass, SomeClassFunction funcptr)
{
(pClass->*funcptr)();
};
娉ㄦ剰鍒扮紪璇戝櫒蹇呴』鐢熸垚姹囩紪浠g爜鏉ヨ皟鐢ㄦ垚鍛樺嚱鏁版寚閽堬紝鍏跺疄緙栬瘧鍣ㄥSomeClass綾諱竴鏃犳墍鐭ャ傛樉鐒訛紝闄ら潪閾炬帴鍣ㄨ繘琛屼簡涓浜涙瀬绔簿緇嗙殑浼樺寲鎺柦錛屽惁鍒欎唬鐮佷細蹇借綾葷殑瀹為檯瀹氫箟鑰岃兘澶熸紜湴榪愯銆傝岃繖閫犳垚鐨勭洿鎺ュ悗鏋滄槸錛屼綘鍙互“瀹夊叏鍦?#8221;璋冪敤浠庡畬鍏ㄤ笉鍚岀殑鍏朵粬綾諱腑杞崲榪囨潵鐨勬垚鍛樺嚱鏁版寚閽堛?br>
涓鴻В閲婃垜鐨勬柇璦鐨勫彟涓鍗娾斺旇漿 鎹㈠茍涓嶈兘鎸夌収鏍囧噯鎵璇寸殑鏂瑰紡榪涜錛屾垜闇瑕佸湪緇嗚妭涓婅璁虹紪璇戝櫒鏄庢牱瀹炵幇鎴愬憳鍑芥暟鎸囬拡鐨勩傛垜鍚屾椂浼氳В閲婁負浠涔堜嬌鐢ㄦ垚鍛樺嚱鏁版寚閽堢殑瑙勫垯鍏鋒湁濡傛涓ユ牸鐨勯檺鍒躲傝幏 寰楄緇嗚榪版垚鍛樺嚱鏁版寚閽堢殑鏂囨。涓嶆槸澶鏄擄紝騫朵笖澶у瀵歸敊璇殑璦璁哄凡緇忎範浠ヤ負甯鎬簡錛屾墍浠ワ紝鎴戜粩緇嗘鏌ヤ簡涓緋誨垪緙栬瘧鍣ㄧ敓鎴愮殑姹囩紪浠g爜……
]]>
銆銆鍒氶亣鍒拌繖縐嶈娉曟椂涔熻浼氳浣犳姝ヤ笉鍓嶃備絾浣犱細鍙戠幇錛屼嬌鐢ㄦ伆褰撶殑綾誨瀷瀹氫箟涔嬪悗錛屽鏉傜殑璇硶鏄彲浠ョ畝鍖栫殑銆傛湰鏂囧紩瀵間綘浜嗚В鎴愬憳鍑芥暟鎸囬拡鐨勫0鏄庯紝璧嬪煎拰璋冪敤鍥炲彨鍑芥暟銆?
銆銆鎴愬憳鍑芥暟鎸囬拡鐨勫0鏄?/strong>
銆銆涓涓垚鍛樺嚱鏁版寚閽堝寘鎷垚鍛樺嚱鏁扮殑榪斿洖綾誨瀷錛屽悗闅?:鎿嶄綔絎︾被鍚嶏紝鎸囬拡鍚嶅拰鍑芥暟鐨勫弬鏁般傚垵鐪嬩笂鍘伙紝璇硶鏈夌偣澶嶆潅銆傚叾瀹炲彲浠ユ妸瀹冪悊瑙d負涓涓寚鍚戝師鍑芥暟鐨勬寚閽堬紝鏍煎紡鏄細鍑芥暟榪斿洖綾誨瀷錛岀被鍚嶏紝::鎿嶄綔絎︼紝鎸囬拡鏄熷彿錛屾寚閽堝悕錛屽嚱鏁板弬鏁般?
銆銆涓涓寚鍚戝閮ㄥ嚱鏁扮殑鎸囬拡澹版槑涓猴細
銆銆void (*pf)(char *, const char *);
銆銆void strcpy(char * dest, const char * source);
銆銆pf=strcpy;
銆銆涓涓寚鍚戠被A鎴愬憳鍑芥暟鐨勬寚閽堝0鏄庝負錛?
銆銆void (A::*pmf)(char *, const char *);
銆銆澹版槑鐨勮В閲婃槸錛歱mf鏄竴涓寚鍚慉鎴愬憳鍑芥暟鐨勬寚閽堬紝榪斿洖鏃犵被鍨嬪鹼紝鍑芥暟甯︽湁浜屼釜鍙傛暟錛屽弬鏁扮殑綾誨瀷鍒嗗埆鏄痗har * 鍜?const char *銆傞櫎浜嗗湪鏄熷彿鍓嶅鍔燗:: 錛屼笌澹版槑澶栭儴鍑芥暟鎸囬拡鐨勬柟娉曚竴鏍楓?
銆銆璧嬪?/strong>
銆銆緇欐垚鍛樻寚閽堣祴鍊肩殑鏂規硶鏄皢鍑芥暟鍚嶉氳繃鎸囬拡絎﹀彿&璧嬩簣鎸囬拡鍚嶃傚涓嬫墍紺猴細
{
銆銆public:
銆銆銆void strcpy(char *, const char *);
銆銆銆void strcat(char *, const char *);
};
pmf = &A::strcpy;
銆銆鏈変簺鑰佺殑緙栬瘧鍣ㄥ彲浠ラ氳繃娌℃湁&鍙風殑璧嬪兼柟寮忥紝浣嗘爣鍑咰++寮哄埗瑕佹眰鍔犱笂&鍙楓?
銆銆浣跨敤綾誨瀷瀹氫箟
銆銆鍙互鐢ㄧ被鍨嬪畾涔夋潵闅愯棌澶嶆潅鐨勬垚鍛樻寚閽堣娉曘備緥濡傦紝涓嬮潰鐨勮鍙ュ畾涔変簡PMA鏄竴涓寚鍚慉鎴愬憳鍑芥暟鐨勬寚閽堬紝鍑芥暟榪斿洖鏃犵被鍨嬪鹼紝鍑芥暟鍙傛暟綾誨瀷涓篶har * 鍜?const char *錛?
銆銆typedef void(A::*PMA)(char *, const char *);
銆銆PMA pmf= &A::strcat; // pmf鏄疨MF綾誨瀷(綾籄鎴愬憳鎸囬拡)鐨勫彉閲?
銆銆涓嬫枃浼氱湅鍒頒嬌鐢ㄧ被鍨嬪畾涔夌壒鍒湁鍒╀簬澹版槑鎴愬憳鎸囬拡鏁扮粍銆?
銆銆閫氳繃鎴愬憳鎸囬拡璋冪敤鎴愬憳鍑芥暟
鍙互鍦ㄤ笉蹇呯煡閬撳嚱鏁板悕鐨勬儏鍐典笅錛岄氳繃鎴愬憳鎸囬拡璋冪敤瀵硅薄鐨勬垚鍛樺嚱鏁般備緥濡傦紝鍑芥暟dispatcher鏈変竴涓彉閲弍mf錛岄氳繃瀹冭皟鐢ㄧ被鎴愬憳鍑芥暟錛屼笉綆″畠璋冪敤
鐨勬槸strcpy()鍑芥暟榪樻槸strcat()鍑芥暟銆傛寚鍚戝閮ㄥ師鍑芥暟鐨勬寚閽堝拰鎸囧悜綾繪垚鍛樺嚱鏁扮殑鎸囬拡鏄湁寰堝ぇ鍖哄埆鐨勩傚悗鑰呭繀欏繪寚鍚戣璋冨嚱鏁扮殑瀹夸富瀵硅薄銆傚洜
姝わ紝闄や簡瑕佹湁鎴愬憳鎸囬拡澶栵紝榪樿鏈夊悎娉曞璞℃垨瀵硅薄鎸囬拡銆?
銆銆鐜頒婦渚嬪仛榪涗竴姝ヨ鏄庛傚亣璁続鏈変簩涓疄渚嬶紝鎴愬憳鍑芥暟鎸囬拡鏀寔澶氭佹с傝繖鏍峰湪鎴愬憳鎸囬拡璋冪敤铏氭垚鍛樺嚱鏁版椂鏄姩鎬佸鐞嗙殑(鍗蟲墍璋撳悗鑱旂紪 - 璇戞敞)銆傛敞鎰忥紝涓嶅彲璋冪敤鏋勯犲拰鏋愭瀯鍑芥暟銆傜ず渚嬪涓嬶細
銆銆A *p= &a1; //鍒涘緩鎸囧悜A鐨勬寚閽?br>
銆銆//鍒涘緩鎸囧悜鎴愬憳鐨勬寚閽堝茍鍒濆鍖?/font>
銆銆void (A::*pmf)(char *, const char *) = &A::strcpy;
銆銆//瑕佸皢鎴愬憳鍑芥暟緇戝畾鍒皃mf錛屽繀欏誨畾涔夊懠鍙殑瀵硅薄銆?br>
銆銆//鍙互鐢?鍙峰紩瀵鹼細
銆銆void dispatcher(A a, void (A::*pmf)(char *, const char *))
銆銆{
銆銆銆char str[4];
銆銆銆(a.*pmf)(str, “abc”); //灝嗘垚鍛樺嚱鏁扮粦瀹氬埌pmf
銆銆}
銆銆//鎴栫敤A鐨勬寚閽堣〃杈炬柟寮忔寚鍚戞垚鍛樻寚閽堬細
銆銆void dispatcher(A * p, void (A::*pmf)(char *, const char *))
銆銆{
銆銆銆char str[4]; (p->*pmf)(str, “abc”);
銆銆}
銆銆//鍑芥暟鐨勮皟鐢ㄦ柟娉曚負錛?/font>
銆銆dispatcher(a, pmf); // .* 鏂瑰紡
銆銆dispatcher(&a, pmf); // ->* 鏂瑰紡
楂樼駭浣跨敤鎶宸?
銆銆浠ヤ笂鏄垚鍛樺嚱鏁扮殑鍩烘湰鐭ヨ瘑銆傜幇鍦ㄤ粙緇嶅畠鐨勯珮綰т嬌鐢ㄦ妧宸с?
銆銆鎴愬憳鎸囬拡鏁扮粍
銆銆鍦ㄤ笅渚嬶紝澹版槑浜嗕竴涓惈鏈変簩涓垚鍛樻寚閽堢殑鏁扮粍錛屽茍鍒嗛厤綾葷殑鎴愬憳鍑芥暟鍦板潃緇欐垚鍛樻寚閽堬細
銆銆PMA pmf[2]= {&A::strcpy, &A::strcat};
涔熷氨鏄?br> void (A::*PMA[2])(char *, const char *)= {&A::strcpy, &A::strcat};
銆銆榪欐牱鐨勬暟緇勫湪鑿滃崟椹卞姩搴旂敤涓緢鏈夌敤銆傞夋嫨鑿滃崟欏瑰悗錛屽簲鐢ㄥ皢璋冪敤鐩稿簲鐨勫洖鍙嚱鏁幫紝濡備笅鎵紺猴細
銆銆int main()
銆銆{
銆銆銆MENU_OPTIONS option; char str[4];
銆銆銆//浠庡閮ㄨ祫婧愯鍙栭夐」
銆銆銆switch (option)
銆銆銆{
銆銆銆銆case COPY:
銆銆銆銆銆(pa->*pmf[COPY])(str, “abc”);
銆銆銆銆銆break;
銆銆銆銆case CONCAT:
銆銆銆銆銆(pa->*pmf[CONCAT])(str, “abc”);
銆銆銆銆銆break;
銆銆銆銆銆//…
銆銆銆}
銆銆}
銆銆Const 綾誨瀷鐨勬垚鍛樺嚱鏁?/strong>
銆銆鎴愬憳鎸囬拡鐨勭被鍨嬪簲璇ヤ笌鎴愬憳鍑芥暟綾誨瀷涓鑷淬備笂闈緥瀛愪腑鐨刾mf 鍙互鎸囧悜A鐨勪換鎰忓嚱鏁幫紝鍙璇ュ嚱鏁頒笉鏄痗onst綾誨瀷銆傚涓嬫墍紺猴紝濡傛灉灝唗ouppercase()鐨勫湴鍧鍒嗛厤緇檖mf錛屽皢瀵艱嚧緙栬瘧鍑洪敊錛屽洜涓簍ouppercase() 鐨勭被鍨嬫槸const銆?
銆 {
銆銆 public:
銆銆銆 void strpcy(char *, const char *);
銆銆銆 void strcat(char *, const char *);
銆銆銆 void touppercase(char *, const char*) const;
銆銆};
銆銆pmf=&A::touppercase; //鍑洪敊錛岀被鍨嬩笉鍖歸厤
銆銆//瑙e喅鐨勬柟娉曟槸澹版槑涓涓猚onst綾誨瀷鐨勬垚鍛樻寚閽堬細
銆銆void (A::pcmf)(char *, const char *) const;
銆銆pcmf=&A::touppercase; // 鐜板湪鍙互浜?nbsp;
銆銆鏈変簺宸姴鐨勭紪璇戝櫒鍏佽涓涓潪const綾誨瀷鐨勬垚鍛樻寚閽堟寚鍚慶onst綾誨瀷鐨勬垚鍛樺嚱鏁般傝繖鍦ㄦ爣鍑咰++鏄笉鍏佽鐨勩?
]]> 澹版槑涓涓寚鍚戞垚鍛樺嚱鏁扮殑鎸囬拡
void strcpy(char * dest, const char * source);
pf=strcpy;void (A::*pmf)(char *, const char *);
璧嬪?span lang="EN-US">
涓轟簡緇欎竴涓寚鍚戞垚鍛樺嚱鏁扮殑鎸囬拡璧嬪鹼紝鍙互閲囩敤鎴愬憳鍑芥暟鍚嶅茍鍐嶅叾鍓嶉潰鍔犱竴涓?span lang="EN-US">&鐨勬柟寮?/span>
浣跨敤typedef
typedef void(A::*PMA)(char *, const char *);
PMA pmf= &A::strcat; // use a typedef to define a pointer to member
]]>
pDC = this->GetDC();
::BeginPath(pDC->m_hDC);
//璁劇疆涓洪忔槑妯″紡
::SetBkMode(pDC->m_hDC, TRANSPARENT);
//
RECT rect;
this->GetClientRect(&rect);
/*涓夎鍨?br> int TopCenterPoint=rect.left + (rect.right - rect.left) /2;
pDC->MoveTo(TopCenterPoint, rect.top);
pDC->LineTo(rect.left, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.right, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(TopCenterPoint,rect.top);
*/
/*姣旇緝濂囨殑鐭╁艦
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.right, rect.top);
pDC->LineTo(rect.right, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2 - GLOBAL_OVERWIDTH, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left, rect.top);
*/
//
::EndPath(pDC->m_hDC);
hRgn = ::PathToRegion(pDC->m_hDC);
this->SetWindowRgn(hRgn, TRUE);
=============================================================
0. 紓佺洏鏂囦歡鏁版嵁瀛樺偍鏂瑰紡
鍦ㄤ粙緇嶅悇縐嶆搷浣滄枃浠舵柟寮忎箣鍓嶏紝闇瑕佸厛浠嬬粛紓佺洏涓婃枃浠舵暟鎹殑緇勭粐鏂瑰紡銆?/span>
瀹為檯涓婏紝鏂囦歡鏄湪璁$畻鏈哄唴瀛樹腑浠ヤ簩榪涘埗琛ㄧず鐨勬暟鎹湪澶栭儴瀛樺偍浠嬭川涓婄殑鍙︿竴縐嶅瓨鏀懼艦寮忋?/span>鏂囦歡閫氬父鍒嗕負浜岃繘鍒舵枃浠跺拰鏂囨湰鏂囦歡銆?/span>浜岃繘鍒舵枃浠舵槸鍖呭惈鍦?/span>ASCII鍙婃墿灞?/span>ASCII瀛楃涓紪鍐欑殑鏁版嵁鎴栫▼搴忔寚浠ょ殑鏂囦歡銆備竴鑸槸鍙墽琛屾枃浠?/span>(Exe)銆佸浘褰€佸浘鍍忋佸0闊崇瓑鏂囦歡銆傝屾枃鏈枃浠?/span>(閫氬父涔熸垚涓?/span>ASCII鏂囦歡)錛屽畠鐨勬瘡涓瀛楄妭瀛樻斁鐨勬槸鍙〃紺轟負涓涓瓧絎︾殑ASCII浠g爜鐨勬枃浠躲傝繖閲屾妸鏂囦歡鍖哄垎涓轟簩榪涘埗鏂囦歡鍜屾枃鏈枃浠訛紝浣嗗疄闄呬笂瀹冧滑閮芥槸浠ヤ簩榪涘埗鏁版嵁鐨勬柟寮忔潵瀛樺偍鐨勩傛枃鏈枃浠墮噷鎵瀛樺偍鐨勬瘡涓涓瓧鑺傞兘鍙互杞寲涓轟竴涓?/span>鍙鐨勫瓧絎︺傝濡?/span>’a’,’b’錛?/span>浣嗗湪鍐呭瓨涓茍涓嶄細瀛樺偍'a', 'b'錛岃屾槸瀛樺偍瀹冧滑鐨?/span>ASCII鐮侊細61鍜?/span>62銆?/span>
1. C璇█瀵規枃浠舵搷浣滅殑鏀寔
鍦?/span>C璇█涓紝瀵逛簬鏂囦歡鐨勬搷浣滈兘鏄埄鐢?/span>FILE緇撴瀯浣撴潵榪涜鐨勩傚寘鎷枃浠剁殑鎵撳紑銆佹枃浠剁殑璇誨啓銆佹枃浠剁殑鍏抽棴銆佹枃浠舵寚閽堢殑瀹氫綅絳夈?/span>
(1) 鏂囦歡鐨勬墦寮
鏂囦歡鐨勬墦寮闇瑕佺敤fopen鍑芥暟銆傝鍑芥暟甯?/span>2涓弬鏁幫紝榪斿洖鍊間負鎸囧悜涔嬪墠瀹氫箟鐨?/span>FILE緇撴瀯浣撴寚閽堛傝娉曞畾涔変負
FILE* fopen(const char* filename, const char* mod);
鍙傛暟1錛氳〃紺鴻鎵撳紑鏂囦歡鐨勫畬鏁磋礬寰勶紝渚嬪: “C:\\Test\\Zero_Test.txt”.
鍙傛暟2錛氭墦寮鏂囦歡鐨勬柟寮忋傚彇鍊間負涓嬭〃鎵紺恒?/span>
|
鏂囦歡鎵撳紑妯″紡 |
鎰忎箟 |
|
r/rb |
涓鴻鍙栬屾墦寮銆傚鏋滄枃浠朵笉瀛樺湪鎴栦笉鑳芥壘鍒幫紝鍑芥暟璋冪敤澶辮觸銆?/span> |
|
w/wb |
涓哄啓鍏ヨ屾墦寮涓涓┖鏂囦歡銆傚鏋滅粰瀹氱殑鏂囦歡宸茬粡瀛樺湪錛屽垯娓呯┖鍏跺唴瀹廣?/span> |
|
a/ab |
涓哄啓鍏ヨ屾墦寮涓涓枃浠躲傚鏋滄枃浠跺瓨鍦紝鍒欏湪鏂囦歡灝鵑儴娣誨姞鏂版暟鎹紝鍦ㄥ啓鏂版暟鎹箣鍓嶄笉浼氱Щ闄ゅ師鏈夌殑EOF鏍囧織銆傚鏋滄枃浠朵笉瀛樺湪錛屽垯鏂板緩涓涓┖鏂囦歡浠ュ緟鍐欏叆銆?/span> |
|
r+/rb+ |
鎵撳紑鏂囦歡鐢ㄤ簬鍐欏叆鎿嶄綔鍜岃鍙栨搷浣滐紝鏂囦歡蹇呴』瀛樺湪銆?/span> |
|
w+/wb+ |
涓哄啓鍏ユ搷浣滃拰璇誨彇鎿嶄綔鎵撳紑涓涓┖鏂囦歡銆傚鏋滄枃浠跺凡緇忓瓨鍦紝鍒欐竻絀哄叾鍐呭銆?/span> |
|
a+/ab+ |
鎵撳紑鏂囦歡鐢ㄤ簬璇誨彇鎿嶄綔鍜屾坊鍔犳搷浣溿傚茍涓旀坊鍔犳搷浣滃湪娣誨姞鏂版暟鎹箣鍓嶄細縐婚櫎璇ユ枃浠朵腑宸叉湁鐨?/span>EOF鏍囧織錛岀劧鍚庡綋鍐欏叆鎿嶄綔瀹屾垚涔嬪悗鍐嶆仮澶?/span>EOF鏍囧織銆傚鏋滄寚瀹氭枃浠朵笉瀛樺湪錛岄偅涔堥鍏堝皢鏂板緩涓涓枃浠躲?/span> |
鍦ㄤ笂琛ㄤ腑錛屾病鏈夊甫b鐨勬ā寮忚〃紺烘墦寮鐨勬槸鏂囨湰鏂囦歡錛岃屽甫b鐨勬ā寮忚〃紺烘墦寮鐨勬槸浜岃繘鍒舵枃浠躲?/span>
閫氬父鍦ㄥ畾涔夌粨鏋?/span>FILE鏃朵細灝嗗叾鍒濆鍖栦負NULL銆傚湪鎵撳紑鏂囦歡灝嗗嚱鏁?/span>fopen鐨勮繑鍥炲艱祴鍊肩粰瀹冦備箣鍚庨渶瑕佸垽鏂枃浠舵槸鍚︽垚鍔熸墦寮錛屽彲閲囩敤濡備笅鏂瑰紡錛?/span>
if ((pFile = fopen(“C:\\Test\\Zero_Test.txt”, “w”) == NULL)
Print(“Opening File Error.”); // FILE* pFile = NULL;
else
姝e父鍐欏叆鏁版嵁鍒版枃浠?/span>…
錛?/span>2錛夋枃浠剁殑鍏抽棴
鍦ㄤ嬌鐢ㄥ畬涓涓枃浠朵箣鍚庡簲璇ュ叧闂畠錛屼互闃叉瀹冨啀琚鐢ㄣ?#8220;鍏抽棴”灝辨槸浣挎枃浠舵寚閽堝彉閲忎笉鍐嶆寚鍚戣鏂囦歡錛屼嬌鍏惰劚閽┿傚嚱鏁頒嬌鐢ㄦ柟寮?/span>:
fclose(pFile);
闇瑕佹敞鎰忕殑鏄?/span>fclose鐨勫弬鏁板繀欏繪槸鏈夋晥鐨勬枃浠舵寚閽堝彉閲忥紝鍚﹀垯榪愯鏃朵細鎸傛帀銆?/span>
搴旇鍏繪垚鍦ㄦ枃浠舵暟鎹搷浣滃畬鎴愬悗鍏抽棴鏂囦歡鐨勪範鎯紝濡傛灉涓嶅叧闂枃浠跺皢浼氫涪澶辨暟鎹傚悓鏃訛紝鍦ㄥ悜鏂囦歡鍐欐暟鎹椂錛屾槸鐜板皢鏁版嵁杈撳嚭鍒扮紦鍐插尯錛屽緟緙撳啿鍖哄厖婊″悗鎵嶆寮忚緭鍑虹粰鏂囦歡銆傚鏋滅▼搴忚繍琛岀粨鏉熻岀紦鍐插尯騫舵湭鍏呮弧錛屽垯緙撳啿鍖轟腑鐨勬暟鎹皢浼氫涪澶便傚洜姝ゅ埄鐢ㄥ嚱鏁?/span>fclose鏉ュ叧闂枃浠跺彲浠ラ伩鍏嶈繖涓棶棰樸?/span>
褰撶劧錛岃繕鏈夊彟澶栦竴涓嚱鏁?/span>fflush錛屼篃鍙互鐢ㄦ潵灝嗙紦鍐插尯閲岀殑鏁版嵁杈撳嚭鍒版枃浠朵腑銆傚嚱鏁拌皟鐢ㄦ柟寮?/span>:
fflush(pFile);
錛?/span>3錛夋枃浠剁殑璇誨啓
褰撴秹鍙婂埌澶ч噺鏁版嵁鐨勮鍐欐椂錛屽彲浠ラ噰鐢ㄥ嚱鏁?/span>fread鍜?/span>fwrite銆?/span>榪欎袱涓嚱鏁伴氬父鐢ㄤ簬浜岃繘鍒舵枃浠剁殑璇誨啓銆?/span>鍑芥暟璋冪敤鏂瑰紡濡備笅錛?/span>
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
buffer鏄竴涓寚閽堬紝鏄敤鏉ュ瓨鏀炬暟鎹殑鍙橀噺鎸囬拡錛屼緥濡傚唴緗被鍨嬪彉閲忕殑鎸囬拡錛岀粨鏋勪綋鍙橀噺鎸囬拡絳夈?/span>
size鏄璇誨啓鐨勫瓧鑺傛暟銆?/span>鐗瑰埆瑕佹敞鎰忕殑鏄紝姝ゅ騫朵笉鏄暟緇勭殑澶у皬錛岀粨鏋勪綋鍐呭彉閲忕殑涓暟絳夈傛渶濂介噰鐢?/span>sizeof鎿嶄綔絎︽潵姹傚緱buffer鐨勫唴瀛樺瓧鑺傛暟銆?/span>
count鏄?/span>size澶у皬鐨勯噸澶嶆鏁般?/span>
fp鏄枃浠舵寚閽堛?/span>
瀵逛簬榪欐牱鐨勭粨鏋勪綋錛?/span>
typedef struct {
int clr_sel; // color mode鐨勯夋嫨
int fixval_sel; // fixed value鐨勯夋嫨
float thres_val; // threshold value鐨勭‘瀹?/span>
float thres_scrlbar_pos; // threshold scroll bar浣嶇疆鐨勭‘瀹?/span>
int method_sel; // analysis method鐨勯夋嫨
int usediff_sel; // use difference of MSA/TSE鏂瑰紡鐨勯夋嫨
int usescat_sel; // use MSA/TSE of scatter signal 鏂瑰紡鐨勯夋嫨
int remxtalk_sel; // remove crosstalk 鏂瑰紡鐨勯夋嫨
float timewin_scrlbar_pos; // time window scroll bar浣嶇疆鐨勭‘瀹?/span>
int timewin_sel; // time window妯″紡鐨勯夋嫨
int freq_sel; // frequency selection妯″紡鐨勯夋嫨
int path_sel; // path selection妯″紡鐨勯夋嫨
} IMG_SETTINGS;
IMG_SETTINGS m_img_settings;
鏂囦歡璇誨啓鎿嶄綔鏃訛紝鍙噰鐢ㄥ涓嬫柟寮忥細
fwrite(&m_img_settings, sizeof(m_img_settings), 1, pwFile);
fread(&m_img_settings, sizeof(m_img_settings), 1, prFile);
====================================================
濡傛灉鎯寵鍐欑壒瀹氭牸寮忕殑鏂囦歡錛屽彲閲囩敤fprintf鍜?/span>fscanf鍑芥暟銆?/span>榪欎袱涓嚱鏁伴氬父鏄拡瀵規枃鏈枃浠惰繘琛屾搷浣溿?/span>
鍑芥暟璋冪敤鏂瑰紡濡備笅錛?/span>
fprintf(pFile, “%d…”, i, j, k …);
fscanf(pFile, “%d…”, i j, k…);
鏍煎紡鍖栨椂鍙互瑙勫畾璇誨啓鏁版嵁鐨勭簿搴︼紝綾誨瀷錛屼互鍙婃暟鎹箣闂寸殑鍒嗗壊絎︾瓑銆?/span>
渚嬪錛?/span>
fprintf(pFile, " %d %d %d %d %d %d %d %d \n", sigSize, samp_points, samp_rate,40, avrag_num, 0, 0, 0);
fprintf(pFile, "%d %.2f %s %d %d %d %d \n", vpathdef[i].frequency1/1000,
vpathdef[i].amplitude, sig_type.c_str(), psnset->sensorArray[vpathdef[i].actuator-1].channel-tol,
psnset->sensorArray[vpathdef[i].sensor-1].channel-tol, vpathdef[i].gain, 30);
鐗瑰埆闇瑕佹敞鎰忕殑鏄紝濡傛灉鍐欏叆鐨勬暟鎹殑綾誨瀷鐩稿悓鏃訛紝涓嶅彲涓轟簡綆渚匡紝灝嗘牸寮忓寲鐨勫瓧絎︿覆鍐欐垚濡傛褰㈠紡(.., ”%d”,i,j,k…); // i,j,k…鍚屾暣鍨嬬被鍨嬨?/span>
濡傛灉榪欐牱鎿嶄綔鐨勮瘽錛岃鍐欑殑鏁版嵁渚垮彧鏈夋暟鎹?/span>i浜嗐?/span>
鏈鍚庨拡瀵逛竴涓潰璇曢鏉ュC璇█鎿嶄綔鏂囦歡鐨勬柟寮忎綔涓涓葷粨.
闈㈣瘯棰橈細緇欎綘涓涓暣鏁幫紝渚嬪12345錛屽皢榪欎釜鏁存暟淇濆瓨鍒版枃浠朵腑錛岃姹傚湪浠ヨ浜嬫湰鎵撳紑璇ユ枃浠舵椂錛屾樉紺虹殑鏄?/span>:12345銆?/span>
緇欏嚭涓夌浠g爜錛?/span>
錛?錛?span>
浠g爜1FILE* pwFile = NULL;
pwFile = fopen(“c:\\Test.txt”, “w”); // create and open file with text mode.
int i = 12345; // However, write number with binary mode.
fwrite(&i, 4, 1, pwFile); // sizeof(int) = 4.
fclose(fwFile);
========================
錛?錛?span>
浠g爜2FILE* pwFile = NULL;
pwFile = fopen(“c:\\Test.txt”, “w”);
char ch[5] = {1+48, 2+48, 3+48, 4+48, 5+48 };
fwrite(ch, 1, 5, pwFile); // sizeof(char) = 1, 5*sizeof(char) = 5
fclose(pwFile);
=======================
錛?錛?span>
浠g爜3FILE* pwFile = NULL;
pwFile = fopen(“c:\\Test.txt”, “w”);
int i = 12345;
char ch[5];
itoa(i, ch, 10); // transform int number to string
fwrite(ch, 1, 5, fwFile);
fclose(pFile);
==============================
錛?錛?span> 浠g爜4
FILE* pwFile = NULL;
pwFile = fopen(“c:\\Test.txt”, “w”);
int i = 12345;
fprintf(pwFile, “%d”, i); // write number with specified format.
fclose(pwFile);
==============================
灝?/span>4縐嶄唬鐮佸湪vc涓繘琛岀紪璇戣繍琛岋紝鍙互鍙戠幇鍙湁鏂瑰紡錛?/span>1錛変笉婊¤凍棰樼洰瑕佹眰銆?br>
渚濇鏄綾匯佹枃妗g被銆佹鏋剁被錛屾渶鍚庢墠鏄簲鐢ㄧ▼搴忕被銆?/span>
2. Windows娑堟伅鐨勫垎綾?/span>
瀹為檯涓婏紝鑿滃崟鍛戒護涔熸槸涓縐嶆秷鎭傚湪Windows涓紝娑堟伅鍒嗕負浠ヤ笅3縐嶏細
錛?錛?span> 鏍囧噯娑堟伅
闄や簡WM_COMMAND涔嬪錛屾墍鏈変互WM_寮澶寸殑娑堟伅閮芥槸鏍囧噯娑堟伅銆備粠CWnd媧劇敓鐨勭被錛岄兘鍙互鎺ユ敹鍒拌綾繪秷鎭?/span>
錛?錛?span> 鍛戒護娑堟伅
鏉ヨ嚜鑿滃崟銆佸姞閫熼敭鎴栧伐鍏鋒爮鎸夐挳鐨勬秷鎭傝繖綾繪秷鎭兘鏄互WM_COMMAND褰㈠紡鍛堢幇銆傚湪MFC涓紝閫氳繃鑿滃崟欏圭殑鏍囪瘑(ID)鏉ュ尯鍒嗕笉鍚岀殑鍛戒護娑堟伅錛涘湪SDK涓紝閫氳繃娑堟伅鐨?/span>wParam鍙傛暟鏉ユ爣璇嗐備粠CCmdTarget媧劇敓鐨勭被錛岄兘鍙互鎺ユ敹鍒拌繖綾繪秷鎭?/span>
錛?錛?span> 閫氬憡娑堟伅
鐢辨帶浠朵駭鐢熺殑娑堟伅錛屼緥濡傛寜閽殑鍗曞嚮銆佸垪琛ㄦ鐨勯夋嫨絳夐兘浼氫駭鐢熻繖綾繪秷鎭紝鐩殑鏄負浜嗗悜鍏剁埗紿楀彛閫氱煡浜嬩歡鐨勫彂鐢熴傝繖綾繪秷鎭篃鏄互WM_COMMAND褰㈠紡鍛堢幇鐨勩備粠CCmdTarget媧劇敓鐨勭被錛岄兘鍙互鎺ユ敹鍒拌繖綾繪秷鎭?/span>
鐢變簬CWnd鏄粠CCmdTarget媧劇敓鐨勶紝鏁呬粠CWnd媧劇敓鐨勭被錛屽畠浠棦鍙互鎺ユ敹鏍囧噯娑堟伅錛屼篃鍙互鎺ユ敹鍛戒護娑堟伅鍜岄氬憡娑堟伅銆傝屽浜庨偅浜涗粠CCmdTarget媧劇敓鐨勭被錛屽垯鍙兘鎺ユ敹鍛戒護娑堟伅鍜岄氬憡娑堟伅錛屼笉鑳芥帴鏀舵爣鍑嗘秷鎭?/span>
3. 鑿滃崟鍛戒護娑堟伅璺敱鐨勫叿浣撹繃紼?/span>
褰撶偣鍑繪煇涓彍鍗曢」鏃訛紝鏈鍏堟帴鏀跺埌榪欎釜鑿滃崟鍛戒護娑堟伅鐨勬槸妗嗘灦綾匯傛鏋剁被灝嗘妸鎺ユ敹鍒扮殑榪欎釜娑堟伅浜ょ粰瀹冪殑瀛愮獥鍙o紝鍗寵綾伙紝鐢辮綾婚鍏堣繘琛屽鐞嗐傝綾婚鍏堟牴鎹懡浠ゆ秷鎭槧灝勬満鍒舵煡鎵捐嚜韜槸鍚﹀姝ゆ秷鎭繘琛屼簡鍝嶅簲錛屽鏋滃搷搴斾簡錛屽氨璋冪敤鍝嶅簲鍑芥暟瀵硅繖涓秷鎭繘琛屽鐞嗭紝娑堟伅璺敱榪囩▼緇撴潫錛涘鏋滆綾繪病鏈夊姝ゅ懡浠ゆ秷鎭仛澶勫搷搴旓紝灝變氦鐢辨枃妗g被錛屾枃妗g被鍚屾牱鏌ユ壘鑷韓鏄惁瀵硅繖涓彍鍗曞懡浠よ繘琛屼簡鍝嶅簲錛屽鏋滃搷搴斾簡錛屽氨鐢辨枃妗g被鐨勫懡浠ゆ秷鎭搷搴斿嚱鏁拌繘琛屽鐞嗭紝璺敱榪囩▼緇撴潫銆傚鏋滄枃妗g被涔熸湭鍋氬嚭鍝嶅簲錛屽氨鎶婅繖涓懡浠ゆ秷鎭氦榪樼粰瑙嗙被錛屽悗鑰呭張鎶婅娑堟伅浜よ繕緇欐鏋剁被銆傛鏋剁被鏌ョ湅鑷繁鏄惁瀵硅繖涓懡浠ゆ秷鎭繘琛屼簡鍝嶅簲錛屽鏋滃畠涔熸病鏈変綔澶勫搷搴旓紝灝辨妸榪欎釜鑿滃崟鍛戒護娑堟伅浜ゆ崲緇欏簲鐢ㄧ▼搴忕被錛岀敱鍚庤呮潵榪涜澶勭悊銆?/span>
4. 鑿滃崟鎿嶄綔
瑕佹兂鑾峰緱鏌愪釜鑿滃崟璧勬簮錛岄渶浣跨敤涓嬮潰鐨勫嚱鏁拌皟鐢細
CMenu* GetMenu() const ;
璇ュ嚱鏁拌皟鐢ㄨ呮槸CWnd鐨勫璞°傝繑鍥炲間負CMenu綾誨璞$殑鎸囬拡銆?/span>
閫氳繃鑾峰緱鐨勮彍鍗曟寚閽堜究鍙互鑾峰緱鍏朵笂鐨勬煇涓彍鍗曟爮鐨勬寚閽堜簡銆傝皟鐢ㄦ柟寮忎負錛?/span>
CMenu* GetSubMenu(int nPos) const;
璋冪敤鑰呮槸鑿滃崟璧勬簮鐨勭被瀵硅薄鎸囬拡錛屾垨鑰呮槸鏌愪釜鑿滃崟鏍忕殑瀵硅薄鎸囬拡銆?/span>
濡傛灉鏌愪釜鑿滃崟鏍忎笅闈㈣繕鏈夊瓙鑿滃崟欏癸紝閫氳繃鍙互閫氳繃GetSubMenu鍑芥暟鏉ヨ幏寰楀叾瀛愯彍鍗曢」鐨勬搷浣滄寚閽堛傚瓙鑿滃崟欏圭殑绱㈠紩閮芥槸浠?/span>0寮濮嬬殑錛屽悓鏃跺垎鍓叉爮涔熸槸瑕佸崰鎹儲寮曞肩殑銆?/span>
5. CASE錛?/span>
鍦ㄨ祫婧愮紪杈戝櫒涓紪杈?/span>Popup Menu璧勬簮: IDR_SENSOR_DRAW_MENU銆?/span>
Grids Style瀛愯彍鍗曚腑鐨勫悇涓夐」鏄浉浜掓帓鏂ョ殑銆傝姹傞夋嫨鍏朵腑鐨勪竴涓椂錛岄渶鍦ㄥ叾鑿滃崟鍓嶉潰鏍囧織閫夋嫨瀹?/span>”·”錛屽叾瀹冮兘涓轟負閫変腑銆備篃灝辨槸璇?/span>Style涓彧鑳介変腑涓涓?/span>
鍙噰鐢ㄤ袱縐嶆柟寮忥細
錛?/span>1錛夋槧灝勬秷鎭細ON_WM_CONTEXTMENU()
void ..::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
錛?/span>2錛夋槧灝勬秷鎭細ON_WM_RBUTTONDOWN()
void ..::OnRightBtnDown(.. ..)
鍝嶅簲鍑芥暟瀹炵幇浠g爜錛?/span>
{
CMenu menu;
menu.LoadMenu(IDR_SENSOR_DRAW_MENU); // 瑁呰澆鑿滃崟璧勬簮
CMenu* pMenu = menu.GetSubMenu(0); // 鑾峰緱Sensor Menu鑿滃崟鏍忕殑瀵硅薄鎸囬拡
CMenu* pSubMenu = pMenu->GetSubMenu(0); // 鑾峰緱Grids Style瀛愯彍鍗曢」鐨勫璞℃寚閽?/span>
// 浠ユ綾繪帹錛屽鏋滄槸Edit Structure瀛楄彍鍗曢」鐨勫璞℃寚閽堬紝鍙傛暟搴旇鏄?/span>1
int idxsel = 0;
switch (m_GridStyle) {
case GRIDSOFF:
idxsel = 0;
break;
case GRIDS10X:
idxsel = 2; // separator is one resource, so take it into account.
break;
case GRIDS20X:
idxsel = 3;
break;
case GRIDS30X:
idxsel = 4;
break;
}
// Grids Style瀛愯彍鍗曢」鍙堟湁N涓瓙鑿滃崟欏癸紝鏍規嵁绱㈠紩鍊間綅緗潵璁劇疆鍏剁姸鎬併?/span>
pSubMenu->CheckMenuRadioItem(0, 4, idxsel, MF_BYPOSITION);
// 濡傛灉鏄?/span>WM_RBUTTONDOWN鍝嶅簲錛屽垯闇瑕佽皟鐢ㄥ嚱鏁?/span>
ClientToScreen(&point); // 灝嗗鎴峰潗鏍囪漿鍖栦負灞忓箷鍧愭爣銆?/span>
// 浠ヤ笅鍑芥暟鐨勫弬鏁?/span>x,y鏄睆騫曞潗鏍囧箋?/span>
pMenu->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,this,NULL);
}
Author: Yevgeny Menaker
涓嬭澆浠g爜
鍘熸枃鍑哄錛?a target=_blank>Five Steps to Writing Windows Services in C
鎽樿
銆銆Windows 鏈嶅姟琚璁$敤浜庨渶瑕佸湪鍚庡彴榪愯鐨勫簲鐢ㄧ▼搴忎互鍙婂疄鐜版病鏈夌敤鎴蜂氦浜掔殑浠誨姟銆備負浜嗗涔犺繖縐嶆帶鍒跺彴搴旂敤紼嬪簭鐨勫熀紜鐭ヨ瘑錛孋錛堜笉鏄疌++錛夋槸鏈浣抽夋嫨銆傛湰鏂囧皢寤虹珛騫跺疄鐜頒竴涓畝鍗曠殑鏈嶅姟紼嬪簭錛屽叾鍔熻兘鏄煡璇㈢郴緇熶腑鍙敤鐗╃悊鍐呭瓨鏁伴噺錛岀劧鍚庡皢緇撴灉鍐欏叆涓涓枃鏈枃浠躲傛渶鍚庯紝浣犲彲浠ョ敤鎵瀛︾煡璇嗙紪鍐欒嚜宸辯殑 Windows 鏈嶅姟銆?br>銆銆褰撳垵鎴戝啓絎竴涓?NT 鏈嶅姟鏃訛紝鎴戝埌 MSDN 涓婃壘渚嬪瓙銆傚湪閭i噷鎴戞壘鍒頒簡涓綃?Nigel Thompson 鍐欑殑鏂囩珷錛?#8220;Creating a Simple Win32 Service in C++”錛岃繖綃囨枃绔犻檮甯︿竴涓?C++ 渚嬪瓙銆傝櫧鐒惰繖綃囨枃绔犲緢濂藉湴瑙i噴浜嗘湇鍔$殑寮鍙戣繃紼嬶紝浣嗘槸錛屾垜浠嶇劧鎰熻緙哄皯鎴戦渶瑕佺殑閲嶈淇℃伅銆傛垜鎯崇悊瑙i氳繃浠涔堟鏋訛紝璋冪敤浠涔堝嚱鏁幫紝浠ュ強浣曟椂璋冪敤錛屼絾 C++ 鍦ㄨ繖鏂歸潰娌℃湁璁╂垜杞繪澗澶氬皯銆傞潰鍚戝璞$殑鏂規硶鍥虹劧鏂逛究錛屼絾鐢變簬鐢ㄧ被瀵瑰簳灞?Win32 鍑芥暟璋冪敤榪涜浜嗗皝瑁咃紝瀹冧笉鍒╀簬瀛︿範鏈嶅姟紼嬪簭鐨勫熀鏈煡璇嗐傝繖灝辨槸涓轟粈涔堟垜瑙夊緱 C 鏇村姞閫傚悎浜庣紪鍐欏垵綰ф湇鍔$▼搴忔垨鑰呭疄鐜扮畝鍗曞悗鍙頒換鍔$殑鏈嶅姟銆傚湪浣犲鏈嶅姟紼嬪簭鏈変簡鍏呭垎閫忓交鐨勭悊瑙d箣鍚庯紝鐢?C++ 緙栧啓鎵嶈兘娓稿垉鏈変綑銆傚綋鎴戠寮鍘熸潵鐨勫伐浣滃矖浣嶏紝涓嶅緱涓嶅悜鍙︿竴涓漢杞Щ鎴戠殑鐭ヨ瘑鐨勬椂鍊欙紝鍒╃敤鎴戠敤 C 鎵鍐欑殑渚嬪瓙灝遍潪甯稿鏄撹В閲?NT 鏈嶅姟涔嬫墍浠ョ劧銆?br>銆銆鏈嶅姟鏄竴涓繍琛屽湪鍚庡彴騫跺疄鐜板嬁闇鐢ㄦ埛浜や簰鐨勪換鍔$殑鎺у埗鍙扮▼搴忋俉indows NT/2000/XP 鎿嶄綔緋葷粺鎻愪緵涓烘湇鍔$▼搴忔彁渚涗笓闂ㄧ殑鏀寔銆備漢浠彲浠ョ敤鏈嶅姟鎺у埗闈㈡澘鏉ラ厤緗畨瑁呭ソ鐨勬湇鍔$▼搴忥紝涔熷氨鏄?Windows 2000/XP 鎺у埗闈㈡澘|綆$悊宸ュ叿涓殑“鏈嶅姟”錛堟垨鍦?#8220;寮濮?#8221;|“榪愯”瀵硅瘽妗嗕腑杈撳叆 services.msc /s鈥斺旇瘧鑰呮敞錛夈傚彲浠ュ皢鏈嶅姟閰嶇疆鎴愭搷浣滅郴緇熷惎鍔ㄦ椂鑷姩鍚姩錛岃繖鏍蜂綘灝變笉蹇呮瘡嬈″啀閲嶅惎緋葷粺鍚庤繕瑕佹墜鍔ㄥ惎鍔ㄦ湇鍔°?br>銆銆鏈枃灝嗛鍏堣В閲婂浣曞垱寤轟竴涓畾鏈熸煡璇㈠彲鐢ㄧ墿鐞嗗唴瀛樺茍灝嗙粨鏋滃啓鍏ユ煇涓枃鏈枃浠剁殑鏈嶅姟銆傜劧鍚庢寚瀵間綘瀹屾垚鐢熸垚錛屽畨瑁呭拰瀹炵幇鏈嶅姟鐨勬暣涓繃紼嬨?br>
絎竴姝ワ細涓誨嚱鏁板拰鍏ㄥ眬瀹氫箟
棣栧厛錛屽寘鍚墍闇鐨勫ご鏂囦歡銆備緥瀛愯璋冪敤 Win32 鍑芥暟錛坵indows.h錛夊拰紓佺洏鏂囦歡鍐欏叆錛坰tdio.h錛夛細
#include <windows.h>
#include <stdio.h>
鎺ョ潃錛屽畾涔変袱涓父閲忥細
#define SLEEP_TIME 5000
#define LOGFILE "C:\\MyServices\\memstatus.txt"
SLEEP_TIME 鎸囧畾涓ゆ榪炵畫鏌ヨ鍙敤鍐呭瓨涔嬮棿鐨勬縐掗棿闅斻傚湪絎簩姝ヤ腑緙栧啓鏈嶅姟宸ヤ綔寰幆鐨勬椂鍊欒浣跨敤璇ュ父閲忋?br>LOGFILE 瀹氫箟鏃ュ織鏂囦歡鐨勮礬寰勶紝浣犲皢浼氱敤 WriteToLog 鍑芥暟灝嗗唴瀛樻煡璇㈢殑緇撴灉杈撳嚭鍒拌鏂囦歡錛學riteToLog 鍑芥暟瀹氫箟濡備笅錛?/p>
int WriteToLog(char* str)
{
FILE* log;
log = fopen(LOGFILE, "a+");
if (log == NULL)
return -1;
fprintf(log, "%s\n", str);
fclose(log);
return 0;
}
澹版槑鍑犱釜鍏ㄥ眬鍙橀噺錛屼互渚垮湪紼嬪簭鐨勫涓嚱鏁頒箣闂村叡浜畠浠箋傛澶栵紝鍋氫竴涓嚱鏁扮殑鍓嶅悜瀹氫箟錛?/p>
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
int InitService();
銆銆鐜板湪錛屽噯澶囧伐浣滃凡緇忓氨緇紝浣犲彲浠ュ紑濮嬬紪鐮佷簡銆傛湇鍔$▼搴忔帶鍒跺彴紼嬪簭鐨勪竴涓瓙闆嗐傚洜姝わ紝寮濮嬩綘鍙互瀹氫箟涓涓?main 鍑芥暟錛屽畠鏄▼搴忕殑鍏ュ彛鐐廣傚浜庢湇鍔$▼搴忔潵璇達紝main 鐨勪唬鐮佷護浜烘儕璁跺湴綆鐭紝鍥犱負瀹冨彧鍒涘緩鍒嗘淳琛ㄥ茍鍚姩鎺у埗鍒嗘淳鏈恒?/p>
void main()
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "MemoryStatus";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// 鍚姩鏈嶅姟鐨勬帶鍒跺垎媧炬満綰跨▼
StartServiceCtrlDispatcher(ServiceTable);
}
銆銆涓涓▼搴忓彲鑳藉寘鍚嫢騫蹭釜鏈嶅姟銆傛瘡涓涓湇鍔¢兘蹇呴』鍒椾簬涓撻棬鐨勫垎媧捐〃涓紙涓烘璇ョ▼搴忓畾涔変簡涓涓?ServiceTable 緇撴瀯鏁扮粍錛夈傝繖涓〃涓殑姣忎竴欏歸兘瑕佸湪 SERVICE_TABLE_ENTRY 緇撴瀯涔嬩腑銆傚畠鏈変袱涓煙錛?/p>
銆銆鍒嗘淳琛ㄧ殑鏈鍚庝竴欏瑰繀欏繪槸鏈嶅姟鍚嶅拰鏈嶅姟涓誨嚱鏁板煙鐨?NULL 鎸囬拡錛屾枃鏈緥瀛愮▼搴忎腑鍙涓諱竴涓湇鍔★紝鎵浠ユ湇鍔″悕鐨勫畾涔夋槸鍙夌殑銆?br>銆銆鏈嶅姟鎺у埗綆$悊鍣紙SCM錛歋ervices Control Manager錛夋槸涓涓鐞嗙郴緇熸墍鏈夋湇鍔$殑榪涚▼銆傚綋 SCM 鍚姩鏌愪釜鏈嶅姟鏃訛紝瀹冪瓑寰呮煇涓繘紼嬬殑涓葷嚎紼嬫潵璋冪敤 StartServiceCtrlDispatcher 鍑芥暟銆傚皢鍒嗘淳琛ㄤ紶閫掔粰 StartServiceCtrlDispatcher銆傝繖灝嗘妸璋冪敤榪涚▼鐨勪富綰跨▼杞崲涓烘帶鍒跺垎媧懼櫒銆傝鍒嗘淳鍣ㄥ惎鍔ㄤ竴涓柊綰跨▼錛岃綰跨▼榪愯鍒嗘淳琛ㄤ腑姣忎釜鏈嶅姟鐨?ServiceMain 鍑芥暟錛堟湰鏂囦緥瀛愪腑鍙湁涓涓湇鍔★級鍒嗘淳鍣ㄨ繕鐩戣紼嬪簭涓墍鏈夋湇鍔$殑鎵ц鎯呭喌銆傜劧鍚庡垎媧懼櫒灝嗘帶鍒惰姹備粠 SCM 浼犵粰鏈嶅姟銆?br>
娉ㄦ剰錛氬鏋?StartServiceCtrlDispatcher 鍑芥暟30縐掓病鏈夎璋冪敤錛屼究浼氭姤閿欙紝涓轟簡閬垮厤榪欑鎯呭喌錛屾垜浠繀欏誨湪 ServiceMain 鍑芥暟涓紙鍙傝鏈枃渚嬪瓙錛夋垨鍦ㄩ潪涓誨嚱鏁扮殑鍗曠嫭綰跨▼涓垵濮嬪寲鏈嶅姟鍒嗘淳琛ㄣ傛湰鏂囨墍鎻忚堪鐨勬湇鍔′笉闇瑕侀槻鑼冭繖鏍風殑鎯呭喌銆?br>
銆銆鍒嗘淳琛ㄤ腑鎵鏈夌殑鏈嶅姟鎵ц瀹屼箣鍚庯紙渚嬪錛岀敤鎴烽氳繃“鏈嶅姟”鎺у埗闈㈡澘紼嬪簭鍋滄瀹冧滑錛夛紝鎴栬呭彂鐢熼敊璇椂銆係tartServiceCtrlDispatcher 璋冪敤榪斿洖銆傜劧鍚庝富榪涚▼緇堟銆?br>
絎簩姝ワ細ServiceMain 鍑芥暟
銆銆Listing 1 灞曠ず浜?ServiceMain 鐨勪唬鐮併傝鍑芥暟鏄湇鍔$殑鍏ュ彛鐐廣傚畠榪愯鍦ㄤ竴涓崟鐙殑綰跨▼褰撲腑錛岃繖涓嚎紼嬫槸鐢辨帶鍒跺垎媧懼櫒鍒涘緩鐨勩係erviceMain 搴旇灝藉彲鑳芥棭鏃╀負鏈嶅姟娉ㄥ唽鎺у埗澶勭悊鍣ㄣ傝繖瑕侀氳繃璋冪敤 RegisterServiceCtrlHadler 鍑芥暟鏉ュ疄鐜般備綘瑕佸皢涓や釜鍙傛暟浼犻掔粰姝ゅ嚱鏁幫細鏈嶅姟鍚嶅拰鎸囧悜 ControlHandlerfunction 鐨勬寚閽堛?br>銆銆瀹冩寚紺烘帶鍒跺垎媧懼櫒璋冪敤 ControlHandler 鍑芥暟澶勭悊 SCM 鎺у埗璇鋒眰銆傛敞鍐屽畬鎺у埗澶勭悊鍣ㄤ箣鍚庯紝鑾峰緱鐘舵佸彞鏌勶紙hStatus錛夈傞氳繃璋冪敤 SetServiceStatus 鍑芥暟錛岀敤 hStatus 鍚?SCM 鎶ュ憡鏈嶅姟鐨勭姸鎬併?br>Listing 1 灞曠ず浜嗗浣曟寚瀹氭湇鍔$壒寰佸拰鍏跺綋鍓嶇姸鎬佹潵鍒濆鍖?ServiceStatus 緇撴瀯錛孲erviceStatus 緇撴瀯鐨勬瘡涓煙閮芥湁鍏剁敤閫旓細
銆銆璋冪敤 SetServiceStatus 鍑芥暟鍚?SCM 鎶ュ憡鏈嶅姟鐨勭姸鎬佹椂銆傝鎻愪緵 hStatus 鍙ユ焺鍜?ServiceStatus 緇撴瀯銆傛敞鎰?ServiceStatus 涓涓叏灞鍙橀噺錛屾墍浠ヤ綘鍙互璺ㄥ涓嚱鏁頒嬌鐢ㄥ畠銆係erviceMain 鍑芥暟涓紝浣犵粰緇撴瀯鐨勫嚑涓煙璧嬪鹼紝瀹冧滑鍦ㄦ湇鍔¤繍琛岀殑鏁翠釜榪囩▼涓兘淇濇寔涓嶅彉錛屾瘮濡傦細dwServiceType銆?br>銆銆鍦ㄦ姤鍛婁簡鏈嶅姟鐘舵佷箣鍚庯紝浣犲彲浠ヨ皟鐢?InitService 鍑芥暟鏉ュ畬鎴愬垵濮嬪寲銆傝繖涓嚱鏁板彧鏄坊鍔犱竴涓鏄庢у瓧絎︿覆鍒版棩蹇楁枃浠躲傚涓嬮潰浠g爜鎵紺猴細
// 鏈嶅姟鍒濆鍖?
int InitService()
{
int result;
result = WriteToLog("Monitoring started.");
return(result);
}
銆銆鍦?ServiceMain 涓紝媯鏌?InitService 鍑芥暟鐨勮繑鍥炲箋傚鏋滃垵濮嬪寲鏈夐敊錛堝洜涓烘湁鍙兘鍐欐棩蹇楁枃浠跺け璐ワ級錛屽垯灝嗘湇鍔$姸鎬佺疆涓虹粓姝㈠茍閫鍑?ServiceMain錛?/p>
error = InitService();
if (error)
{
// 鍒濆鍖栧け璐ワ紝緇堟鏈嶅姟
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus, &ServiceStatus);
// 閫鍑?ServiceMain
return;
}
濡傛灉鍒濆鍖栨垚鍔燂紝鍒欏悜 SCM 鎶ュ憡鐘舵侊細
// 鍚?SCM 鎶ュ憡榪愯鐘舵?
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);
鎺ョ潃錛屽惎鍔ㄥ伐浣滃驚鐜傛瘡浜旂閽熸煡璇竴涓彲鐢ㄧ墿鐞嗗唴瀛樺茍灝嗙粨鏋滃啓鍏ユ棩蹇楁枃浠躲?br>
濡?Listing 1 鎵紺猴紝寰幆涓鐩村埌鏈嶅姟鐨勭姸鎬佷負 SERVICE_RUNNING 鎴栨棩蹇楁枃浠跺啓鍏ュ嚭閿欎負姝€傜姸鎬佸彲鑳藉湪 ControlHandler 鍑芥暟鍝嶅簲 SCM 鎺у埗璇鋒眰鏃朵慨鏀廣?br>
絎笁姝ワ細澶勭悊鎺у埗璇鋒眰
銆銆鍦ㄧ浜屾涓紝浣犵敤 ServiceMain 鍑芥暟娉ㄥ唽浜嗘帶鍒跺鐞嗗櫒鍑芥暟銆傛帶鍒跺鐞嗗櫒涓庡鐞嗗悇縐?Windows 娑堟伅鐨勭獥鍙e洖璋冨嚱鏁伴潪甯哥被浼箋傚畠媯鏌?SCM 鍙戦佷簡浠涔堣姹傚茍閲囧彇鐩稿簲琛屽姩銆?br>銆銆姣忔浣犺皟鐢?SetServiceStatus 鍑芥暟鐨勬椂鍊欙紝蹇呴』鎸囧畾鏈嶅姟鎺ユ敹 STOP 鍜?SHUTDOWN 璇鋒眰銆?a target=_blank>Listing 2 紺鴻寖浜嗗浣曞湪 ControlHandler 鍑芥暟涓鐞嗗畠浠?br>銆銆STOP 璇鋒眰鏄?SCM 緇堟鏈嶅姟鐨勬椂鍊欏彂閫佺殑銆備緥濡傦紝濡傛灉鐢ㄦ埛鍦?#8220;鏈嶅姟”鎺у埗闈㈡澘涓墜鍔ㄧ粓姝㈡湇鍔°係HUTDOWN 璇鋒眰鏄叧闂満鍣ㄦ椂錛岀敱 SCM 鍙戦佺粰鎵鏈夎繍琛屼腑鏈嶅姟鐨勮姹傘備袱縐嶆儏鍐電殑澶勭悊鏂瑰紡鐩稿悓錛?/p>
銆銆鐢變簬 ServiceStatus 緇撴瀯瀵逛簬鏁翠釜紼嬪簭鑰岃█涓哄叏灞閲忥紝ServiceStatus 涓殑宸ヤ綔寰幆鍦ㄥ綋鍓嶇姸鎬佹敼鍙樻垨鏈嶅姟緇堟鍚庡仠姝€傚叾瀹冪殑鎺у埗璇鋒眰濡傦細PAUSE 鍜?CONTINUE 鍦ㄦ湰鏂囩殑渚嬪瓙娌℃湁澶勭悊銆?br>銆銆鎺у埗澶勭悊鍣ㄥ嚱鏁板繀欏繪姤鍛婃湇鍔$姸鎬侊紝鍗充究 SCM 姣忔鍙戦佹帶鍒惰姹傜殑鏃跺欑姸鎬佷繚鎸佺浉鍚屻傚洜姝わ紝涓嶇鍝嶅簲浠涔堣姹傦紝閮借璋冪敤 SetServiceStatus銆?br>
鍥句竴 鏄劇ず MemoryStatus 鏈嶅姟鐨勬湇鍔℃帶鍒墮潰鏉?br>
絎洓姝ワ細瀹夎鍜岄厤緗湇鍔?/strong>
銆銆紼嬪簭緙栧ソ浜嗭紝灝嗕箣緙栬瘧鎴?exe 鏂囦歡銆傛湰鏂囦緥瀛愬垱寤虹殑鏂囦歡鍙?MemoryStatus.exe錛屽皢瀹冩嫹璐濆埌 C:\MyServices 鏂囦歡澶廣備負浜嗗湪鏈哄櫒涓婂畨瑁呰繖涓湇鍔★紝闇瑕佺敤 SC.EXE 鍙墽琛屾枃浠訛紝瀹冩槸 Win32 Platform SDK 涓檮甯︾殑涓涓伐鍏楓傦紙璇戣呮敞錛歏isaul Studio .NET 2003 IDE 鐜涓篃鏈夎繖涓伐鍏鳳紝鍏蜂綋瀛樻斁浣嶇疆鍦細C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin\winnt錛夈備嬌鐢ㄨ繖涓疄鐢ㄥ伐鍏峰彲浠ュ畨瑁呭拰縐婚櫎鏈嶅姟銆傚叾瀹冩帶鍒舵搷浣滃皢閫氳繃鏈嶅姟鎺у埗闈㈡澘鏉ュ畬鎴愩備互涓嬫槸鐢ㄥ懡浠よ瀹夎 MemoryStatus 鏈嶅姟鐨勬柟娉曪細
sc create MemoryStatus binpath= c:\MyServices\MemoryStatus.exe
銆銆鍙戝嚭姝ゅ垱寤哄懡浠ゃ傛寚瀹氭湇鍔″悕鍜屼簩榪涘埗鏂囦歡鐨勮礬寰勶紙娉ㄦ剰 binpath= 鍜岃礬寰勪箣闂寸殑閭d釜絀烘牸錛夈傚畨瑁呮垚鍔熷悗錛屼究鍙互鐢ㄦ湇鍔℃帶鍒墮潰鏉挎潵鎺у埗榪欎釜鏈嶅姟錛堝弬瑙佸浘涓錛夈傜敤鎺у埗闈㈡澘鐨勫伐鍏鋒爮鍚姩鍜岀粓姝㈣繖涓湇鍔°?br>
鍥句簩 MemoryStatus 鏈嶅姟鐨勫睘鎬х獥鍙?br>
銆銆MemoryStatus 鐨勫惎鍔ㄧ被鍨嬫槸鎵嬪姩錛屼篃灝辨槸璇存牴鎹渶瑕佹潵鍚姩榪欎釜鏈嶅姟銆傚彸閿崟鍑昏鏈嶅姟錛岀劧鍚庨夋嫨涓婁笅鏂囪彍鍗曚腑鐨?#8220;灞炴?#8221;鑿滃崟欏癸紝姝ゆ椂鏄劇ず璇ユ湇鍔$殑灞炴х獥鍙c傚湪榪欓噷鍙互淇敼鍚姩綾誨瀷浠ュ強鍏跺畠璁劇疆銆備綘榪樺彲浠ヤ粠“甯歌”鏍囩涓惎鍔?鍋滄鏈嶅姟銆備互涓嬫槸浠庣郴緇熶腑縐婚櫎鏈嶅姟鐨勬柟娉曪細
sc delete MemoryStatus
鎸囧畾 “delete” 閫夐」鍜屾湇鍔″悕銆傛鏈嶅姟灝嗚鏍囪涓哄垹闄わ紝涓嬫瑗塊氶噸鍚悗錛岃鏈嶅姟灝嗚瀹屽叏縐婚櫎銆?br>
絎簲姝ワ細嫻嬭瘯鏈嶅姟
銆銆浠庢湇鍔℃帶鍒墮潰鏉垮惎鍔?MemoryStatus 鏈嶅姟銆傚鏋滃垵濮嬪寲涓嶅嚭閿欙紝琛ㄧず鍚姩鎴愬姛銆傝繃涓浼氬効灝嗘湇鍔″仠姝€傛鏌ヤ竴涓?C:\MyServices 鏂囦歡澶逛腑 memstatus.txt 鏂囦歡鐨勬湇鍔¤緭鍑恒傚湪鎴戠殑鏈哄櫒涓婅緭鍑烘槸榪欐牱鐨勶細
Monitoring started.
273469440
273379328
273133568
273084416
Monitoring stopped.
銆銆涓轟簡嫻嬭瘯 MemoryStatus 鏈嶅姟鍦ㄥ嚭閿欐儏鍐典笅鐨勮涓猴紝鍙互灝?memstatus.txt 鏂囦歡璁劇疆鎴愬彧璇匯傝繖鏍蜂竴鏉ワ紝鏈嶅姟搴旇鏃犳硶鍚姩銆?br>銆銆鍘繪帀鍙灞炴э紝鍚姩鏈嶅姟錛屽湪灝嗘枃浠惰鎴愬彧璇匯傛湇鍔″皢鍋滄鎵ц錛屽洜涓烘鏃舵棩蹇楁枃浠跺啓鍏ュけ璐ャ傚鏋滀綘鏇存柊鏈嶅姟鎺у埗闈㈡澘鐨勫唴瀹癸紝浼氬彂鐜版湇鍔$姸鎬佹槸宸茬粡鍋滄銆?br>
寮鍙戞洿澶ф洿濂界殑鏈嶅姟紼嬪簭
銆銆鐞嗚В Win32 鏈嶅姟鐨勫熀鏈蹇碉紝浣夸綘鑳芥洿濂藉湴鐢?C++ 鏉ヨ璁″寘瑁呯被銆傚寘瑁呯被闅愯棌浜嗗搴曞眰 Win32 鍑芥暟鐨勮皟鐢ㄥ茍鎻愪緵浜嗕竴縐嶈垝閫傜殑閫氱敤鎺ュ彛銆備慨鏀?MemoryStatus 紼嬪簭浠g爜錛屽垱寤烘弧瓚寵嚜宸遍渶瑕佺殑鏈嶅姟錛佷負浜嗗疄鐜版瘮鏈枃渚嬪瓙鎵紺鴻寖鐨勬洿澶嶆潅鐨勪換鍔★紝浣犲彲浠ュ垱寤哄綰跨▼鐨勬湇鍔★紝灝嗕綔涓氬垝鍒嗘垚鍑犱釜宸ヤ綔鑰呯嚎紼嬪茍浠?ServiceMain 鍑芥暟涓洃瑙嗗畠浠殑鎵ц銆?br>銆
浣滆呯畝浠?/strong>
ASSERT(m_OrgMenu.GetSafeHmenu()!=NULL);
SetMenu(&m_OrgMenu);
m_OrgMenu.Detach();
// You can use SaveBarState() in OnClose(),
// so remove the newly added toolbar entirely
// in order SaveBarState() not
// to save its state. That is why I used dynamic
// allocation
delete m_pwndFullScreenBar;
LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
style|=WS_CAPTION;
::SetWindowLong(m_hWnd,GWL_STYLE,style);
if(m_bToolBarWasVisible)
m_wndToolBar.ShowWindow(SW_SHOW);
if(m_bStatusBarWasVisible)
m_wndStatusBar.ShowWindow(SW_SHOW);
MoveWindow(&m_mainRect);
RecalcLayout();
CMDIChildWnd* pChild=MDIGetActive();
style=::GetWindowLong(pChild->m_hWnd,GWL_STYLE);
style|=WS_CAPTION;
::SetWindowLong(pChild->m_hWnd,GWL_STYLE,style);
// pchild can be NULL if the USER closed all the
// childs during Full Screen Mode:
if(pChild)
{
if(m_bChildMax)
MDIMaximize(pChild);
else MDIRestore(pChild);
}緇撳悎ACE澶х暐鐨勭湅浜?/span>POSA1錛?/span> POSA2銆?/span>
瀵硅璁℃ā寮忕殑鐞嗚В榪樻槸寰堣偆嫻咃紝 紿佺劧鎯蟲繁鍏ュ湴瀛︿範璁捐妯″紡錛?/span> 瀵規瘡涓縐嶆ā寮?/span>
閮借緟鍔╃浉鍏崇殑code鏉ョ悊瑙o紝 騫舵妸璁捐妯″紡鍜?/span>MFC錛?/span> ACE錛?/span> cppunit絳夋鏋惰仈緋昏搗鏉ワ紝
鏇村ソ鍦扮悊瑙e拰搴旂敤榪欎簺緙栫▼鐨勬鏋訛紙榪樻湁log4plus絳夛級
浠婂ぉ鎬葷粨涓涓嬬畝鍗曠殑鍗曚歡妯″紡錛?/span>
Singleton(鍗曚歡)鈥斺斿璞″垱寤哄瀷妯″紡
淇濊瘉涓涓被浠呮湁涓涓疄渚嬶紝騫舵彁渚涗竴涓闂畠鐨勫叏灞璁塊棶鐐廣?span lang=EN-US>
1·鍏稿瀷Singleton綾?/span>錛?span lang=EN-US>
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
};
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance()
{
if(_instance == 0)
{
_instance = new Singleton;
}
return _instance;
}
瀹㈡埛浠呴氳繃Instance鎴愬憳鍑芥暟璁塊棶榪欎釜鍗曚歡銆傚彉閲?/span>_instance鍒濆鍖栦負0錛岃岄潤鎬佹垚鍛樺嚱鏁?/span>Instance榪斿洖璇ュ彉閲忓箋傛敞鎰忥細鏋勯犲櫒鏄繚鎶ゅ瀷鐨勶紝淇濊瘉浜嗕粎鏈変竴涓疄渚嬭鍒涘緩銆?span lang=EN-US>
榪欑鏂瑰紡鐨勫疄鐜板浜庣嚎紼嬫潵璇村茍涓嶆槸瀹夊叏鐨勶紝鍥犱負鍦ㄥ綰跨▼鐨勭幆澧冧笅鏈夊彲鑳藉緱鍒?/span>Singleton綾葷殑澶氫釜瀹炰緥銆傚鏋滃悓鏃舵湁涓や釜綰跨▼鍘誨垽鏂紙_instance == null錛夛紝騫朵笖寰楀埌鐨勭粨鏋滀負鐪燂紝榪欐椂涓や釜綰跨▼閮戒細鍒涘緩綾?/span>Singleton鐨勫疄渚嬶紝榪欐牱灝辮繚鑳屼簡Singleton妯″紡鐨勫師鍒欍傚疄闄呬笂鍦ㄤ笂榪頒唬鐮佷腑錛屾湁鍙兘鍦ㄨ綆楀嚭琛ㄨ揪寮忕殑鍊間箣鍓嶏紝瀵硅薄瀹炰緥宸茬粡琚垱寤猴紝浣嗘槸鍐呭瓨妯″瀷騫朵笉鑳戒繚璇佸璞″疄渚嬪湪絎簩涓嚎紼嬪垱寤轟箣鍓嶈鍙戠幇銆?/span>
璇ュ疄鐜版柟寮忎富瑕佹湁涓や釜浼樼偣錛?#183;鐢變簬瀹炰緥鏄湪 Instance 灞炴ф柟娉曞唴閮ㄥ垱寤虹殑錛屽洜姝ょ被鍙互浣跨敤闄勫姞鍔熻兘錛堜緥濡傦紝瀵瑰瓙綾昏繘琛屽疄渚嬪寲錛夛紝鍗充嬌瀹冨彲鑳藉紩鍏ヤ笉鎯寵鐨勪緷璧栨с?#183; 鐩村埌瀵硅薄瑕佹眰浜х敓涓涓疄渚嬫墠鎵ц瀹炰緥鍖栵紱榪欑鏂規硶縐頒負“鎯版у疄渚嬪寲”銆傛儼鎬у疄渚嬪寲閬垮厤浜嗗湪搴旂敤紼嬪簭鍚姩鏃跺疄渚嬪寲涓嶅繀瑕佺殑 singleton
2·綰跨▼瀹夊叏鐨?/span>singleton
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
static Cmutext _mutex;
};
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance()
{
_mutex.acque();
if(_instance == 0)
{
_instance = new Singleton;
}
_mutex.release();
return _instance;
}

榪欑鏂瑰紡鐨勫疄鐜板浜庣嚎紼嬫潵璇存槸瀹夊叏鐨勩傛垜浠鍏堝垱寤轟簡涓涓繘紼嬭緟鍔╁璞★紝綰跨▼鍦ㄨ繘鍏ユ椂鍏堝杈呭姪瀵硅薄鍔犻攣鐒跺悗鍐嶆嫻嬪璞℃槸鍚﹁鍒涘緩錛岃繖鏍峰彲浠ョ‘淇濆彧鏈変竴涓疄渚嬭鍒涘緩錛屽洜涓哄湪鍚屼竴涓椂鍒誨姞浜嗛攣鐨勯偅閮ㄥ垎紼嬪簭鍙湁涓涓嚎紼嬪彲浠ヨ繘鍏ャ傝繖縐嶆儏鍐典笅錛屽璞″疄渚嬬敱鏈鍏堣繘鍏ョ殑閭d釜綰跨▼鍒涘緩錛屽悗鏉ョ殑綰跨▼鍦ㄨ繘鍏ユ椂錛?/span>_instence == null錛変負鍋囷紝涓嶄細鍐嶅幓鍒涘緩瀵硅薄瀹炰緥浜嗐備絾鏄繖縐嶅疄鐜版柟寮忓鍔犱簡棰濆鐨勫紑閿錛屾崯澶變簡鎬ц兘銆?/span>
3錛庡弻閲嶉攣瀹?/span>
榪欑瀹炵幇鏂瑰紡瀵瑰綰跨▼鏉ヨ鏄畨鍏ㄧ殑錛屽悓鏃剁嚎紼嬩笉鏄瘡嬈¢兘鍔犻攣錛屽彧鏈夊垽鏂璞″疄渚嬫病鏈夎鍒涘緩鏃跺畠鎵嶅姞閿侊紝鏈変簡鎴戜滑涓婇潰絎竴閮ㄥ垎鐨勯噷闈㈢殑鍒嗘瀽錛屾垜浠煡閬擄紝鍔犻攣鍚庤繕寰楀啀榪涜瀵硅薄鏄惁宸茶鍒涘緩鐨勫垽鏂傚畠瑙e喅浜嗙嚎紼嬪茍鍙戦棶棰橈紝鍚屾椂閬垮厤鍦ㄦ瘡涓?/span> Instance 灞炴ф柟娉曠殑璋冪敤涓兘鍑虹幇鐙崰閿佸畾銆傚畠榪樺厑璁告偍灝嗗疄渚嬪寲寤惰繜鍒扮涓嬈¤闂璞℃椂鍙戠敓銆傚疄闄呬笂錛屽簲鐢ㄧ▼搴忓緢灝戦渶瑕佽繖縐嶇被鍨嬬殑瀹炵幇銆傚ぇ澶氭暟鎯呭喌涓嬫垜浠細鐢ㄩ潤鎬佸垵濮嬪寲銆傝繖縐嶆柟寮忎粛鐒舵湁寰堝緙虹偣錛氭棤娉曞疄鐜板歡榪熷垵濮嬪寲銆?br>
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
static CMutex _mutex;
};
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance()
{
if(_instance == 0)
{
_mutex.acque();
_instance = new Singleton;
_mutex.release
}
return _instance;
}

瀹炵幇瑕佺偣
·Singleton妯″紡鏄檺鍒惰屼笉鏄敼榪涚被鐨勫垱寤恒?/span>
·Singleton綾諱腑鐨勫疄渚嬫瀯閫犲櫒鍙互璁劇疆涓?/span>Protected浠ュ厑璁稿瓙綾繪淳鐢熴?/span>
·Singleton妯″紡涓鑸笉瑕佹敮鎸?/span>Icloneable鎺ュ彛錛屽洜涓鴻繖鍙兘瀵艱嚧澶氫釜瀵硅薄瀹炰緥錛屼笌Singleton妯″紡鐨勫垵琛瘋繚鑳屻?/span>
· Singleton妯″紡涓鑸笉瑕佹敮鎸佸簭鍒楀寲錛岃繖涔熸湁鍙兘瀵艱嚧澶氫釜瀵硅薄瀹炰緥錛岃繖涔熶笌Singleton妯″紡鐨勫垵琛瘋繚鑳屻?/span>
· Singleton鍙冭檻浜嗗璞″垱寤虹殑綆$悊錛屾病鏈夎冭檻鍒伴攢姣佺殑綆$悊錛屽氨鏀寔鍨冨溇鍥炴敹鐨勫鉤鍙板拰瀵硅薄鐨勫紑閿鏉ヨ錛屾垜浠竴鑸病蹇呰瀵瑰叾閿姣佽繘琛岀壒孌婄殑綆$悊銆?/span>
·鐞嗚В鍜屾墿灞?/span>Singleton妯″紡鐨勬牳蹇冩槸“濡備綍鎺у埗鐢ㄦ埛浣跨敤new瀵逛竴涓被鐨勬瀯閫犲櫒鐨勪換鎰忚皟鐢?/span>”銆?/span>
鎬葷粨錛?/span> Singleton璁捐妯″紡鏄竴涓潪甯告湁鐢ㄧ殑鏈哄埗錛屽彲鐢ㄤ簬鍦ㄩ潰鍚戝璞$殑搴旂敤紼嬪簭涓彁渚涘崟涓闂偣銆?/span>
搴旇娉ㄦ剰鐨勫嚑鐐?/span>:
1,鎴戜滑涓嶅簲璇ユ潵搴忓垪鍖栧拰鍙嶅簭鍒楀寲鐢ㄥ崟浠舵ā寮忓疄鐜扮殑瀵硅薄,鍚﹀垯澶氭鍙嶅簭鍒楀寲鍒欏彲浠ュ垱寤哄鐨勫疄渚?/span>,榪欎笌鍗曚歡妯″紡鏄浉鐭涚浘鐨?/span>.
2,鎴戜滑涓嶅簲璇ュ厠闅嗙敤鍗曚歡妯″紡瀹炵幇鐨勫璞?/span>,鍚﹀垯澶氭鍏嬮殕鍒欏彲浠ュ垱寤哄鐨勫疄渚?/span>,榪欎笌鍗曚歡妯″紡鏄浉鐭涚浘鐨?/span>.
3,鍦ㄥ綰跨▼鐜涓嬌鐢ㄥ崟浠舵ā寮忔椂瑕佸皬蹇?/span>.
鍏充簬ACE涓崟浠舵ā寮?/span>ACE_Singleton鐨勮璁″拰搴旂敤鍙互鍙傝冧竴鍗氬弸鐨勬枃绔狅紝 鎰熻鍐欑殑寰堝ソ
http://blog.csdn.net/joise/archive/2006/09/29/1305849.aspx
鍙傝冪綉绔欙細http://www.oonumerics.org/blitz/
Blitz++ 鏄竴涓珮鏁堢巼鐨勬暟鍊艱綆楀嚱鏁板簱錛屽畠鐨勮璁$洰鐨勬槸甯屾湜寤虹珛涓濂楁棦鍏峰儚C++ 涓鏍鋒柟渚匡紝鍚屾椂鍙堟瘮Fortran閫熷害鏇村揩鐨勬暟鍊艱綆楃幆澧冦傞氬父錛岀敤C++鎵鍐欏嚭鐨勬暟鍊肩▼搴忥紝姣?Fortran鎱?0%宸﹀彸錛屽洜姝litz++姝f槸瑕佹敼鎺夎繖涓己鐐廣傛柟娉曟槸鍒╃敤C++鐨則emplate鎶鏈紝紼嬪簭鎵ц鐢氳嚦鍙互姣擣ortran鏇村揩銆侭litz++鐩墠浠嶅湪鍙戝睍涓紝瀵逛簬甯歌鐨凷VD錛孎FTs錛孮MRES絳夊父瑙佺殑綰挎т唬鏁版柟娉曞茍涓嶆彁渚涳紝涓嶈繃浣跨敤鑰呭彲浠ュ緢瀹規槗鍦板埄鐢˙litz++鎵鎻愪緵鐨勫嚱鏁版潵鏋勫緩銆?
POOMA
POOMA鏄竴涓厤璐圭殑楂樻ц兘鐨凜++搴擄紝鐢ㄤ簬澶勭悊騫惰寮忕瀛﹁綆椼侾OOMA鐨勯潰鍚戝璞¤璁℃柟渚夸簡蹇熺殑紼嬪簭寮鍙戯紝瀵瑰茍琛屾満鍣ㄨ繘琛屼簡浼樺寲浠ヨ揪鍒版渶楂樼殑鏁堢巼錛屾柟渚垮湪宸ヤ笟鍜岀爺絀剁幆澧冧腑浣跨敤銆?
MTL
Matrix Template Library(MTL)鏄竴涓珮鎬ц兘鐨勬硾鍨嬬粍浠跺簱錛屾彁渚涗簡鍚勭鏍煎紡鐭╅樀鐨勫ぇ閲忕嚎鎬т唬鏁版柟闈㈢殑鍔熻兘銆傚湪鏌愪簺搴旂敤浣跨敤楂樻ц兘緙栬瘧鍣ㄧ殑鎯呭喌涓嬶紝姣斿Intel鐨勭紪璇戝櫒錛屼粠浜х敓鐨勬眹緙栦唬鐮佸彲浠ョ湅鍑哄叾涓庢墜鍐欏嚑涔庢病鏈変袱鏍風殑鏁堣兘銆?
CGAL
鍙傝冪綉绔欙細www.cgal.org
Computational Geometry Algorithms Library鐨勭洰鐨勬槸鎶婂湪璁$畻鍑犱綍鏂歸潰鐨勫ぇ閮ㄥ垎閲嶈鐨勮В鍐蟲柟妗堝拰鏂規硶浠++搴撶殑褰㈠紡鎻愪緵緇欏伐涓氬拰瀛︽湳鐣岀殑鐢ㄦ埛銆?
Thread 綰跨▼錛屽綋綰跨▼緇撴潫鏃訛紝綰跨▼瀵硅薄鍗寵嬋鍙戙傚綋綰跨▼榪樺湪榪涜鏃訛紝鍒欏璞″浜庢湭嬋鍙戠姸鎬併?/span>
Process 榪涚▼錛屽綋榪涚▼緇撴潫鏃訛紝榪涚▼瀵硅薄鍗寵嬋鍙戙傚綋榪涚▼榪樺湪榪涜鏃訛紝鍒欏璞″浜庢湭嬋鍙戠姸鎬併?/span>
Change Notification 錛屽綋涓涓壒瀹氱殑紓佺洏瀛愮洰褰曚腑鍙戠敓涓浠剁壒鍒殑鍙樺寲鏃訛紝姝ゅ璞″嵆琚縺鍙戙傛瀵硅薄緋葷敱 FindFirstChangeNotification() 浜х敓
Console Input 錛屽綋 console 紿楀彛鐨勮緭鍏ョ紦鍐插尯涓湁鏁版嵁鍙敤鏃訛紝姝ゅ璞″皢澶勪簬嬋鍙戠姸鎬併?/span> CreateFile 錛堬級鍜?/span> GetStdFile 錛堬級涓ゅ嚱鏁板彲浠ヨ幏寰?/span> console handle 銆?/span>
Event 錛?/span> Event 瀵硅薄鐨勭姸鎬佺洿鎺ュ彈鎺т簬搴旂敤紼嬪簭鎵浣跨敤鐨勪笁涓?/span> Win32 鍑芥暟錛?/span> SetEvent 錛堬級錛?/span> PulseEvent 錛堬級錛?/span> ResetEvent 錛堬級銆?/span> CreateEvent 錛堬級鍜?/span> OpenEvent 錛堬級閮藉彲浠ヤ紶鍥炰竴涓?/span> event object handle 銆?/span> Event 瀵硅薄鐨勭姸鎬佷篃鍙互琚搷浣滅郴緇熻瀹氣斺斿鏋滀嬌鐢ㄤ簬“ overlapped ”鎿嶄綔鏃躲?/span>
Mutex 錛屽鏋?/span> mutex 娌℃湁琚換浣曠嚎紼嬫嫢鏈夛紝浠栧氨鏄浜庢縺鍙戠姸鎬併備竴鏃︿竴涓瓑寰?/span> mutex 鐨勫嚱鏁拌繑鍥炰簡錛?/span> mutex 涔熷氨鑷姩閲嶇疆涓烘湭嬋鍙戠姸鎬併?/span> CreateMutex 錛堬級鍜?/span> OpenMutex 錛堬級閮藉彲浠ヨ幏寰椾竴涓?/span> Mutext 鐨?/span> handle 銆?/span>
Semaphore 錛?/span> Semaphore 鏈夌偣鍍?/span> mutex 錛屼絾浠栨湁涓鏁板櫒錛屽彲浠ョ害鏉熷叾鎷ユ湁鑰咃紙綰跨▼錛夌殑涓暟銆傚綋璁℃暟鍣ㄥ唴瀹瑰ぇ浜?/span> 0 鏃訛紝 semaphore 澶勪簬嬋鍙戠姸鎬侊紝褰撹鏁板櫒鍐呭絳変簬 0 鏃訛紝 semaphore 澶勪簬鏈縺鍙戠姸鎬併?/span> CreateSemaphore 錛堬級鍜?/span> OpenSemaphore 錛堬級鍙互浼犲洖涓涓?/span> semaphore handle 銆?/span>
浠?鍒癗(100000)涓換鎰忔嬁鎺変袱涓暟錛屾妸鍓╀笅鐨?9998涓暟欏哄簭鎵撲貢錛屽茍涓旀斁鍏ユ暟緇凙涓傝姹傚彧鎵弿涓閬嶆暟緇勶紝鎶婅繖涓や釜鏁版壘鍑烘潵銆傚彲浠ヤ嬌鐢ㄦ渶鍒頒笉瓚呰繃5涓眬閮ㄥ彉閲忥紝涓嶈兘鐢ㄦ暟緇勫彉閲忥紝騫朵笖涓嶈兘鏀瑰彉鍘熸暟緇勭殑鍊箋?br />
聽聽聽聽聽聽聽 鍦ㄥ嚱鏁扮殑澹版槑涓敤鏁扮粍鐨勫紩鐢ㄥ畾涔夛紝灝變笉鎬曟暟緇勯鍖栦簡銆傚涓?br />聽聽聽聽聽聽聽 for_each( int (&int_ref)[10] )
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 for( int i=0; i<10; ++i )
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 std::cout << int_ref[i] << std::endl;
聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽 int main( int argc, char* argv[] )
聽聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int int_array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 for_each( int_array );
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 return 0;
聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽 鍦ㄤ笂闈㈢殑浠g爜涓紝濡傛灉浣犱紶鍏ヤ笉鏄?0涓昂瀵哥殑鏁扮粍錛屾槸緙栬瘧閫氫笉榪囩殑銆備唬鐮佺殑瀹夊叏鎬ф彁楂樹簡銆偮犅?
聽聽聽聽聽聽聽聽 鎯寵瀹氫箟涓涓暟緇勫紩鐢ㄧ被鍨嬶紝鏂規硶濡備笅
聽聽聽聽聽聽聽聽 typedef 綾誨瀷鏄?(&鏁扮粍寮曠敤綾誨瀷鏄?[N];
聽聽聽聽聽聽聽聽 瀹炰緥
聽聽聽聽聽聽聽聽 typedef int (&Array_Ref)[10];
聽聽聽聽聽聽聽聽 Array_Ref灝辨槸涓涓暟緇勭殑寮曠敤綾誨瀷浜嗐?br />
鎴戜滑闇瑕佸仛鐨勬槸閫氳繃鎴戜滑鑷繁緙栧啓鐨勫簲鐢ㄧ▼搴忓幓鎷︽埅鍒漢鍐欏ソ鐨勫簲鐢ㄧ▼搴忔秷鎭紝瀹為檯涓婅繖鏄湪涓や釜榪涚▼涔嬮棿榪涜鐨勶紝闅懼害灝卞湪榪欓噷錛屽鏋滄槸鍚屼竴涓繘紼嬩粈涔堥兘濂藉姙錛屽彧瑕佸皢緋葷粺鍝嶅簲WINDOWS娑堟伅鐨勫鐞嗗嚱鏁頒慨鏀逛負鎴戜滑鑷繁緙栧啓鐨勫嚱鏁板氨鍙互錛屼絾鐜板湪涓嶈兘榪欎箞鍋氾紝鍥犱負涓や釜榪涚▼鏈夊悇鑷殑榪涚▼鍦板潃絀洪棿錛岀悊璁轟笂浣犳病鏈夊姙娉曠洿鎺ュ幓璁塊棶鍒殑榪涚▼鐨勫湴鍧絀洪棿錛岄偅涔堟庝箞鍔炴潵錛熷姙娉曡繕鏄緢澶氱殑錛岃繖閲屼粎浠呬粙緇嶉氳繃HOOK鏉ヨ揪鍒扮洰鐨勩?/p>
闇瑕佹嫤鎴埆鐨勫簲鐢ㄧ▼搴忕殑娑堟伅錛岄渶瑕佸埄鐢ㄥ皢鑷繁緙栧啓鐨凞LL娉ㄥ叆鍒板埆浜虹殑DLL鍦板潃絀洪棿涓墠鍙互杈懼埌鎷︽埅鍒漢娑堟伅鐨勭洰鐨勩傚彧鏈夊皢鎴戜滑鐨凞LL鎻掑叆鍒板埆鐨勫簲鐢ㄧ▼搴忕殑鍦板潃絀洪棿涓墠鑳藉瀵瑰埆鐨勫簲鐢ㄧ▼搴忚繘琛屾搷浣滐紝HOOK甯姪鎴戜滑瀹屾垚浜嗚繖浜涘伐浣滐紝鎴戜滑鍙渶瑕佷嬌鐢℉OOK鏉ユ嫤鎴寚瀹氱殑娑堟伅錛屽茍鎻愪緵蹇呰鐨勫鐞嗗嚱鏁板氨琛屼簡銆傛垜浠繖閲屼粙緇嶆嫤鎴湪MSN鑱婂ぉ瀵硅瘽妗嗕笂鐨勯紶鏍囨秷鎭紝瀵瑰簲鐨凥OOK綾誨瀷鏄疻H_MOUSE銆?/p>
棣栧厛鎴戜滑瑕佸緩绔嬩竴涓敤鏉OOK鐨凞LL銆傝繖涓狣LL鐨勫緩绔嬪拰鏅氱殑DLL寤虹珛娌℃湁浠涔堝叿浣撶殑鍖哄埆錛屼笉榪囨垜浠繖閲屾彁渚涚殑鏂規硶鏈夊啓涓嶅悓銆傝繖閲屼嬌鐢ㄩ殣寮忓鍏LL鐨勬柟娉曘備唬鐮佸涓嬶細
澶存枃浠?/p>
#pragma once
#ifndef MSNHOOK_API
#define MSNHOOK_API __declspec(dllimport)
#endif
MSNHOOK_API BOOL WINAPI SetMsnHook(DWORD dwThreadId);//瀹夎MSN閽╁瓙鍑芥暟
MSNHOOK_API void WINAPI GetText(int &x,int &y,char ** ptext);//瀹夎MSN閽╁瓙鍑芥暟
MSNHOOK_API HWND WINAPI GetMyHwnd();//瀹夎MSN閽╁瓙鍑芥暟
==================================================
DLL 鐨凜PP鏂囦歡
#include "stdafx.h"
#include "MSNHook.h"
#include <stdio.h>
// 涓嬮潰鍑犲彞鐨勫惈涔夋槸鍛婅瘔緙栬瘧鍣ㄥ皢鍚勫彉閲忔斁鍏ュ畠鑷繁鐨勬暟鎹叡浜妭涓?/p>
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
DWORD g_dwThreadIdMsn = 0;
POINT MouseLoc={0,0};
char text[256]={0};
HWND g_Hwnd = NULL;
#pragma data_seg()
//鍛婅瘔緙栬瘧鍣ㄨ緗叡浜妭鐨勮闂柟寮忎負錛氳錛屽啓錛屽叡浜?/p>
#pragma comment(linker,"/section:Shared,rws")
HINSTANCE g_hinstDll = NULL;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam);
BOOL WINAPI SetMsnHook(DWORD dwThreadId)
{
OutputDebugString("SetMsnHook");
BOOL fOK = FALSE;
if(dwThreadId != 0)
{
OutputDebugString("SetMsnHook dwThreadId != 0");
g_dwThreadIdMsn = GetCurrentThreadId();
//瀹夎WM_MOUSE閽╁瓙鍜屽鐞嗗嚱鏁癎etMsgProc
g_hhook = SetWindowsHookEx(WH_MOUSE,GetMsgProc,g_hinstDll,dwThreadId);
fOK = (g_hhook != NULL);
if(fOK)
{
fOK = PostThreadMessage(dwThreadId,WM_NULL,0,0);
}
else
{
fOK = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
}
return(fOK);
}
LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam)
{
char temp[20];
sprintf(temp,"%dn",nCode);
OutputDebugString("temp");
if (nCode==HC_ACTION)
{
MOUSEHOOKSTRUCT *l=(MOUSEHOOKSTRUCT *)lParam;
MouseLoc=l->pt; //閫侀紶鏍囦綅緗?br />
//char text[256] = "";
HWND hWnd = WindowFromPoint(l->pt);
if(hWnd)
{
//GetWindowText(hWnd,text,256);
SendMessage(hWnd,WM_GETTEXT,256,(LPARAM)(LPCTSTR)text);
// strcpy(text,"123455555");
SendMessage(hWnd,WM_SETTEXT,256,(LPARAM)(LPCTSTR)text);
g_Hwnd = hWnd;
}
//SendMessage(WindowFromPoint(l->pt),WM_GETTEXT,256,(LPARAM)(LPCTSTR)psw);
}
return(CallNextHookEx(g_hhook,nCode,wParam,lParam));
}
void WINAPI GetText(int &x,int &y,char ** ptext)
{
x = MouseLoc.x;
y = MouseLoc.y;
*ptext = text;
}
HWND WINAPI GetMyHwnd()
{
return g_Hwnd;
}
涓婇潰鏄鐞嗛挬瀛愮殑DLL浠g爜錛屼笅闈㈡垜浠璁╄繖涓狣LL璧蜂綔鐢ㄨ繕闇瑕佷竴涓惎鍔ㄩ儴鍒嗭紝閫氳繃榪欎釜鍚姩閮ㄥ垎鎴戜滑鎵嶈兘璁╂垜浠殑閽╁瓙鍑芥暟鐪熸鐨勬敞鍏ュ埌緋葷粺鍏朵粬鍑芥暟涓傛垜浠繖閲屼嬌鐢ㄤ釜瀵硅瘽妗嗙殑紼嬪簭錛岀▼搴忛潪甯哥畝鍗曪細涓涓寜閽敤鏉ュ惎鍔ㄩ挬瀛愶紝涓涓敤鏉ュ仠姝紝涓涓猅IMER鐢ㄦ潵鍒鋒柊鏄劇ず錛岃繕鏈変竴涓狤DITBOX鐢ㄦ潵鎺ュ彈淇℃伅銆?/p>
紼嬪簭濡備笅錛?/p>
//鍖呭惈DLL鍑芥暟瀵煎嚭鐨勫ご鏂囦歡
#include "MSNHook.h"
//闅愬紡瀵煎叆
#pragma comment(lib,"MSNHook.lib")
//澹版槑瀵煎叆鍑芥暟
__declspec(dllimport) BOOL WINAPI SetMsnHook(DWORD dwThreadId);
__declspec(dllimport) void WINAPI GetText(int &x,int &y,char ** ptext);
__declspec(dllimport) HWND WINAPI GetMyHwnd();//瀹夎MSN閽╁瓙鍑芥暟
void CTestMSNHookDlg::OnBnClickedOk()
{
//閫氳繃SPY++鍙互鐪嬪埌MSN鑱婂ぉ瀵硅瘽妗嗙獥鍙g被鏄疘MWindowClass錛岄氳繃榪欎釜寰楀埌璇ョ獥鍙e彞鏌?br />CWnd *pMsnWin = FindWindow(TEXT("IMWindowClass"),NULL);
if(pMsnWin == NULL) return ;
//閫氳繃紿楀彛鍙ユ焺寰楀埌瀵瑰簲鐨勭嚎紼嬬殑ID
SetMsnHook(GetWindowThreadProcessId(pMsnWin->GetSafeHwnd(),NULL));
MSG msg;
GetMessage(&msg,NULL,0,0);
SetTimer(101,100,NULL);
}
void CTestMSNHookDlg::OnTimer(UINT_PTR nIDEvent)
{
//鍒鋒柊娑堟伅
char * pText = NULL;
int x = 0,y = 0;
GetText(x,y,&pText);
if(x ==0 && y ==0) return ;
m_Edit.Format("%d:%d:%s",x,y,pText);
//m_Edit = pText;
UpdateData(FALSE);
HWND hWnd = GetMyHwnd();
CWnd * pWnd = CWnd::FromHandle(hWnd);
pWnd->GetWindowText(m_Edit);
CDialog::OnTimer(nIDEvent);
}
void CTestMSNHookDlg::OnBnClickedButton1()
{
//鍏抽棴
KillTimer(101);
SetMsnHook(0);
OnCancel();
}
濂戒簡錛屽熀鏈笂灝辮繖浜涗簡銆傝繖閲屾湁涓棶棰橈紝鎴戞湰鎯沖緱鍒癕SN鐢ㄦ埛鑱婂ぉ鏃惰緭鍏ョ殑鑱婂ぉ淇℃伅錛岃繖閲岄氳繃WM_GETTEXT娑堟伅鐨勪笉鍒幫紝濡傛灉鏈夌煡閬撶殑鏈嬪弸鍛婅瘔涓澹般?/p>