锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏂囨。涓婂氨璇存槑浜?jiǎn)锛孴inyXML鏄畬鍏ㄦ敮鎸乁TF-8鐨勶紝鍙互灝濊瘯load涓涓猆TF-8鏍煎紡鐨剎ml鏂囦歡錛屽畬鍏ㄦ病鏈夐棶棰橈紝閭g幇鍦ㄩ棶棰樻槸load浜?jiǎn)涓涓猆TF-8鏂囦歡鍚庯紝鏂囦歡涓殑瀛楃涓詫紝鍦═iXmlDocument瀵硅薄涓紝鍒板簳鏄粈涔堟牸寮忥紵TinyXML鍦╨oad瀹冧箣鍚庝細(xì)涓嶄細(xì)鐩存帴鎶奤TF-8鏍煎紡杞負(fù)Unicode鏍煎紡錛熲斺斾笉浼?xì)锛屼皋Z粈涔堬紵鍥犱負(fù)TinyXML鍦ㄧ紪鍐欑殑鏃跺欐槸鎶婅嚜宸卞畾浣嶄負(fù)涓涓瘮杈冨崟綰殑C++ Lib錛屽畠娌℃湁浣跨敤浠諱綍Windows鐩稿叧鐨凙PI錛屽寘鎷緢閲嶈鐨勪袱涓紪鐮佽漿鎹㈠嚱鏁癢ideCharToMultiByte鍜孧ultiByteToWideChar錛屽畠閮芥病鐢紝瀵逛笉鍚屽鉤鍙幫紝緙栫爜杞崲鍑芥暟鍙兘鏄笉鍚岀殑錛屽洜姝inyXML涓嶄細(xì)鐢昏泧娣昏凍鍦版彁渚涜繖涓漿鎹紝涔熷氨鏄錛屽鏋滀綘鐨剎ml鏂囦歡錛圲TF-8鏍煎紡錛変腑濡傛灉鏈変腑鏂囩殑璇濓紝鐢═inyXML鍔犺澆榪涙潵涔嬪悗錛屼緷鏃ф槸UTF-8鐨勶紝涓嶇粡榪囪漿鎹㈢洿鎺rint鍑烘潵鐨勮瘽錛屽氨鏄貢鐮佷簡(jiǎn)錛屾墍浠ヨ緇忚繃涓涓猆TF-8鍒癠nicode鐨勮漿鎹紝杞崲浠g爜鎴戣繖閲屽氨涓嶅啓浜?jiǎn)銆傚啀璇翠竴涓嬶紝TinyXML澹扮О瀵筓TF-8鐨勬敮鎸佽〃紺哄畠璁よ瘑UTF-8鐨剎ml鏂囦歡錛屼絾騫朵笉琛ㄧず瀹冭嚜鍔ㄥUTF-8鐨勬枃鏈繘琛岃漿鎹€?/p>
鍐欒繖涓▼搴忕殑鏃跺欏叾瀹炴垜鏄兂瑕佽繖涔堜竴縐嶅姞瀵嗘柟娉曪細(xì)鍋囧鏄庢枃鍙湁涓涓瓧鑺傦紝閭e姞瀵嗗嚭鏉ョ殑瀵嗘枃搴旇涔熷彧鏈変竴涓瓧鑺傘傝屽疄闄呬笂鍒漢瀹炵幇濂界殑AES綆楁硶鍔犲瘑鍑烘潵鐨勫瘑鏂囬氬父閮借甯︿笂涓涓查殢鏈烘暟錛屼笉澶鍚堟垜鐨勮姹傘?/p>
娌℃湁浠涔坕nclude錛屾病鏈変粈涔圠IB錛屾洿娌℃湁浠涔圖LL錛屼唬鐮佸啀綆鍗曚笉榪囷紝浣嗘垜淇濊瘉瀹冨緢鏈夋晥錛孫K錛屼笉澶氳浜?jiǎn)锛岀湅浠g爜锛?xì) 鍐欏畬浜?jiǎn)锛寴q愯緇撴灉鏄涓嬶細(xì) 241 206 235 249 4 160 190 73 253 196 48 49 50 51 52 53 54 55 56 57 涓婇潰榪欐鏄瘑鏂囷紝鐪嬭搗鏉ユ槸涓嶆槸瀹屽叏娌℃湁鍘熸枃鐨勬牱瀛愪簡(jiǎn)錛熶綘璇曡瘯鐪嬫妸TEST_LEN鏀逛負(fù)1錛屽彧鍔犲瘑涓涓瓧鑺傜湅錛岃繖涔熸槸鍏佽鐨勶紝浠g爜綰疌錛岀Щ妞嶆у緢濂斤紝鎷垮幓鍒鐢ㄤ篃鏂逛究銆備絾瀵瑰畨鍏ㄦц姹傞珮鐨勫簲鐢ㄥ彲鑳戒笉鑳戒嬌鐢ㄨ繖縐嶆柟娉曚簡(jiǎn)錛岃嚦浜庢庝箞鏍鋒墠綆楀畨鍏紝鎴戜篃涓嶇煡閬擄紝瀵嗙爜瀛︽柟闈㈢殑涓滆タ鎴戞渶瀹蟲(chóng)曚簡(jiǎn)銆?br>
1錛屾渶鏈鏈瑕佹敞鎰忕殑灝辨槸錛氬瀮鍦懼洖鏀舵満鍒?br />
C#娌℃湁delete錛屽叾鎵樼璧勬簮涓嶉渶瑕乨elete錛屼篃涓嶈兘鏄懼紡delete錛屽畬鍏ㄧ敱.net鐨勫瀮鍦懼洖鏀跺櫒鏉ョ鐞嗐?br />
紼嶅井鏈夌偣楹葷儲(chǔ)鐨勬槸闈炴墭綆¤祫婧愶紝姣斿鎵撳紑鐨勬枃浠跺彞鏌勶紝鍒涘緩鐨勪綅鍥懼彞鏌勭瓑錛岃繖浜涙槸闈炴墭綆¤祫婧愶紝濡傛灉涓鐩翠笉鏄懼紡鍥炴敹錛岄偅鏈夊彲鑳戒細(xì)瓚婃潵瓚婂錛岄偅鎬庝箞鍔烇紵榪欐柟闈㈢殑闂鍦ㄧ粷澶у鏁扮殑C#鐨勪功綾嶄笂閮芥湁璁茶堪錛屾湁鏃跺欑湅寰椾漢鏅曞ご杞悜鐨勶紝鍏跺疄鎴戜滑鍙閬靛驚榪欎箞涓縐嶈鑼冿紝灝卞彲浠ュ簲瀵逛笉璇?00%錛屼篃鏈?9%鐨勬儏鍐典簡(jiǎn)錛?br />
綾諱腑娌℃湁闈炴墭綆¤祫婧愮殑鎯呭喌涓嬶紝鍟ラ兘涓嶇敤綆★紝涔熶笉鐢ㄥ疄鐜版瀽鏋勫嚱鏁般?br />濡傛灉綾諱腑鏈夐潪鎵樼璧勬簮錛屽垯搴旇瀹炵幇鏋愭瀯鍑芥暟錛屽茍涓斿湪鏋愭瀯鍑芥暟涓噴鏀捐祫婧愩?br />濡傛灉綾諱腑鏈夐潪鎵樼璧勬簮錛屽茍涓旀兂璁╃被浣跨敤鑰呮彁鍓嶉噴鏀炬帀榪欎簺闈炴墭綆¤祫婧愮殑璇濓紝閭e氨瀹炵幇涓涓狣ispose鐨勬柟娉曟潵閲婃斁闈炴墭綆¤祫婧愶紝鍐嶅姞涓婅繖涔堜竴琛屼唬鐮丟C.SuppressFinalize(this);浠ユ鏉ュ憡璇?net鐨勫瀮鍦懼洖鏀跺櫒錛屼笉闇瑕佸啀璋冪敤涓嬈℃瀽鏋勫嚱鏁版潵閲婃斁闈炴墭綆¤祫婧愪簡(jiǎn)銆?br />
2錛屽?寮曠敤錛宻truct/class
C#鐨剆truct鍜宑lass宸埆寰堝ぇ錛屼笉鍍廋++閭f牱鍑犱箮娌′粈涔堝樊鍒紝struct閫傜敤浜庡垱寤哄皬鐨勭粨鏋勶紝瀹冧嬌鐢ㄧ殑鏄間紶閫掞紝鑰岀敤class鐨勫璞′嬌鐢ㄧ殑鏄紩鐢ㄤ紶閫掋?br />
鍊鹼紝瀛樺湪浜庢爤鍖猴紝鑰屽紩鐢紝鍒欏瓨鍦ㄤ簬鍫嗗尯銆?br />
struct錛氬瓨鍦ㄤ簬鏍堝尯錛屽彲鐢╪ew鍒濆鍖栵紙涔熷彲浠ヤ笉鐢級(jí)錛屾病鏈夐粯璁ゆ瀯閫犲嚱鏁幫紙浣嗗彲浠ユ坊鍔犳瀯閫犲嚱鏁幫紝涔熷彲浠ヤ笉娣誨姞錛夛紝娌℃瀽鏋勫嚱鏁幫紝涓嶈兘琚戶鎵褲?br />class錛氬瓨鍦ㄤ簬鍫嗗尯錛屽繀欏葷敤new鍒濆鍖栵紝鏈夐粯璁ゆ瀯閫犲嚱鏁幫紝鏈夋瀽鏋勫嚱鏁幫紝褰撶劧鑳借緇ф壙鍟︺?br />
3錛屾敞鎰忚綆卞拰鎷嗙
鍊煎拰寮曠敤鏈夋椂鍊欏緱浜掔浉杞崲錛屾瘮濡傚綋涓涓嚱鏁伴渶瑕佸紩鐢ㄥ弬鏁幫紝鑰屼綘鍗存妸鍊間紶浜?jiǎn)杩囧幓锛岄偅涔垶瀛樺湪杩欎箞涓涓殣寮忚漿鎹㈢殑榪囩▼浜?jiǎn)锛寴q欎釜榪囩▼浼?xì)鏈夐澶栫殑鎬ц兘寮閿錛屾墍浠ヨ灝介噺閬垮厤銆傚艱漿涓哄紩鐢ㄥ彨“瑁呯”錛屽弽榪囨潵寮曠敤杞負(fù)鍊煎彨“鎷嗙”銆傝綆卞彲浠ユ槸闅愬紡鐨勶紝浣嗘媶綆變竴瀹氭槸鏄懼紡鐨勶紝濡傦細(xì)
int i = 123;
object o = i; //瑁呯錛堥殣寮忥級(jí)
int j = (int) o; //鎷嗙錛堟樉寮忥級(jí)
4錛屽叾瀹冧竴浜涜娉曞樊鍒?br />
4.1 铏氭柟娉曞繀欏誨甫涓妎verride淇グ錛屽惁鍒欎細(xì)鏈墂arning銆?br />4.2 娌℃湁浜?jiǎn)C++鏋勯犲嚱鏁頒腑鐨?#8220;鍒濆鍖栧垪琛?#8221;銆?br />4.3 甯冨皵鍜屾暣鍨嬫槸涓ょ涓嶅悓綾誨瀷銆?br />4.4 switch璇彞鐨勮涓哄拰C++鐨勭暐鏈変笉鍚屻?br />
紼嬪簭姣忔鎬繪槸鍏堣Е鍒癢M_SIZE鐨勮繖涓柇鐐癸紝闅鵑亾鎴戠悊瑙d竴鐩存湁璇紵浜庢槸鎴戝垱寤轟簡(jiǎn)涓涓猦ello world紼嬪簭錛岃皟璇曚簡(jiǎn)鍗婂ぉ錛屽張鍙戣娌℃湁榪欎釜闂錛學(xué)M_CREATE鎬繪槸鍦╓M_SIZE涔嬪墠錛屾垜灝濊瘯鍦ㄥ埆澶勯噸鐜伴棶棰橈紝鏃犳灉……鐜板湪錛屼綘鍐嶄粩緇嗙湅涓涓嬩笂鍥撅紝浣犲彂鐜伴棶棰樹(shù)簡(jiǎn)涔堬紵
鎴戞兂緇忚繃鎴戣繖涔堟彁紺猴紝浣犲簲璇ョ煡閬撲簡(jiǎn)錛氬師鍥犲氨鏄疻M_CREATE榪欎釜鏂偣鍓嶄竴琛岀殑SetWindowLong榪欎釜璋冪敤錛岃繖涓皟鐢ㄤ細(xì)寮曡搗涓涓猈M_SIZE浜嬩歡錛屾墍浠ヨ繖灝卞埗閫犱簡(jiǎn)WM_SIZE鍦╓M_CREATE涔嬪墠榪欎釜鍋囪薄銆傚鐞嗚繖涓棶棰樺緢綆鍗曪紝鎶奡etWindowLong榪欒鎷挎帀錛岀劧鍚庢妸WS_NONAVDONEBUTTON榪欎釜灞炴т氦緇機(jī)reateWindow錛屽涓嬪浘錛?br>
榪欐牱灝卞ソ浜?jiǎn)锛屾垜鎯硻遛Z究鎻愪釜闂錛屾垜鍦ㄨ璁′竴涓▼搴忕殑鏃跺欙紝涔熺鍒頒簡(jiǎn)“甯冨眬”鍜?#8220;鍔犺澆”鐨勫厛鍚庨棶棰橈紝鍥犱負(fù)甯冨眬鍙兘闇瑕侀噸鏂拌皟鏁村姞杞界殑璧勬簮錛岃屽姞杞借祫婧愬張闇瑕佸弬鑰冨竷灞鐨勫昂瀵革紝鐢變簬鍔熻兘涓婄殑鍘熷洜錛屾垜蹇呴』鎶婁袱鑰呭垎寮錛屾墍浠ュ瓨鍦ㄦ垜鍓嶉潰璇寸殑榪欎釜鍏堥浮鍏堣泲鐨勯毦棰樸傛渶鍚庢垜鏄繖涔堝紕鐨勶紝鍋氫竴涓?#8220;璧勬簮鏄惁宸茬粡鍔犺澆”鐨勬爣蹇楋紝鐒跺悗鎬繪槸鍏?#8220;甯冨眬”錛屽竷灞鐨勬椂鍊欐鏌ヨ繖涓爣蹇楋紝濡傛灉娌℃湁璧勬簮鐨勫姞杞斤紝閭e氨鍙洿鏀瑰昂瀵稿弬鏁拌屼笉璋冩暣璧勬簮錛岃繖鏍風(fēng)湅璧鋒潵灝辨病浠涔堥棶棰樹(shù)簡(jiǎn)錛屼粠閫昏緫涓婃潵璇存垜鐨勮璁$‘瀹炴槸WM_SIZE浼樺厛浜嶹M_CREATE……
嬈㈣繋瀵硅繖浜涙柟闈㈢殑璁捐闂鐣欒█璁ㄨ銆?
This compiler switch doesn't do anything very profound. It really only sets a flag in the executable file that indicates how the program is to be loaded an run. If an executable is flagged as a Console Application and is started from Windows, the Windows operating system creates a Command Prompt window that launches the program and displays any console output from the program. If the console application is started from within the Command Prompt window, the MS-DOS promptdoesn't return until the program terminateds. If the executable is flagged as a Windows Application, no Command Prompt window is created. Any console output from the program goes into the bit bucket. If you start such a program from the Command Prompt window, the MS-DOS prompt appears again right after the program is launched. The point is this: nothing bad happens if you compile a Windows Forms application as a console application!
浣滆呬箣鍓嶆彁鍒扮殑緙栬瘧閫夐」鏄?target:exe鍜?target:winexe錛屽墠鑰呯敓鎴愭帶鍒跺彴紼嬪簭錛屽悗鑰呯敓鎴怶indows紼嬪簭錛岃繖鏄疌#鐨勭紪璇戝櫒錛岃孷C++鐨勮繛鎺ュ櫒鐨勯夐」鍗存湁浜涗笉鍚岋紝鐪嬭繖寮犲浘錛?br>
濡傛灉浣犲湪搴旂敤紼嬪簭鍚戝閲屾寚瀹氱殑鏄竴涓猈indows紼嬪簭錛岃屼綘鍚庢潵鍗村湪榪欎釜榪炴帴鍣ㄩ夐」閲岄夋嫨Console錛岄偅浼?xì)鎬庝箞鏍峰憿錛熲斺斾細(xì)榪炴帴澶辮觸錛佸洜涓篤C++榪炴帴鍣ㄨ涓篊onsole紼嬪簭鍜學(xué)indows紼嬪簭鐨勫叆鍙e嚱鏁版槸涓嶅悓錛岃繖鏍風(fēng)畝鍗曠殑涓鏀瑰畠浼?xì)鎵句笉鍒板叆鍙e嚱鏁板Q屾墍浠ヨ繛鎺ュけ璐ャ?br>
浣嗕笉綆¤繖鏍鳳紝閫氳繃Charles Petzold鐨勮繖孌墊弿榪幫紝鎴戜滑瀵笴onsole紼嬪簭鍜學(xué)indows紼嬪簭鐨勮璇嗗簲璇ユ槸娌′粈涔堥棶棰樹(shù)簡(jiǎn)錛屼袱鑰呭叾瀹炲茍娌℃湁浠涔堟牴鏈笉鍚岋紝鍙槸Windows鏍規(guī)嵁PE鏂囦歡涓殑鏍囪瘑錛岀敤紼嶅井涓嶅悓鐨勬柟娉曟潵榪愯榪欎袱縐嶇▼搴忚屽凡銆?br>
BTW錛歐indows紼嬪簭鍙互鍒涘緩鑷繁鐨勬帶鍒跺彴錛堝弬鑰傾llocConsole絳堿PI錛夛紝鎺у埗鍙扮▼搴忎篃鍙互鍒涘緩紿楀彛銆?/p>
{
int a=1;
int b=0;
int c=a/b;
}
catch()
{
printf("Ignore that error and continue to work!\n");
}
{
int a=1;
int b=0;
int c=a/b;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Ignore that error and continue to work!\n");
}
{
int* p = NULL;
*p = 10;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Exception[%0X] occured!\n", GetExceptionCode());
}
{
BOOL rtn = Foo1();
if(!rtn)
__leave;
rtn = Foo2();
if(!rtn)
__leave;
//Blah Blah Blah
}
__finally
{
//Do some job to release the resources.
}
INT iLen = lstrlen(p);
TCHAR szBuff[10];
lstrcpy(szBuff, p);
浣跨敤鏂扮殑瀹夊叏瀛楃涓插嚱鏁頒箣鍚庯紝涓婇潰鐨勯兘涓嶆槸闂?shù)簡(jiǎn)锛屽叧浜庡畨鍏ㄥ瓧绗︿覆鍑芥晭图屾妧鏈粏鑺傝繕鏄緢澶氱殑錛屼絾鎴戜滑涓嶇敤綆¢偅涔堝錛屾垜浠彧闇瑕佸叧蹇?jī)鎴戜滑鐢ㄥ緱鏈澶氱殑鍑犱釜灝卞彲浠ヤ簡(jiǎn)銆?br>
鏃у嚱鏁?/td>
鏂板嚱鏁幫紙瀛楃錛?/td>
鏂板嚱鏁幫紙瀛楄妭錛?/td>
lstrlen
StringCchLength
StringCbLength
lstrcpy
StringCchCopy
StringCbCopy
lstrcat
StringCchCat
StringCbCat
wsprintf
StringCchPrintf
StringCbPrintf
浣犱細(xì)鍙戠幇錛屼竴涓棫鐨勫嚱鏁板搴斾簡(jiǎn)涓や釜鏂扮殑鍑芥暟錛岀悊瑙h繖涓茍涓嶉毦錛屽洜涓烘柊鐨勫嚱鏁板ぇ澶氶渶瑕佷綘鎸囧畾涓涓?#8220;鏈闀塊暱搴?#8221;錛岄偅榪欎釜闀垮害絀剁珶鎸囩殑鏄瓧絎︽暟鐩繕鏄瓧鑺傞暱搴﹀憿錛熷鏋滄寚鐨勬槸瀛楃鏁扮洰鐨勮瘽錛岄偅灝辯敤Cch緋誨垪鐨勶紝鍚﹀垯灝辯敤Cb緋誨垪鐨勩傚ソ鎴戜滑鏀逛竴涓嬩笂闈㈢殑浠g爜錛?br>
size_t iLen;
//We want to get the character number
StringCchLength(p, STRSAFE_MAX_CCH, &iLen);
TCHAR *p = TEXT("more than 10 characters.");
TCHAR szBuff[BUFFER_SIZE];
StringCchCopy(szBuff, BUFFER_SIZE, p);
//szBuff is "more than" now, it always ends with a '\0'
鏈鍚庯紝鍒繕?shù)簡(jiǎn)鋴社敤鐨勬椂鍊欏寘鍚玸trsafe.h澶存枃浠躲?
#define MYTRACE DbgStrOut
#else
#define MYTRACE
#endif
// My debug output function
void DbgStrOut(const TCHAR *fmt, );
)
{
TCHAR szOutStr[512];
va_list ap;
va_start(ap, fmt);
vswprintf(szOutStr, fmt, ap);
va_end(ap);
OutputDebugString(szOutStr);
}
using namespace std;
//鍋囪pData鎸囧悜浜?jiǎn)鍐呭瓨?shù)腑浣犳兂瑕佽漿鍙樹(shù)負(fù)嫻佺殑鏁版嵁
//iLen鏄暟鎹暱搴?/span>
strstreambuf buff(pData, iLen);
istream xmlStream(&buff);
//xmlStream涔熷氨鏄綘瑕佺殑嫻佷簡(jiǎn)
xmlStream>>xmldoc;
//鍔犲瘑鍜岃В瀵嗭紝鍏跺疄榪欎袱涓嚱鏁板畬鍏ㄧ浉鍚岀殑錛岀畝鍗曡搗瑙佸槢錛屽彟澶栨垜灞呯劧鍏佽瀵嗙爜涓虹┖錛屼篃鏄畝鍗曡搗瑙?/span>
void JiangEncode(unsigned char *pBuff, int iBuffLen, char *pKey=NULL, int iKeyLen=0);
void JiangDecode(unsigned char *pBuff, int iBuffLen, char *pKey=NULL, int iKeyLen=0);
//榪欎釜main鍑芥暟鏄敤鏉ユ祴璇曠殑
#define TEST_LEN 100
int main(int argc, char* argv[])
{
unsigned char totest[TEST_LEN];
memcpy(totest, "012345678901234567890123456789012345678901234567890123456789\
0123456789012345678901234567890123456789", 100);
JiangEncode(totest, TEST_LEN, "J~xye", 6);
int i;
for(i=0; i<TEST_LEN; i++)
{
if((i%10)==0)
printf("\n");
printf("%d ", totest[i]);
}
printf("\n");
JiangDecode(totest, TEST_LEN, "J~xye", 6);
for(i=0; i<TEST_LEN; i++)
{
if((i%10)==0)
printf("\n");
printf("%d ", totest[i]);
}
return 0;
}
//浜ゆ崲涓や釜BYTE
void Swap2Byte(unsigned char* v1, unsigned char* v2)
{
*v1 ^= *v2;
*v2 ^= *v1;
*v1 ^= *v2;
}
void GetMyCypher(const char* pKey, int iKeyLen, unsigned char* pMyCypher)
{
//鍘熷鍔犲瘑绱㈠紩
const unsigned char cypherOrg[256] =
{
1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53,
95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170,
229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49,
83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205,
76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136,
131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,
181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,
254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,
251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,
195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,
159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,
252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202,
69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14,
18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23,
57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1
};
memcpy(pMyCypher, cypherOrg, 256);
//鏍規(guī)嵁瀵嗙爜璋冩暣鍔犲瘑绱㈠紩
int i, j;
for(i=0; i<iKeyLen; i++)
{
for(j=0; j<256; j++)
{
int iSwitchIndex = (pMyCypher[j] * pKey[i])%255;
if(iSwitchIndex!=j)
Swap2Byte(&(pMyCypher[j]), &(pMyCypher[iSwitchIndex]));
}
}
}
void JiangCode(unsigned char* pBuff, int iBuffLen, char* pKey, int iKeyLen)
{
unsigned char cypher[256];
GetMyCypher(pKey, iKeyLen, cypher);
int iIndex=0;
while (iIndex<iBuffLen)
{
//鍏跺疄……涔熷氨涓涓紓鎴栨搷浣滐紝鎵浠ュ姞瀵嗗拰瑙e瘑鐨勮繃紼嬪畬鍏ㄤ竴鏍?/span>
pBuff[iIndex] ^= cypher[iIndex%256];
++iIndex;
}
}
void JiangEncode(unsigned char* pBuff, int iBuffLen, char* pKey, int iKeyLen)
{
JiangCode(pBuff, iBuffLen, pKey, iKeyLen);
}
void JiangDecode(unsigned char* pBuff, int iBuffLen, char* pKey, int iKeyLen)
{
JiangCode(pBuff, iBuffLen, pKey, iKeyLen);
}
160 238 105 243 18 190 10 97 26 66
182 218 99 73 40 204 208 123 196 46
76 208 117 159 38 66 234 117 142 52
66 63 135 193 60 49 228 15 12 58
131 252 1 171 96 72 254 198 171 201
110 242 27 189 199 108 136 12 177 215
88 66 156 183 221 142 27 45 61 221
122 158 39 174 123 112 156 241 77 227
112 148 57 67 225 30 47 49 83 94
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57
48 49 50 51 52 53 54 55 56 57 Press any key to continue
錛堝崥涓伙細(xì)姝や負(fù)杞澆鏂囩珷錛屽嚭澶勫凡緇忚涓嶆竻錛屽唴瀹規(guī)湁浜涙硾娉涜岃皥錛屼粎渚涘弬鑰冿級(jí)
涓銆佸鎴鋒満/鏈嶅姟鍣ㄦā寮?/span>
鍦═CP/IP緗戠粶涓袱涓繘紼嬮棿鐨勭浉浜掍綔鐢ㄧ殑涓繪満妯″紡鏄鎴鋒満/鏈嶅姟鍣ㄦā寮?Client/Server model)銆傝妯″紡鐨勫緩绔嬪熀浜庝互涓嬩袱鐐癸細(xì)
1銆侀潪瀵圭瓑浣滅敤錛?br>2銆侀氫俊瀹屽叏鏄紓姝ョ殑銆?br>瀹㈡埛鏈?鏈嶅姟鍣ㄦā寮忓湪鎿嶄綔榪囩▼涓噰鍙栫殑鏄富鍔ㄨ紺烘柟寮忋?/p>
鏈嶅姟鍣ㄦ柟瑕佸厛鍚姩錛屽茍鏍規(guī)嵁璇風(fēng)ず鎻愪緵鐩稿簲鏈嶅姟錛岃繃紼嬪涓嬶細(xì)
1銆佹墦寮涓閫氫俊閫氶亾騫跺憡鐭ユ湰鍦頒富鏈猴紝瀹冩効鎰忓湪鏌愪竴涓叕璁ゅ湴鍧涓婃帴鏀跺鎴瘋姹傘?br>2銆佺瓑寰呭鎴瘋姹傚埌杈捐绔彛銆?br>3銆佹帴鏀跺埌閲嶅鏈嶅姟璇鋒眰錛屽鐞嗚璇鋒眰騫跺彂閫佸簲絳斾俊鍙楓?br>4銆佽繑鍥炵浜屾錛岀瓑寰呭彟涓瀹㈡埛璇鋒眰
5銆佸叧闂湇鍔″櫒銆?/p>
鐒跺悗姝誨鎴鋒柟錛?br>1銆佹墦寮涓閫氫俊閫氶亾錛屽茍榪炴帴鍒版湇鍔″櫒鎵鍦ㄤ富鏈虹殑鐗瑰畾绔彛銆?br>2銆佸悜鏈嶅姟鍣ㄥ彂閫佹湇鍔¤姹傛姤鏂囷紝絳夊緟騫舵帴鏀跺簲絳旓紱緇х畫(huà)鎻愬嚭璇鋒眰……
3銆佽姹傜粨鏉熷悗鍏抽棴閫氫俊閫氶亾騫剁粓姝€?/p>
浜屻佸熀鏈鎺ュ瓧
涓轟簡(jiǎn)鏇村ソ璇存槑濂楁帴瀛楃紪紼嬪師鐞嗭紝緇欏嚭鍑犱釜鍩烘湰鐨勫鎺ュ瓧錛屽湪浠ュ悗鐨勭瘒騫呬腑浼?xì)缁欏嚭鏇磋缁嗙殑鋴社敤璇存槑銆?/p>
1銆佸垱寤哄鎺ュ瓧鈥斺攕ocket()
鍔熻兘錛氫嬌鐢ㄥ墠鍒涘緩涓涓柊鐨勫鎺ュ瓧
鏍煎紡錛歋OCKET PASCAL FAR socket(int af,int type,int procotol);
af: 閫氫俊鍙戠敓鐨勫尯鍩?br>type: 瑕佸緩绔嬬殑濂楁帴瀛楃被鍨?br>procotol: 浣跨敤鐨勭壒瀹氬崗璁?
2銆佹寚瀹氭湰鍦板湴鍧鈥斺攂ind()
鍔熻兘錛氬皢濂楁帴瀛楀湴鍧涓庢墍鍒涘緩鐨勫鎺ュ瓧鍙瘋仈緋昏搗鏉ャ?br>鏍煎紡錛歩nt PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);
s: 鏄敱socket()璋冪敤榪斿洖鐨勫茍涓旀湭浣滆繛鎺ョ殑濂楁帴瀛楁弿榪扮錛堝鎺ュ瓧鍙鳳級(jí)銆?br>鍏跺畠錛氭病鏈夐敊璇紝bind()榪斿洖0錛屽惁鍒橲OCKET_ERROR
鍦板潃緇撴瀯璇存槑錛?/p>
3銆佸緩绔嬪鎺ュ瓧榪炴帴鈥斺攃onnect()鍜宎ccept()
鍔熻兘錛氬叡鍚屽畬鎴愯繛鎺ュ伐浣?br>鏍煎紡錛歩nt PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);
鏍煎紡錛歋OCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);
(鍙傛暟鍚屼笂)
4銆佺洃鍚繛鎺モ斺攍isten()
鍔熻兘錛氱敤浜庨潰鍚戣繛鎺ユ湇鍔″櫒錛岃〃鏄庡畠鎰挎剰鎺ユ敹榪炴帴銆?br>鏍煎紡錛歩nt PASCAL FAR listen(SOCKET s, int backlog);
5銆佹暟鎹紶杈撯斺攕end()涓巖ecv()
鍔熻兘錛氭暟鎹殑鍙戦佷笌鎺ユ敹
鏍煎紡錛歩nt PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);
鏍煎紡錛歩nt PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);
buf:鎸囧悜瀛樻湁浼犺緭鏁版嵁鐨勭紦鍐插尯鐨勬寚閽堛?
6銆佸璺鐢ㄢ斺攕elect()
鍔熻兘錛氱敤鏉ユ嫻嬩竴涓垨澶氫釜濂楁帴瀛楃姸鎬併?br>鏍煎紡錛歩nt PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,
fd_set FAR * exceptfds,const struct timeval FAR * timeout);
readfds:鎸囧悜瑕佸仛璇繪嫻嬬殑鎸囬拡
writefds:鎸囧悜瑕佸仛鍐欐嫻嬬殑鎸囬拡
exceptfds:鎸囧悜瑕佹嫻嬫槸鍚﹀嚭閿欑殑鎸囬拡
timeout:鏈澶х瓑寰呮椂闂?/p>
7銆佸叧闂鎺ュ瓧鈥斺攃losesocket()
鍔熻兘錛氬叧闂鎺ュ瓧s
鏍煎紡錛欱OOL PASCAL FAR closesocket(SOCKET s);
涓夈佸吀鍨嬭繃紼嬪浘
2.1 闈㈠悜榪炴帴鐨勫鎺ュ瓧鐨勭郴緇熻皟鐢ㄦ椂搴忓浘
2.2 鏃犺繛鎺ュ崗璁殑濂楁帴瀛楄皟鐢ㄦ椂搴忓浘
2.3 闈㈠悜榪炴帴鐨勫簲鐢ㄧ▼搴忔祦紼嬪浘
鍥涖乄inSock綆浠?/strong>
Windows Sockets 鏄粠 Berkeley Sockets 鎵╁睍鑰屾潵鐨勶紝鍏跺湪緇ф壙 Berkeley Sockets 鐨勫熀紜涓婏紝鍙堣繘琛屼簡(jiǎn)鏂扮殑鎵╁厖銆傝繖浜涙墿鍏呬富瑕佹槸鎻愪緵浜?jiǎn)涓浜涘紓姝ュ嚱鏁幫紝騫跺鍔犱簡(jiǎn)絎﹀悎WINDOWS娑堟伅椹卞姩鐗規(guī)х殑緗戠粶浜嬩歡寮傛閫夋嫨鏈哄埗銆?/p>
Windows Sockets鐢變袱閮ㄥ垎緇勬垚錛氬紑鍙戠粍浠跺拰榪愯緇勪歡銆?br>寮鍙戠粍浠訛細(xì)Windows Sockets 瀹炵幇鏂囨。銆佸簲鐢ㄧ▼搴忔帴鍙?API)寮曞叆搴撳拰涓浜涘ご鏂囦歡銆?br>榪愯緇勪歡錛歐indows Sockets 搴旂敤紼嬪簭鎺ュ彛鐨勫姩鎬侀摼鎺ュ簱(WINSOCK.DLL)銆?
浜斻乄inSock涓昏鎵╁厖璇存槑
1銆佸紓姝ラ夋嫨鏈哄埗
Windows Sockets 鐨勫紓姝ラ夋嫨鍑芥暟鎻愪緵浜?jiǎn)娑堟伅鏈哄埗鐨劸|戠粶浜嬩歡閫夋嫨錛屽綋浣跨敤瀹冪櫥璁扮綉緇滀簨浠跺彂鐢熸椂錛屽簲鐢ㄧ▼搴忕浉搴旂獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭紝娑堟伅涓寚紺轟簡(jiǎn)鍙戠敓鐨勭綉緇滀簨浠訛紝浠ュ強(qiáng)涓庝簨浠剁浉鍏崇殑涓浜涗俊鎭俉indows Sockets 鎻愪緵浜?jiǎn)涓涓紓姝ラ夋嫨鍑芥暟 WSAAsyncSelect()錛岀敤瀹冩潵娉ㄥ唽搴旂敤紼嬪簭鎰熷叴瓚g殑緗戠粶浜嬩歡錛屽綋榪欎簺浜嬩歡鍙戠敓鏃訛紝搴旂敤紼嬪簭鐩稿簲鐨勭獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭?/p>
鍑芥暟緇撴瀯濡備笅錛?br>int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);
hWnd錛氱獥鍙e彞鏌?br>wMsg錛氶渶瑕佸彂閫佺殑娑堟伅
lEvent錛氫簨浠訛紙浠ヤ笅涓轟簨浠剁殑鍐呭錛?/p>
浜嬩歡鍊煎惈涔夛細(xì)
FD_READ 鏈熸湜鍦ㄥ鎺ュ瓧涓婃敹鍒版暟鎹紙鍗寵鍑嗗濂斤級(jí)鏃舵帴鍒伴氱煡
FD_WRITE 鏈熸湜鍦ㄥ鎺ュ瓧涓婂彲鍙戦佹暟鎹紙鍗沖啓鍑嗗濂斤級(jí)鏃舵帴鍒伴氱煡
FD_OOB 鏈熸湜鍦ㄥ鎺ュ瓧涓婃湁甯﹀鏁版嵁鍒拌揪鏃舵帴鍒伴氱煡
FD_ACCEPT 鏈熸湜鍦ㄥ鎺ュ瓧涓婃湁澶栨潵榪炴帴鏃舵帴鍒伴氱煡
FD_CONNECT 鏈熸湜鍦ㄥ鎺ュ瓧榪炴帴寤虹珛瀹屾垚鏃舵帴鍒伴氱煡
FD_CLOSE 鏈熸湜鍦ㄥ鎺ュ瓧鍏抽棴鏃舵帴鍒伴氱煡
渚嬪錛氭垜浠鍦ㄥ鎺ュ瓧璇誨噯澶囧ソ鎴栧啓鍑嗗濂芥椂鎺ュ埌閫氱煡錛岃鍙ュ涓嬶細(xì)
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
濡傛灉鎴戜滑闇瑕佹敞閿瀵瑰鎺ュ瓧緗戠粶浜嬩歡鐨勬秷鎭彂閫侊紝鍙灝?lEvent 璁劇疆涓?
2銆佸紓姝ヨ姹傚嚱鏁?/strong>
鍦?Berkeley Sockets 涓姹傛湇鍔℃槸闃誨鐨勶紝W(xué)INDOWS SICKETS 闄や簡(jiǎn)鏀寔榪欎竴綾誨嚱鏁板錛岃繕澧炲姞浜?jiǎn)鐩稿簲鐨勫紓姝ヨh眰鍑芥暟鈥斺擶SAAsyncGetXByY銆?
3銆侀樆濉炲鐞嗘柟娉?/strong> WINDOWS 鏄潪鎶㈠厛鐨勫浠誨姟鐜錛屽嵆鑻ヤ竴涓▼搴忎笉涓誨姩鏀懼純鍏舵帶鍒舵潈錛屽埆鐨勭▼搴忓氨涓嶈兘鎵ц銆傚洜姝ゅ湪璁捐Windows Sockets 紼嬪簭鏃訛紝灝界緋葷粺鏀寔闃誨鎿嶄綔錛屼絾榪樻槸鍙嶅紼嬪簭鍛樹(shù)嬌鐢ㄨ鎿嶄綔銆備絾鐢變簬 SUN 鍏徃涓嬬殑 Berkeley Sockets 鐨勫鎺ュ瓧榛樿鎿嶄綔鏄樆濉炵殑錛學(xué)INDOWS 浣滀負(fù)縐繪鐨?SOCKETS 涔熶笉鍙伩鍏嶅榪欎釜鎿嶄綔鏀寔銆?/p>
鍦╓indows Sockets 瀹炵幇涓紝瀵逛簬涓嶈兘绔嬪嵆瀹屾垚鐨勯樆濉炴搷浣滃仛濡備笅澶勭悊錛欴LL鍒濆鍖?#8594;寰幆鎿嶄綔銆傚湪寰幆涓紝瀹冨彂閫佷換浣?WINDOWS 娑堟伅錛屽茍媯(gè)鏌ヨ繖涓?Windows Sockets 璋冪敤鏄惁瀹屾垚錛屽湪蹇呰鏃訛紝瀹冨彲浠ユ斁寮僀PU璁╁叾瀹冨簲鐢ㄧ▼搴忔墽琛岋紙褰撶劧浣跨敤瓚呯嚎紼嬬殑CPU灝變笉浼?xì)鏈墭q欎釜楹葷儲(chǔ)浜?jiǎn)^_^錛夈傛垜浠彲浠ヨ皟鐢?WSACancelBlockingCall() 鍑芥暟鍙栨秷姝ら樆濉炴搷浣溿?/p>
鍦?Windows Sockets 涓紝鏈変竴涓粯璁ょ殑闃誨澶勭悊渚嬬▼ BlockingHook() 綆鍗曞湴鑾峰彇騫跺彂閫?WINDOWS 娑堟伅銆傚鏋滆瀵瑰鏉傜▼搴忚繘琛屽鐞嗭紝W(xué)indows Sockets 涓繕鏈?WSASetBlockingHook() 鎻愪緵鐢ㄦ埛瀹夎鑷繁鐨勯樆濉炲鐞嗕緥紼嬭兘鍔涳紱涓庤鍑芥暟鐩稿搴旂殑鍒欐槸 WSAUnhookBlockingHook()錛屽畠鐢ㄤ簬鍒犻櫎鍏堝墠瀹夎鐨勪換浣曢樆濉炲鐞嗕緥紼嬶紝騫墮噸鏂板畨瑁呴粯璁ょ殑澶勭悊渚嬬▼銆傝娉ㄦ剰錛岃璁¤嚜宸辯殑闃誨澶勭悊渚嬬▼鏃訛紝闄や簡(jiǎn)鍑芥暟 WSACancelBlockingHook() 涔嬪錛屽畠涓嶈兘浣跨敤鍏跺畠鐨?Windows Sockets API 鍑芥暟銆傚湪澶勭悊渚嬬▼涓皟鐢?WSACancelBlockingHook()鍑芥暟灝嗗彇娑堝浜庨樆濉炵殑鎿嶄綔錛屽畠?yōu)畣缁撴潫闃诲弩@鐜?/p>
4銆佸嚭閿欏鐞?/strong> Windows Sockets 涓轟簡(jiǎn)鍜屼互鍚庡綰跨▼鐜錛圵INDOWS/UNIX錛夊吋瀹癸紝瀹冩彁渚涗簡(jiǎn)涓や釜鍑洪敊澶勭悊鍑芥暟鏉ヨ幏鍙栧拰璁劇疆褰撳墠綰跨▼鐨勬渶榪戦敊璇彿銆傦紙WSAGetLastEror()鍜學(xué)SASetLastError()錛?/p>
5銆佸惎鍔ㄤ笌緇堟 浣跨敤鍑芥暟 WSAStartup() 鍜?WSACleanup() 鍚姩鍜岀粓姝㈠鎺ュ瓧銆?/p>
鍏乄indows Sockets緗戠粶紼嬪簭璁捐鏍稿績(jī) 鎴戜滑緇堜簬鍙互寮濮嬬湡姝g殑 Windows Sockets 緗戠粶紼嬪簭璁捐浜?jiǎn)銆備笉榪囨垜浠繕鏄厛鐪嬩竴鐪嬫瘡涓?Windows Sockets 緗戠粶紼嬪簭閮借娑夊強(qiáng)鐨勫唴瀹廣傝鎴戜滑涓姝ユ鎱㈡參璧般?/p>
1銆佸惎鍔ㄤ笌緇堟 鍦ㄦ墍鏈塛indows Sockets鍑芥暟涓紝鍙湁鍚姩鍑芥暟WSAStartup()鍜岀粓姝㈠嚱鏁癢SACleanup()鏄繀欏諱嬌鐢ㄧ殑銆傚惎鍔ㄥ嚱鏁板繀欏繪槸絎竴涓嬌鐢ㄧ殑鍑芥暟錛岃屼笖瀹冨厑璁告寚瀹?Windows Sockets API 鐨勭増鏈紝騫惰幏寰?SOCKETS鐨勭壒瀹氱殑涓浜涙妧鏈粏鑺傘傛湰緇撴瀯濡備笅錛?/p>
int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 鍏朵腑 wVersionRequested 淇濊瘉 SOCKETS 鍙甯歌繍琛岀殑 DLL 鐗堟湰錛屽鏋滀笉鏀寔錛屽垯榪斿洖閿欒淇℃伅銆傛垜浠湅涓涓嬩笅闈㈣繖孌典唬鐮侊紝鐪嬩竴涓嬪浣曡繘琛?WSAStartup() 鐨勮皟鐢細(xì) 鍏抽棴鍑芥暟浣跨敤鏃訛紝浠諱綍鎵撳紑騫跺凡榪炴帴鐨?SOCK_STREAM 濂楁帴瀛楄澶嶄綅錛屼絾閭d簺宸茬敱 closesocket() 鍑芥暟鍏抽棴鐨勪絾浠嶆湁鏈彂閫佹暟鎹殑濂楁帴瀛椾笉鍙楀獎(jiǎng)鍝嶏紝鏈彂閫佺殑鏁版嵁浠嶅皢琚彂閫併傜▼搴忚繍琛屾椂鍙兘浼?xì)澶殝啤璋冪?WSAStartuo() 鍑芥暟錛屼絾蹇呴』淇濊瘉姣忔璋冪敤鏃剁殑 wVersionRequested 鐨勫兼槸鐩稿悓鐨勩?/p>
2銆佸紓姝ヨ姹傛湇鍔?/strong> Windows Sockets 闄ゆ敮鎸?Berkeley Sockets 涓悓姝ヨ姹傦紝榪樺鍔犱簡(jiǎn)浜?jiǎn)涓綾誨紓姝ヨ姹傛湇鍔″嚱鏁?WSAAsyncGerXByY()銆傝鍑芥暟鏄樆濉炶姹傚嚱鏁扮殑寮傛鐗堟湰銆傚簲鐢ㄧ▼搴忚皟鐢ㄥ畠鏃訛紝鐢?Windows Sockets DLL 鍒濆鍖栬繖涓鎿嶄綔騫惰繑鍥炶皟鐢ㄨ咃紝姝ゅ嚱鏁拌繑鍥炰竴涓紓姝ュ彞鏌勶紝鐢ㄦ潵鏍囪瘑榪欎釜鎿嶄綔銆傚綋緇撴灉瀛樺偍鍦ㄨ皟鐢ㄨ呮彁渚涚殑緙撳啿鍖猴紝騫朵笖鍙戦佷竴涓秷鎭埌搴旂敤紼嬪簭鐩稿簲紿楀彛銆傚父鐢ㄧ粨鏋勫涓嬶細(xì) 闇瑕佹敞鎰忕殑鏄紝鐢變簬 Windows 鐨勫唴瀛樺鍍忓彲浠ヨ緗負(fù)鍙Щ鍔ㄥ拰鍙涪寮冿紝鍥犳鍦ㄦ搷浣滃唴瀛樺璞℃槸錛屽繀欏諱繚璇?WIindows Sockets DLL 瀵硅薄鏄彲鐢ㄧ殑銆? 3銆佸紓姝ユ暟鎹紶杈?/strong> 浣跨敤 send() 鎴?sendto() 鍑芥暟鏉ュ彂閫佹暟鎹紝浣跨敤 recv() 鎴杛ecvfrom() 鏉ユ帴鏀舵暟鎹俉indows Sockets 涓嶉紦鍔辯敤鎴蜂嬌鐢ㄩ樆濉炴柟寮忎紶杈撴暟鎹紝鍥犱負(fù)閭f牱鍙兘浼?xì)闃诲鏁翠?Windows 鐜銆備笅闈㈡垜浠湅涓涓紓姝ユ暟鎹紶杈撳疄渚嬨?/p>
鍋囪濂楁帴瀛?s 鍦ㄨ繛鎺ュ緩绔嬪悗錛屽凡緇忎嬌鐢ㄤ簡(jiǎn)鍑芥暟 WSAAsyncSelect() 鍦ㄥ叾涓婃敞鍐屼簡(jiǎn)緗戠粶浜嬩歡 FD_READ 鍜?FD_WRITE錛屽茍涓?wMsg 鍊間負(fù) UM_SOCK錛岄偅涔堟垜浠彲浠ュ湪 Windows 娑堟伅寰幆涓鍔犲涓嬬殑鍒嗘敮璇彞錛?/p>
4銆佸嚭閿欏鐞?/strong> Windows 鎻愪緵浜?jiǎn)涓涓嚱鏁版潵鑾峰彇鏈榪戠殑閿欒鐮?WSAGetLastError()錛屾帹鑽愮殑緙栧啓鏂瑰紡濡備笅錛? 涓錛屽揩閫熺敓鎴愪竴涓狣LL 鍝︼紝瀵逛簡(jiǎn)錛岃瑙h繕鏄敤VC++ 6.0錛堢畝縐癡C6錛夋潵璁茶В銆傚湪VC6涓媙ew涓涓?#8220;Win32 Dynamic-Link Library”鐨凱roject錛屽氨鍙?#8220;dllTest”鍚э紝娉ㄦ剰涓嶈閫夋嫨“MFC AppWizard(dll)”錛屽洜涓?#8230;…榪欎笉灞炰簬鏈枃鐨勫唴瀹癸紝鍏跺疄鏈閲嶈鐨勬槸錛氭垜涓嶅お鎳傦紙^_^錛夛紝鐒跺悗鍛紝閫夋嫨“An empty DLL project”鍗沖彲銆?/p>
鎺ヤ笅鏉ュ氨鏄垱寤轟互榪欎袱涓枃浠訛紝騫舵坊鍔犲埌Project涓幓錛?/p>
lib.h lib.cpp Build錛侊紙榪欎箞綆鍗曠殑紼嬪簭涓嶄細(xì)閫氫笉榪囧惂錛燂級(jí)浣犲氨鑳界湅鍒頒綘鐨勭敓鎴愮洰褰曚笅鏈変釜鏂囦歡錛屽彨“dllTest.dll”錛岃繖灝辨槸鎴戜滑絎竴涓猟ll錛屾病鍑犺浠g爜錛岀畝鍗曞惂錛屼絾楹婚泙铏藉皬浜旇剰淇卞叏錛屾垜浠嬌鐢╒isual Studio鎻愪緵鐨勫伐鍏?#8220;Depends”鎵撳紑榪欎釜鏂囦歡鐪嬬湅錛屽鍥炬墍紺猴紝浣犺兘鐪嬪埌鎴戜滑瀵煎嚭鐨勮繖涓嚱鏁幫紝add銆?/p>
榪欎釜瓚呭井鍨嬬殑dll鍜屾櫘閫氱▼搴忕殑涓嶅悓鍦ㄤ簬add鍑芥暟鐨勫0鏄庯紝澶氫簡(jiǎn)涓涓猒_declspec(dllexport)錛岃繖涓槸鍏抽敭錛岃繖涓慨楗扮鍛婅瘔VC6錛岃繖涓嚱鏁伴渶瑕佸鍑猴紝鑰屽墠闈㈢殑extern "C"鐨勬剰鎬濇槸榪欎釜鍑芥暟鏄互C璇█鐨勬爣鍑嗘潵璋冪敤鐨勶紝濡傛灉涓嶅姞extern "C"鐨勮瘽錛屼細(xì)鎬庝箞鏍峰憿錛熻嚜宸辮瘯璇曠湅鍚э紝Build鍚庡啀鐢―epends鐪嬬湅鐢熸垚鐨刣ll銆?br> 浜屻佷嬌鐢ㄨ繖涓狣LL 鐢╒C6鐨勫悜瀵煎垱寤轟竴涓?#8220;Win32 Console Application”鐨凱roject錛屽彨“CallDllTest”錛岀劧鍚庨夋嫨“"A Hello, Word!"Application”錛屼負(fù)浠涔堢敤Console錛熺畝鍗曞憲銆?/p>
鎶奀allDllTest.cpp鐨勫唴瀹規(guī)崲鎴愪互涓嬶細(xì) Build錛岀劧鍚?lt;Ctrl>+<F5>榪愯錛屽氨鑳界湅鍒扮粨鏋滀簡(jiǎn)錛屾墦鍗頒簡(jiǎn)涓涓?#8220;5”鍑烘潵錛岃鏄庢甯鎬簡(jiǎn)錛屾湁鐐歸渶瑕佽鏄庣殑鏄綘寰楁妸鍓嶉潰鐢熶駭鐨勯偅涓狣LL鍜岃繖嬈$敓鎴愮殑EXE鏀懼湪鍚屼竴鐩綍涓嬫柟鍙備唬鐮佸緢綆鍗曪紝鎬濊礬灝辨槸瀹氫箟鍑芥暟鎸囬拡綾誨瀷錛屽姞杞紻LL錛岃幏鍙栬璋冪敤鐨勫嚱鏁扮殑鎸囬拡錛岀劧鍚庤皟鐢紝榪欎箞涓涓繃紼嬨?/p>
涓夈侀潤(rùn)鎬侀摼鎺?/strong> 鍒氭墠浣跨敤LoadLibrary榪欎釜API鍔犺澆DLL鐨勬柟寮忓彨鍔ㄦ侀摼鎺ワ紝鐜板湪鏉ヤ粙緇嶉潤(rùn)鎬侀摼鎺ワ紝鍏跺疄闈?rùn)鎬侀摼鎺ョ敤寰楄繕鏇村錛屽彧涓嶈繃浣犱笉涓瀹氭敞鎰忓埌鑰屽凡錛屼笉淇$殑璇濈幇鍦ㄦ煡鐪嬩竴涓嬩綘鍒氬垱寤虹殑CallDllTest榪欎釜Project鐨凱roject Settings錛屽鍥撅細(xì) 閭e浣曢潤(rùn)鎬佷嬌鐢ㄥ墠闈㈢敓鎴愮殑閭d釜dllTest.dll鍛紵鍥炲埌鍒氭墠dllTest.dll鐨勯偅涓敓鎴愮洰褰曪紝浣犱細(xì)鍙戠幇涓涓彨dllTest.lib鐨勬枃浠訛紝榪欏氨鏄垜鍓嶉潰鎻愬埌“瀵煎叆搴?#8221;錛岀幇鍦ㄦ敼涓涓婥allDllTest.cpp銆?br>CallDllTest.cpp dllTest.lib榪欎釜鏂囦歡寰楀鍒跺埌CallDllTest榪欎釜Project鐨勭洰褰曚笅錛屽惁鍒欎細(xì)鎶ユ壘涓嶅埌鏂囦歡錛屾墽琛岀粨鏋滃浣曪紵璺熷垰鎵嶆槸涓鏍風(fēng)殑錛岃繖縐嶆柟寮忓氨鍙潤(rùn)鎬侀摼鎺ワ紝鍖哄埆鏄粈涔堬紵涓嶉渶瑕佸湪榪愯鏃惰皟鐢↙oadLibrary浜?jiǎn)锛屾垜涓壶櫑夊緱闈?rùn)鎬侀摼鎺ョ敤寰楁洿澶氫竴浜涖?/p>
娉ㄦ剰鐪嬩唬鐮侊細(xì) 榪欏彞璇濆緢鍏抽敭錛宊_declspec(dllimport)瀵瑰簲浜?jiǎn)DllTest涓殑__declspec(dllexport)錛岃〃紺鴻鍑芥暟灝嗕粠dll涓鍏ワ紝閭d綘涔熻瑕侀棶浜?jiǎn)锛?xì)“鎴戞庝箞鐭ラ亾榪欎釜dll涓湁榪欎釜鍑芥暟錛熷茍涓旇繕鐭ラ亾榪欎釜鍑芥暟鐨勫弬鏁扮被鍨嬪拰榪斿洖鍊肩被鍨嬶紵璇ヤ笉浼?xì)涔熸槸鐢―epends鍘葷湅鍚э紵”鍛?#8230;…榪欐庝箞璇村憿錛熷鏋滆繖涓猟ll鏄綘鍐欑殑錛屼綘褰撶劧鐭ラ亾鍟︼紝浣嗗鏋滆繖涓狣ll涓嶆槸浣犲啓鐨勮瘽錛屽畠鐨勪綔鑰呭線寰浼?xì)鎻愪緵涓涓ご鏂囦歡錛屽氨濂藉儚浣犺浣跨敤LoadLibrary錛屼綘寰楀寘鍚?#8220;windows.h”榪欎釜澶存枃浠朵竴鏍鳳紝鍚﹀垯灝卞嚭鐜扮鍙鋒湭瀹氫箟鐨勭紪璇戦敊璇紝閭d箞鎴戜滑鏀逛竴涓媗ib.h榪欎釜澶存枃浠躲?/p>
lib.h 鍦―llTest榪欎釜Project涓紝DLLTEST_EXPORTS鏄瀹氫箟浜?jiǎn)鐨勫Q屽鍥撅細(xì) 鎵浠ヤ嬌鐢╠llexport錛岃屽湪鍒殑Project涓紝鍒欎嬌鐢╠llimport銆傚湪CallDllTest涓璱nclude榪欎釜lib.h錛屽氨鍙互浜?jiǎn)锛屽綋鐒朵綘涔熷彲浠ュ啓寰楁洿濂藉Q屾垜榪欓噷浠呬粎鏄痙emo銆?/p>
鍥涖丏LL涓殑main鍑芥暟 澶у閮界煡閬揅璇█鐨勭▼搴忔槸浠巑ain寮濮嬬殑錛屽埌浜?jiǎn)Windows鐜涓嬶紝鍒欐崲鎴愪簡(jiǎn)WinMain錛屼絾涔熷樊涓嶅錛岄偅DLL鏈夋病鏈夌被浼肩殑鍏ュ彛鍛紵絳旀鏄偗瀹氱殑錛屾垜浠潵鏀逛竴涓婦llTest鐨刲ib.cpp銆?/p>
lib.cpp 浣犺兘鐪嬪埌涓涓彨“DllMain”鐨勫嚱鏁幫紝瀹冨氨鏄痙ll鐨勫叆鍙o紝oh錛屽綋鐒朵簡(jiǎn)錛屾垜榪欑瘒鏂囩珷鎵璁茬殑閮芥槸閽堝Windows鎿嶄綔緋葷粺鐨勶紝Linux鐨勫彲涓嶄竴鏍峰摝錛岀敋鑷充竴鑸潵璇達(dá)紝Linux鐨凞LL閮戒笉鍙?#8220;DLL”銆?/p>
濂戒簡(jiǎn)錛屼綘鍐嶆寜鐓у墠闈㈢殑鏂規(guī)硶鍘昏皟鐢ㄤ笅榪欎釜DLL錛岋紙璁板緱鎷瘋礉榪欎釜dll鍒扮浉搴旂洰褰曞幓錛夎繖鏃跺欎綘灝辮兘鐪嬪埌鎵ц緇撴灉涓浜?#8220;process attach of DLL”鍜?#8220;process detach of DLL”錛岃繖鏄緢鏄捐屾槗瑙佺殑錛屼竴涓繘紼嬭繛鎺ュ拰鏂紑榪炴帴鍒拌繖涓猟ll鐨勬椂鍊欙紝DllMain灝變細(xì)琚皟鐢紝涓斾紶閫掔殑ul_reason_for_call鍙傛暟鍒嗗埆鏄疍LL_PROCESS_ATTACH鍜孌LL_PROCESS_DETACH錛岄偅浠涔堟椂鍊欎細(xì)鏈?#8220;DLL_THREAD_ATTACH”鍜?#8220;DLL_THREAD_DETACH”錛熷綋搴撳凡緇忓姞杞斤紝鍒涘緩鏂扮殑綰跨▼鍜岄攢姣佺嚎紼嬬殑鏃跺欙紝浼?xì)鍒嗗埆鋴社敤THREAD_ATTACH鍜孴HREAD_DETACH鍙傛暟鏉ヨ皟DllMain銆?/p>
浜斻佽皟鐢ㄦ柟寮?/strong> 鍓嶉潰鎴戜滑瀵煎叆錛屽鍑哄嚱鏁扮殑鏃跺欓兘鍔犱簡(jiǎn)涓涓?#8220;extern "C"”錛岄偅涓嶅姞浼?xì)鎬庝箞鏍峰憿錛熷鏋滃啀娑夊強(qiáng)鍒拌繖鍑犱釜淇グ絎︼細(xì)__stdcall錛宊_cdecl鍜宊_fastcall錛岄偅鍙堜細(xì)鎬庢牱鍛紵鎴戠敾浜?jiǎn)涓や釜琛ㄥQ屽ぇ瀹跺彲浠ユ瘮杈冧笅錛屼綋浼?xì)涓嬨?/p>
榪欐槸涓夌涓嶅悓璋冪敤鏂瑰紡鐨勬瘮杈冿細(xì) 榪欐槸鍛藉悕淇グ鍦ㄤ笉鍚屾柟寮忎笅鐨勬瘮杈冿細(xì) 濡傛灉dll鍜宔xe鐨勫懡鍚嶇悊瑙d笉涓鑷達(dá)紝灝辨湁鍙兘鍑洪敊銆傞氬父鏉ヨ錛屾垜鏄範(fàn)鎯簬鐢?#8220;extern "C"”鍜?#8220;__cdecl”鐨勭粍鍚堛?/p>
鍏佸鍑哄彉閲?/strong> 鍓嶉潰鍙浜?jiǎn)濡備綍瀵煎嚭鍑芥晭图岄偅濡備綍瀵煎囖Z竴涓彉閲忓憿錛熸柟娉曠被浼鹼紝鐢氳嚦鍙互璇村嚑涔庝竴鏍鳳紝鐪嬩唬鐮侊細(xì) lib.cpp lib.h 榪欐牱錛屽氨鍙互浜?jiǎn)锛屽拰瀵煎嚭鍑芥暟鏄病浠涔堝樊鍒惂錛熷悓鏍鳳紝浣犱篃鍙互鐢―epends瑙傚療鐢熸垚鐨凞LL錛屼綘浼?xì)鍙戠幇iExportInt榪欎釜瀵煎嚭絎﹀彿錛屼篃灝辨槸鎴戜滑瀵煎嚭鐨勮繖涓彉閲忎簡(jiǎn)銆傜幇鍦ㄧ湅CallDllTest鐨勪唬鐮侊細(xì) CallDllTest.cpp 杈撳嚭鏄粈涔堬紵112鍜?13錛岃鏄庢垚鍔熶簡(jiǎn)銆備笉鐭ラ亾浣犺繖涓椂鍊欐湁娌℃湁鎯沖埌涓涓棶棰橈紝閭e氨鏄鏋滀袱涓繘紼嬪悓鏃惰皟鐢╠llTest.dll錛岃屼笖鍚屾椂淇敼鍜岃鍙杋ExportInt錛岄偅浼?xì)涓嶄細(xì)湄曟帀鍛㈠Q熻涓嶈鍋氫竴涓簰鏂ラ攣鍛紵絳旀鏄細(xì)涓嶄細(xì)錛屼笉闇瑕併傝繖寰楃泭浜嶹indows鍐呭瓨綆$悊鐨勪竴涓簳灞傚疄鐜版妧鏈紝鍙獵opy-on-write錛屽湪璋冪敤鎵ц“iExportInt++”鐨勬椂鍊欙紝鍏跺疄騫墮潪鐪熸淇敼浜?jiǎn)DLL涓殑鍊鹼紝鑰屾槸鍋氫簡(jiǎn)涓浠芥嫹璐濓紝閫氳繃鍐呭瓨鏄犲皠鏈哄埗錛屼嬌寰楃▼搴忚闂殑閭d釜“iExportInt”鍏跺疄鏄偅浠芥嫹璐濓紝鑰屽彟涓榪涚▼浣跨敤鐨勪篃鏄嚜宸辯殑鎷瘋礉錛屼簰涓嶅共娑夈?/p>
涓冦佸叡浜唴瀛?/strong> 绱ф帴鐫鍓嶉潰榪欎釜闂錛岄偅濡傛灉鎴戜紒鍥鵑氳繃DLL鏉ヨ涓嶅悓榪涚▼鍏變韓涓孌靛唴瀛橈紝鑰屼笉鏄緋葷粺鎵ц榛樿鐨凜opy-on-write鎿嶄綔錛岄偅鎬庝箞鍔炲憿錛熸湁鍔炴硶錛佽繖鏄疢icrosoft鎻愪緵鐨勪竴涓柟娉曪紝涓漢瑙夊緱鏄釜涓嶉敊鐨勮繘紼嬮棿閫氫俊鐨勬柟娉曪紝姣斿涓や釜榪涚▼闇瑕佷氦鎹竴澶у潡鏁版嵁錛岃屼笖榪欎竴澶у潡鏁版嵁鍙樺寲姣旇緝棰戠箒錛岄氳繃鏁版嵁搴撳晩錛屾枃浠跺晩錛屽氨鏄懼緱鏈夌偣鎱紝濡傛灉閫氳繃socket鍟婏紝綆¢亾鍟婏紝灝辨樉寰楁湁浜涗笉鐩存帴錛岃繕鏄洿鎺ヤ嬌鐢ㄥ叡浜唴瀛樻潵寰楃洿鎺ワ紝浣嗗緢澶氫漢騫朵笉鐭ラ亾榪欎釜鍔熻兘錛屾垜榪欓噷璺熷ぇ瀹跺垎浜笅銆?/p>
lib.h lib.cpp Build涓涓嬶紝鐒跺悗鐢―epends鐪嬬湅杈撳嚭鎯呭喌銆傜幇鍦ㄦ潵鏀笴allDllText.cpp銆傝繖閲屾湁闈炲父瑕佹敞鎰忕殑涓や釜鍦版柟錛屼竴鏄?#8220;={0}”榪欎釜鍒濆鍖栵紝榪欐槸蹇呴』鐨勶紝鍚﹀垯鍏變韓灝嗕笉璧蜂綔鐢紝Microsoft瑙勫畾浜?jiǎn)鍏变韩娈典竴瀹氶渶瑕佸厛鍒濆鍖栵紝鍝曞彧鏄粰絎竴涓厓绱犺祴涓殢渚夸粈涔堝奸兘濂斤紝濡傝繖涓緥瀛愶紝鎴戝彧鏄粰絎竴涓厓绱犺祴鍊間簡(jiǎn)涓?錛涘彟涓澶勮娉ㄦ剰鐨勬槸“/SECTION:shared,RWS"榪欎釜瀛楃涓詫紝涓棿鍙埆瑕佹湁絀烘牸錛屽惁鍒欎綘鍚屾牱浼?xì)鍙戠幇鍏变韩涓嶈捣浣滅敤锛屾垜褰撴椂璋冭瘯灏卞緢閮侀楕P紝鍥犱負(fù)鎴戜範(fàn)鎯湪鑻辨枃閫楀彿鍚庡姞涓┖鏍箋?/p>
CallDllText.cpp Sleep(10000)浼?xì)璁┙E嬪簭鍫靛10縐掗挓錛岃繖鏍峰氨鍙互榪愯澶氫釜紼嬪簭鐨勫壇鏈紝鏉ヨ瀵熷叡浜殑鏁堟灉銆?/p>
鍏佺粨鏉?/strong> DLL娑電洊鐨勭煡璇嗛潰鐩稿綋騫匡紝鏈枃鍙槸綃囧叆闂ㄧ駭鐨勬枃绔狅紝浠嬬粛浜?jiǎn)涓浜涙瘮杈冨疄鐢ㄧ殑鍐呭鑰屽凡錛屽鏋滆榪涗竴姝ュ涔?fàn)锛岄渶瑕佺湅鐪嬨奧indows鏍稿績(jī)緙栫▼銆嬭繖縐嶇粡鍏歌憲浣滐紝鍏充簬DLL鐨勫緢澶氬唴瀹規(guī)垜閮芥病鏈夋彁鍙?qiáng)鍒板Q屾瘮濡侱LL鐨勫鍑烘柟娉曞叾瀹炴湁濂藉嚑縐嶏紝鎴戜粙緇嶇殑鍙槸鍏朵腑涓縐嶏紝浣嗘垜璁や負(fù)鎴戜粙緇嶇殑鏂規(guī)硶鏄渶濂界敤鑰屼笖鏄渶綆鍗曠殑銆傛垜浠啓紼嬪簭錛屾槸涓轟簡(jiǎn)瀹炵幇鏌愪簺搴旂敤錛岃屼笉鏄負(fù)浜?jiǎn)鐐鏌愪簺鎶鏈紝鎵浠ユ垜鏄亸鍚戜簬浣跨敤鎴愮啛錛屽彲闈犲拰鏄撹鐨勬柟娉曘?br> 闄ゅ紑鎵撳嵃鍜屽墠闈㈢殑鏉′歡鍒ゆ柇澶栵紝鐪熺殑娌″嚑琛岋紝鑰屼笖鍙敤浜?jiǎn)涓涓潪甯告湁闄愮殑榪唬錛屾晥鐜囪嚜鐒舵槸寰堥珮鐨勩?/p>
Windows Sockets 涓轟簡(jiǎn)瀹炵幇褰撲竴涓簲鐢ㄧ▼搴忕殑濂楁帴瀛楄皟鐢ㄥ浜庨樆濉炴椂錛岃兘澶熸斁寮僀PU璁╁叾瀹冨簲鐢ㄧ▼搴忚繍琛岋紝瀹冨湪璋冪敤澶勪簬闃誨鏃朵究榪涘叆涓涓彨“HOOK”鐨勪緥紼嬶紝姝や緥紼嬭礋璐f帴鏀跺拰鍒嗛厤WINDOWS娑堟伅錛屼嬌寰楀叾瀹冨簲鐢ㄧ▼搴忎粛鐒惰兘澶熸帴鏀跺埌鑷繁鐨勬秷鎭茍鍙栧緱鎺у埗鏉冦?/p>
WSADATA wsaData; //瀹氫箟鏁版嵁淇℃伅鍙橀噺
int err; //瀹氫箟閿欒鍙峰彉閲?/span>
wVersionRequested = MAKEWORD(1,1);//緇欑増鏈俊鎭祴鍊?/span>
err = WSAStartup(wVersionRequested, &wsaData);//緇欓敊璇俊鎭祴鍊?/span>
if(err!=0)
{
銆銆return;//鍛婅瘔鐢ㄦ埛鎵句笉鍒板悎閫傜殑鐗堟湰
}
//紜 Windows Sockets DLL 鏀寔 1.1 鐗堟湰
//DLL 鐗堟湰鍙互楂樹(shù)簬 1.1
//緋葷粺榪斿洖鐨勭増鏈彿濮嬬粓鏄渶浣庤姹傜殑 1.1錛屽嵆搴旂敤紼嬪簭涓嶥LL 涓彲鏀寔鐨勬渶浣庣増鏈彿
if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1)
{
銆銆WSACleanup();//鍛婅瘔鐢ㄦ埛鎵句笉鍒板悎閫傜殑鐗堟湰
銆銆return;
}
//Windows Sockets DLL 琚繘紼嬫帴鍙楋紝鍙互榪涘叆涓嬩竴姝ユ搷浣?/span>
char hostname="rs6000";
taskHnd = WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen);
銆銆switch(lParam)
銆銆{
銆銆case FD_READ:
銆銆銆銆len = recv(wParam,lpBuffer,length,0);
銆銆銆銆break;
銆銆case FD_WRITE:
銆銆銆銆while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR)
銆銆銆銆break;
銆銆}
break;
if((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){}
#define LIB_H
extern "C" int __declspec(dllexport) add(int x,int y);
#endif
int add(int x,int y)
{
return x + y;
}
CallDllTest.cpp
#include "windows.h"
typedef int ( * lpAddFun)(int,int);
int main(int argc, char* argv[])
{
HINSTANCE hDll; //DLL handle
lpAddFun addFun; //Function pointer
hDll = LoadLibrary("dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll,"add");
if(addFun!=NULL)
{
int result = addFun(2,3);
printf("%d",result);
}
FreeLibrary(hDll);
}
return 0;
}
娉ㄦ剰鎴戠敾綰㈢嚎鐨勮繖涓湴鏂癸紝Kernel32.lib錛寀ser32.lib鍜実di32.lib絳夛紝榪欎簺lib鍙仛“瀵煎叆搴?#8221;錛屽茍涓嶅寘鍚湡姝f湁鏁堢殑浠g爜錛岀湡姝f湁鏁堢殑浠g爜鏄瓨鏀懼湪DLL涓殑錛屽垰鎵嶆垜浠墍浣跨敤鐨凩oadLibrary榪欎釜API錛屽叾瀹炲氨鏄氳繃Kernel32.lib閾炬帴鍒癒ernel32.dll涓幓鐨勶紝涔熷氨鏄LoadLibrary鐨勫疄鐜板瓨鍦ㄤ簬Kernel32.dll涓紝鑰屾垜浠槸閫氳繃Kernel32.lib鏉ユ壘鍒板畠鐨勶紝濡傛灉榪樻湁鍏磋叮鐨勮瘽錛屽彲浠ョ敤Depends鐪嬬湅Kernel32.dll錛岀湅鐪嬮噷闈㈡槸鍚︽湁LoadLibrary錛岄噷闈㈠嚱鏁板緢澶氾紝鍒湅鑺辯溂浜?jiǎn)鍝﹀Q岃繖鍙槸Windows鐨勬牳蹇?jī)搴撲箣涓錛屼絾鍙兘浣犲茍娌℃湁鎵懼埌LoadLibrary錛岃屾槸鎵懼埌浜?jiǎn)锛孡oadLibraryA鍜孡oadLibraryW錛岃繖寰堟甯革紝鍥犱負(fù)寰堝闇瑕佷嬌鐢ㄥ埌瀛楃涓茬殑API錛岄兘鏈変袱涓増鏈紝涓涓槸紿勫瓧絎︾増錛屼竴涓槸瀹藉瓧絎︾増錛屽湪紼嬪簭緙栬瘧閾炬帴鐨勬椂鍊欙紝緙栬瘧鍣ㄤ細(xì)鏍規(guī)嵁浣犵殑閫夐」鏉ヨ窡浣犻夋嫨鍏朵腑涓涓紝榪欓噷鏆傛椂涓嶅睍寮浜?jiǎn)銆?/p>
#pragma comment(lib, "dllTest.lib")
extern "C" int __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
int result = add(2,3);
printf("%d",result);
return 0;
}
#define LIB_H
#ifdef DLLTEST_EXPORTS
extern "C" int __declspec(dllexport) add(int x,int y);
#else
extern "C" int __declspec(dllimport) add(int x,int y);
#endif
#endif
#include "windows.h"
#include "stdio.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("\nprocess attach of DLL");
break;
case DLL_THREAD_ATTACH:
printf("\nthread attach of DLL");
break;
case DLL_THREAD_DETACH:
printf("\nthread detach of DLL");
break;
case DLL_PROCESS_DETACH:
printf("\nprocess detach of DLL");
break;
}
return TRUE;
}
int add(int x,int y)
{
return x + y;
}
#include "windows.h"
#include "stdio.h"
int iExportInt;
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
iExportInt = 112;
break;
}
return TRUE;
}
#define LIB_H
#ifdef DLLTEST_EXPORTS
extern "C" int __declspec(dllexport) iExportInt;
#else
extern "C" int __declspec(dllimport) iExportInt;
#endif
#endif
#include "lib.h"
#pragma comment(lib, "dllTest.lib")
int main(int argc, char* argv[])
{
printf("%d\n", iExportInt);
iExportInt++;
printf("%d\n", iExportInt);
return 0;
}
#define LIB_H
#ifdef DLLTEST_EXPORTS
extern "C" __declspec(dllexport) unsigned char dataChunk[100000];
#else
extern "C" __declspec(dllimport) unsigned char dataChunk[100000];
#endif
#endif
#pragma data_seg("shared")
unsigned char dataChunk[100000]={0};
#pragma data_seg()
#pragma comment(linker, "/SECTION:shared,RWS")
#include "windows.h"
#include "lib.h"
#pragma comment(lib, "dllTest.lib")
int main(int argc, char* argv[])
{
printf("%d\n", dataChunk[0]++);
Sleep(10000);
return 0;
}
浣滀負(fù)宸ョ▼甯堬紝緇忓父闇瑕佺敾浜涘浘琛ㄦ洸綰匡紝閭e埢搴﹀氨鎴愪簡(jiǎn)涓棶棰橈紝涓嬮潰鎴戜婦涓や釜渚嬪瓙璇磋榪欎釜闂錛?br>鏁板瓧緋誨垪1錛?.12錛?.4錛?.3錛?.16錛?.5錛?.9錛?1錛?2錛?.6
鐢繪垚鏇茬嚎錛岀敤Excel錛屽緢綆鍗曪紝浣犲緢蹇氨寮勫ソ浜?jiǎn)锛屽鍥惧Q?br>
鏁板瓧緋誨垪2錛?234321.1錛?234331.1錛?234343.1錛?234123.1錛?234356.1錛?234567.1錛?234399.1錛?234300.1
鍚屾牱錛岀敤Excel鐢繪垚鏇茬嚎錛屽涓嬪浘錛?br>
娉ㄦ剰綰靛潗鏍囩殑鍒誨害錛屾垜璇寸殑灝辨槸榪欎釜闂錛屽鏋滄槸浣狅紝濡備綍鏉ユ爣榪欎釜鍒誨害錛?br>
涓鑸潵璇達(dá)紝鎴戜滑鏃ュ父鐢熸椿涓湅鍒扮殑鍒誨害閮芥槸浠?錛?.5錛?錛?0涓洪棿闅旂殑錛屽鏋滅粰鍑轟簡(jiǎn)涓涓渶灝忓?.55錛屼竴涓渶澶у?.13錛岃姹傜敾鍑哄ぇ綰?涓埢搴︼紝閭e簲璇ユ庝箞鐢伙紵濡傛灉鏄垜錛屽ぇ姒傚氨鐢誨嚭榪欏嚑涓細(xì)4.4錛?.6錛?.8錛?.0錛?.2銆?br>
閭h繖鏍瘋涓嶈鍛紵(5.13-4.55)/5=0.116錛屼簬鏄敾鍑?guó)櫩欏嚑涓堈d害錛?.55錛?.666錛?.782錛?.898錛?.014錛?.13銆傚綋鐒朵篃鍙互錛屼絾榪欎釜綆楁硶鏈厤澶畝鍗曪紝鐢誨嚭鏉ョ殑鍒誨害涓嶅ソ鐪嬨?br>
閭f垜浠浣曟潵鎻忚堪鎴戜笂闈㈡彁鍒扮殑浠?錛?.5錛?錛?0涓洪棿闅旂殑鍒掑垎綆楁硶鍛紵鎴戜竴鐩存劅瑙夊緢鍥伴毦錛岀洿鍒頒粖澶╁姩鎵嬪幓鍐欙紝騫朵笖鎶婂畠鍐欏嚭鏉ヤ簡(jiǎn)錛屾墠鍙戠幇涔熷氨閭d箞鍑犺浠g爜錛屾垜鎶婃垜鐨勪唬鐮佽創(chuàng)鍑烘潵涓庡ぇ瀹跺垎浜紝鎴戠浉淇℃垜榪欎釜綆楁硶緇忚繃紼嶅井鐨勪慨鏀瑰氨鑳介傚簲鎵鏈夌殑鍧愭爣鍒誨害鍒掑垎銆?br>
浠g爜瀹炲湪綆鍗曪紝鎴戜笉鍐欎粈涔堟敞閲婁簡(jiǎn)錛屾垜瑙夊緱榪欐槸鎴戝啓鐨勬渶綺炬?zhèn)嶇殑灏徑E嬪簭涔嬩竴銆?br>
#include <math.h>
void RegulateAll(double dMin, double dMax, int iMaxAxisNum);
int main(int argc, char* argv[])
{
RegulateAll(2, 45, 7);
RegulateAll(0.12, 0.43, 5);
RegulateAll(10001, 10002, 5);
RegulateAll(-12.65, 56.3, 6);
RegulateAll(5243217834.12, 5378234435.12, 5);
RegulateAll(-0.043, 0.099, 8);
RegulateAll(-123431, -67325, 10);
RegulateAll(0.0, 0.0, 5);
return 0;
}
void RegulateAll(double dMin, double dMax, int iMaxAxisNum)
{
if(iMaxAxisNum<1 || dMax<dMin)
return;
double dDelta = dMax - dMin;
if(dDelta<1.0) //Modify this by your requirement.
{
dMax+=(1.0-dDelta)/2.0;
dMin-=(1.0-dDelta)/2.0;
}
dDelta = dMax - dMin;
int iExp = (int)(log(dDelta)/log(10.0))-2;
double dMultiplier = pow(10, iExp);
const double dSolutions[] =
{1, 2, 2.5, 5, 10, 20, 25, 50, 100, 200, 250, 500};
int i;
for(i=0; i<sizeof(dSolutions)/sizeof(double); i++)
{
double dMultiCal = dMultiplier * dSolutions[i];
if(((int)(dDelta/dMultiCal) + 1)<=iMaxAxisNum)
{
break;
}
}
double dInterval = dMultiplier * dSolutions[i];
double dStartPoint = ((int)ceil(dMin/dInterval) - 1) * dInterval;
int iAxisIndex;
for(iAxisIndex=0; 1; iAxisIndex++)
{
printf("%f", dStartPoint+dInterval*iAxisIndex);
if(dStartPoint+dInterval*iAxisIndex>dMax)
break;
printf(" | ");
}
printf("\n");
}
涓銆侀緙栬瘧澶存枃浠惰鏄?/span>
鎵璋撳ご鏂囦歡棰勭紪璇戯紝灝辨槸鎶婁竴涓伐紼?Project)涓嬌鐢ㄧ殑涓浜汳FC鏍囧噯澶存枃浠?濡俉indows.H銆丄fxwin.H)棰勫厛緙栬瘧錛屼互鍚庤宸ョ▼緙栬瘧鏃訛紝涓嶅啀緙栬瘧榪欓儴鍒嗗ご鏂囦歡錛屼粎浠呬嬌鐢ㄩ緙栬瘧鐨勭粨鏋溿傝繖鏍峰彲浠ュ姞蹇紪璇戦熷害錛岃妭鐪佹椂闂淬?br>
棰勭紪璇戝ご鏂囦歡閫氳繃緙栬瘧stdafx.cpp鐢熸垚錛屼互宸ョ▼鍚嶅懡鍚嶏紝鐢變簬棰勭紪璇戠殑澶存枃浠剁殑鍚庣紑鏄?#8220;pch”錛屾墍浠ョ紪璇戠粨鏋滄枃浠舵槸projectname.pch銆?br>
緙栬瘧鍣ㄩ氳繃涓涓ご鏂囦歡stdafx.h鏉ヤ嬌鐢ㄩ緙栬瘧澶存枃浠躲俿tdafx.h榪欎釜澶存枃浠跺悕鏄彲浠ュ湪project鐨勭紪璇戣緗噷鎸囧畾鐨勩傜紪璇戝櫒璁や負(fù)錛屾墍鏈夊湪鎸囦護(hù)#include "stdafx.h"鍓嶇殑浠g爜閮芥槸棰勭紪璇戠殑錛屽畠璺寵繃#include "stdafx. h"鎸囦護(hù)錛屼嬌鐢╬rojectname.pch緙栬瘧榪欐潯鎸囦護(hù)涔嬪悗鐨勬墍鏈変唬鐮併?br>
鍥犳錛屾墍鏈夌殑CPP瀹炵幇鏂囦歡絎竴鏉¤鍙ラ兘鏄細(xì)#include "stdafx.h"銆?br>
鍙﹀錛屾瘡涓涓疄鐜版枃浠禖PP閮藉寘鍚簡(jiǎn)濡備笅璇彞錛?/p>
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
浜屻丆/C++澶存枃浠朵竴瑙?/span>
C銆佷紶緇?C++
#include <assert.h>銆銆銆銆//璁懼畾鎻掑叆鐐?br>#include <ctype.h>銆銆銆銆 //瀛楃澶勭悊
#include <errno.h>銆銆銆銆 //瀹氫箟閿欒鐮?br>#include <float.h>銆銆銆銆 //嫻偣鏁板鐞?br>#include <fstream.h>銆銆銆 //鏂囦歡杈撳叆錛忚緭鍑?br>#include <iomanip.h>銆銆銆 //鍙傛暟鍖栬緭鍏ワ紡杈撳嚭
#include <iostream.h>銆銆銆//鏁版嵁?huà)箒杈撳叆锛忚緭鍑?br>#include <limits.h>銆銆銆銆//瀹氫箟鍚勭鏁版嵁綾誨瀷鏈鍊煎父閲?br>#include <locale.h>銆銆銆銆//瀹氫箟鏈湴鍖栧嚱鏁?br>#include <math.h>銆銆銆銆銆//瀹氫箟鏁板鍑芥暟
#include <stdio.h>銆銆銆銆 //瀹氫箟杈撳叆錛忚緭鍑哄嚱鏁?br>#include <stdlib.h>銆銆銆銆//瀹氫箟鏉傞」鍑芥暟鍙?qiáng)鍐呭瓨鍒嗛厤鍑芥?br>#include <string.h>銆銆銆銆//瀛楃涓插鐞?br>#include <strstrea.h>銆銆銆//鍩轟簬鏁扮粍鐨勮緭鍏ワ紡杈撳嚭
#include <time.h>銆銆銆銆銆//瀹氫箟鍏充簬鏃墮棿鐨勫嚱鏁?br>#include <wchar.h>銆銆銆銆 //瀹藉瓧絎﹀鐞嗗強(qiáng)杈撳叆錛忚緭鍑?br>#include <wctype.h>銆銆銆銆//瀹藉瓧絎﹀垎綾?br>
鏍囧噯 C++銆錛堝悓涓婄殑涓嶅啀娉ㄩ噴錛?br>#include <algorithm>銆銆銆 //STL 閫氱敤綆楁硶
#include <bitset>銆銆銆銆銆//STL 浣嶉泦瀹瑰櫒
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>銆銆銆銆 //澶嶆暟綾?br>#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>銆銆銆銆銆 //STL 鍙岀闃熷垪瀹瑰櫒
#include <exception>銆銆銆 //寮傚父澶勭悊綾?br>#include <fstream>
#include <functional>銆銆銆//STL 瀹氫箟榪愮畻鍑芥暟錛堜唬鏇胯繍綆楃錛?br>#include <limits>
#include <list>銆銆銆銆銆銆//STL 綰挎у垪琛ㄥ鍣?br>#include <map>銆銆銆銆銆銆 //STL 鏄犲皠瀹瑰櫒
#include <iomanip>
#include <ios>銆銆銆銆銆銆 //鍩烘湰杈撳叆錛忚緭鍑烘敮鎸?br>#include <iosfwd>銆銆銆銆銆//杈撳叆錛忚緭鍑虹郴緇熶嬌鐢ㄧ殑鍓嶇疆澹版槑
#include <iostream>
#include <istream>銆銆銆銆 //鍩烘湰杈撳叆嫻?br>#include <ostream>銆銆銆銆 //鍩烘湰杈撳嚭嫻?br>#include <queue>銆銆銆銆銆 //STL 闃熷垪瀹瑰櫒
#include <set>銆銆銆銆銆銆 //STL 闆嗗悎瀹瑰櫒
#include <sstream>銆銆銆銆 //鍩轟簬瀛楃涓茬殑嫻?br>#include <stack>銆銆銆銆銆 //STL 鍫嗘爤瀹瑰櫒銆銆銆銆
#include <stdexcept>銆銆銆 //鏍囧噯寮傚父綾?br>#include <streambuf>銆銆銆 //搴曞眰杈撳叆錛忚緭鍑烘敮鎸?br>#include <string>銆銆銆銆銆//瀛楃涓茬被
#include <utility>銆銆銆銆 //STL 閫氱敤妯℃澘綾?br>#include <vector>銆銆銆銆銆//STL 鍔ㄦ佹暟緇勫鍣?br>#include <cwchar>
#include <cwctype>
using namespace std;
C99 澧炲姞
#include <complex.h>銆銆 //澶嶆暟澶勭悊
#include <fenv.h>銆銆銆銆//嫻偣鐜
#include <inttypes.h>銆銆//鏁存暟鏍煎紡杞崲
#include <stdbool.h>銆銆 //甯冨皵鐜
#include <stdint.h>銆銆銆//鏁村瀷鐜
#include <tgmath.h>銆銆銆//閫氱敤綾誨瀷鏁板瀹?br>
涓夈侀澶勭悊鐨勭敱鏉?/span>
鍦–++鐨勫巻鍙插彂灞曚腑錛屾湁寰堝鐨勮璦鐗瑰緛錛堢壒鍒槸璇█鐨勬櫐娑╀箣澶勶級(jí)鏉ヨ嚜浜嶤璇█錛岄澶勭悊灝辨槸鍏朵腑鐨勪竴涓侰++浠嶤璇█閭i噷鎶奀璇█棰勫鐞嗗櫒緇ф壙榪囨潵錛孋璇█棰勫鐞嗗櫒錛岃Bjarne鍗氬+(C++涔嬬埗)綆縐頒負(fù)Cpp錛屼笉鐭ラ亾鏄笉鏄疌 Program Preprocessor鐨勭畝縐般?br>
鍥涖佸父瑙佺殑棰勫鐞嗗姛鑳?/span>
棰勫鐞嗗櫒鐨勪富瑕佷綔鐢ㄥ氨鏄妸閫氳繃棰勫鐞嗙殑鍐呭緩鍔熻兘瀵逛竴涓祫婧愯繘琛岀瓑浠鋒浛鎹紝鏈甯歌鐨勯澶勭悊鏈夛細(xì)鏂囦歡鍖呭惈錛屾潯浠剁紪璇戙佸竷灞鎺у埗鍜屽畯鏇挎崲4縐嶃?br>
1錛屾枃浠跺寘鍚細(xì)#include 鏄竴縐嶆渶涓哄父瑙佺殑棰勫鐞嗭紝涓昏鏄仛涓烘枃浠剁殑寮曠敤緇勫悎婧愮▼搴忔鏂囥?br>2錛屾潯浠剁紪璇戯細(xì)#if,#ifndef,#ifdef,#endif,#undef絳変篃鏄瘮杈冨父瑙佺殑棰勫鐞嗭紝涓昏鏄繘琛岀紪璇戞椂榪涜鏈夐夋嫨鐨勬寫(xiě)閫夛紝娉ㄩ噴鎺変竴浜涙寚瀹氱殑浠g爜錛屼互杈懼埌鐗堟湰鎺у埗銆侀槻姝㈠鏂囦歡閲嶅鍖呭惈鐨勫姛鑳姐?br>3錛屽竷灞鎺у埗錛?pragma錛岃繖涔熸槸鎴戜滑搴旂敤棰勫鐞嗙殑涓涓噸瑕佹柟闈紝涓昏鍔熻兘鏄負(fù)緙栬瘧紼嬪簭鎻愪緵闈炲父瑙勭殑鎺у埗嫻佷俊鎭?br>4錛屽畯鏇挎崲錛?define錛岃繖鏄渶甯歌鐨勭敤娉曪紝瀹冨彲浠ュ畾涔夌鍙峰父閲忋佸嚱鏁板姛鑳姐侀噸鏂板懡鍚嶃佸瓧絎︿覆鐨勬嫾鎺ョ瓑鍚勭鍔熻兘銆?br>
浜斻侀澶勭悊鎸囦護(hù)
棰勫鐞嗘寚浠ょ殑鏍煎紡濡備笅錛?br>
#directive tokens
#絎﹀彿搴旇鏄繖涓琛岀殑絎竴涓潪絀哄瓧絎︼紝涓鑸垜浠妸瀹冩斁鍦ㄨ搗濮嬩綅緗傚鏋滄寚浠や竴琛屾斁涓嶄笅錛屽彲浠ラ氳繃“\”榪涜鎺у埗錛屼緥濡傦細(xì)
#define Error if(error) exit(1)
絳変環(huán)浜?br>
#define Error \
if(error) exit(1)
涓嬮潰鎴戜滑鐪嬩竴涓嬪父瑙佺殑棰勫鐞嗘寚浠わ細(xì)
#define 瀹忓畾涔?br>#undef 鏈畾涔夊畯
#include 鏂囨湰鍖呭惈
#ifdef 濡傛灉瀹忚瀹氫箟灝辮繘琛岀紪璇?br>#ifndef 濡傛灉瀹忔湭琚畾涔夊氨榪涜緙栬瘧
#endif 緇撴潫緙栬瘧鍧楃殑鎺у埗
#if 琛ㄨ揪寮忛潪闆跺氨瀵逛唬鐮佽繘琛岀紪璇?br>#else 浣滀負(fù)鍏朵粬棰勫鐞嗙殑鍓╀綑閫夐」榪涜緙栬瘧
#elif 榪欐槸涓縐?else鍜?if鐨勭粍鍚堥夐」
#line 鏀瑰彉褰撳墠鐨勮鏁板拰鏂囦歡鍚嶇О
#error 杈撳嚭涓涓敊璇俊鎭?br>#pragma 涓虹紪璇戠▼搴忔彁渚涢潪甯歌鐨勬帶鍒舵祦淇℃伅
涓嬮潰鎴戜滑瀵硅繖浜涢澶勭悊榪涜涓涓鐨勮鏄庯紝鑰冭檻鍒板畯鐨勯噸瑕佹у拰綣佺悙鎬э紝鎴戜滑鎶婂畠鏀懼埌鏈鍚庤銆?br>
鍏佹枃浠跺寘鍚寚浠?br>
榪欑棰勫鐞嗕嬌鐢ㄦ柟寮忔槸鏈涓哄父瑙佺殑錛屽鉤鏃舵垜浠紪鍐欑▼搴忛兘浼?xì)鐢ㄥ垘图屾渶甯歌鐨勭敤娉曟槸錛?br>#include <iostream> //鏍囧噯搴撳ご鏂囦歡
#include <iostream.h> //鏃у紡鐨勬爣鍑嗗簱澶存枃浠?br>#include "IO.h" //鐢ㄦ埛鑷畾涔夌殑澶存枃浠?br>#include "../file.h" //UNIX涓嬬殑鐖剁洰褰曚笅鐨勫ご鏂囦歡
#include "/usr/local/file.h" //UNIX涓嬬殑瀹屾暣璺緞
#include "..\file.h" //Dos涓嬬殑鐖剁洰褰曚笅鐨勫ご鏂囦歡
#include "\usr\local\file.h" //Dos涓嬬殑瀹屾暣璺緞
錛堝叾瀹濪OS/Windows鐨勭洰褰曞垎闅斾篃鍙互鐢ㄦ枩鏉狅紝涓轟簡(jiǎn)鍜孶nix鍏煎錛屽氨緇熶竴鐢ㄦ枩鏉犲惂錛?br>
榪欓噷闈㈡湁2涓湴鏂硅娉ㄦ剰錛?br>
1銆佹垜浠敤<iostream>榪樻槸<iostream.h>?
鎴戜滑涓誨紶浣跨敤<iostream>錛岃屼笉鏄?lt;iostream.h>,涓轟粈涔堝憿錛熸垜鎯充綘鍙兘榪樿寰楁垜鏇劇粡緇欏嚭榪囧嚑鐐圭悊鐢憋紝榪欓噷鎴戝ぇ鑷寸殑璇翠竴涓嬶細(xì)
棣栧厛錛宧鏍煎紡鐨勫ご鏂囦歡鏃╁湪98騫?鏈堜喚灝辮鏍囧噯濮斿憳?shù)細(xì)鎶涘純浜?jiǎn)錛屾垜浠簲璇ョ揣璺熸爣鍑嗭紝浠ラ傚悎鏃朵唬鐨勫彂灞曘傚叾嬈★紝iostream.h鍙敮鎸佺獎(jiǎng)瀛楃闆嗭紝iostream鍒欐敮鎸佺獎(jiǎng)/瀹藉瓧絎﹂泦銆傝繕鏈夛紝鏍囧噯瀵筰ostream浣滀簡(jiǎn)寰堝鐨勬敼鍔紝鎺ュ彛鍜屽疄鐜伴兘鏈変簡(jiǎn)鍙樺寲銆傛渶鍚庯紝iostream緇勪歡鍏ㄩ儴鏀懼叆namespace std涓紝闃叉浜?jiǎn)鍚嶅瓧姹℃煋銆?br>
2銆?lt;io.h>鍜?io.h"鐨勫尯鍒紵
鍏跺疄浠栦滑鍞竴鐨勫尯鍒氨鏄悳绱㈣礬寰勪笉鍚岋細(xì)瀵逛簬#include <io.h> 錛岀紪璇戝櫒浠庢爣鍑嗗簱璺緞寮濮嬫悳绱㈠浜?include "io.h" 錛岀紪璇戝櫒浠庣敤鎴風(fēng)殑宸ヤ綔璺緞寮濮嬫悳绱€?br>
涓冦佺紪璇戞帶鍒舵寚浠?/span>
榪欎簺鎸囦護(hù)鐨勪富瑕佺洰鐨勬槸榪涜緙栬瘧鏃惰繘琛屾湁閫夋嫨鐨勬寫(xiě)閫夛紝娉ㄩ噴鎺変竴浜涙寚瀹氱殑浠g爜錛屼互杈懼埌鐗堟湰鎺у埗銆侀槻姝㈠鏂囦歡閲嶅鍖呭惈鐨勫姛鑳姐備嬌鐢ㄦ牸寮忥紝濡備笅錛?br>
1銆?ifdef identifier
濡傛灉identifier涓轟竴涓畾涔変簡(jiǎn)鐨勭鍙鳳紝your code灝變細(xì)琚紪璇戯紝鍚﹀垯鍓旈櫎銆?br>#ifdef identifier
your code
#endif
2銆?ifndef identifier
濡傛灉identifier涓轟竴涓湭瀹氫箟鐨勭鍙鳳紝your code灝變細(xì)琚紪璇戯紝鍚﹀垯鍓旈櫎銆?br>#ifndef identifier
your code
#endif
3銆?if expression
濡傛灉expression闈為浂錛寉our code灝變細(xì)琚紪璇戯紝鍚﹀垯鍓旈櫎銆?br>#if expression
your code
#endif
4銆?ifdef identifier
濡傛灉identifier涓轟竴涓畾涔変簡(jiǎn)鐨勭鍙鳳紝your code1灝變細(xì)琚紪璇戯紝鍚﹀垯your code2灝變細(xì)琚紪璇戙?br>#ifdef identifier
your code1
#else
your code2
#endif
5銆?else涓?elif
濡傛灉epression1闈為浂錛屽氨緙栬瘧your code1錛屽惁鍒欙紝濡傛灉expression2闈為浂錛屽氨緙栬瘧your code2錛屽惁鍒欙紝灝辯紪璇憏our code3銆?br>#if expressin1
your code1
#elif expression2 //鍛靛懙錛宔lif
your code2
#else
your code3
#enif
鍏朵粬棰勭紪璇戞寚浠ら櫎浜?jiǎn)涓婇潰鎴戜滑璇寸殑闆嗕腑甯哥敤鐨劸~栬瘧鎸囦護(hù)錛岃繕鏈?縐嶄笉澶父瑙佺殑緙栬瘧鎸囦護(hù)錛?line銆?error銆?pragma錛屾垜浠帴涓嬫潵灝辯畝鍗曠殑璋堜竴涓嬨?br>
6錛?line
璇硶濡備笅錛?br>
#line number filename
渚嬪錛?br>
#line 30 a.h
鍏朵腑錛屾枃浠跺悕a.h鍙互鐪佺暐涓嶅啓銆傝繖鏉℃寚浠ゅ彲浠ユ敼鍙樺綋鍓嶇殑琛屽彿鍜屾枃浠跺悕錛屼緥濡備笂闈㈢殑榪欐潯棰勫鐞嗘寚浠ゅ氨鍙互鏀瑰彉褰撳墠鐨勮鍙蜂負(fù)30錛屾枃浠跺悕鏄痑.h銆傚垵鐪嬭搗鏉ヤ技涔庢病鏈変粈涔堢敤錛屼笉榪囷紝浠栬繕鏄湁鐐圭敤鐨勶紝閭e氨鏄敤鍦ㄧ紪璇戝櫒鐨勭紪鍐欎腑錛屾垜浠煡閬撶紪璇戝櫒瀵笴++婧愮爜緙栬瘧榪囩▼涓細(xì)浜х敓涓浜涗腑闂存枃浠訛紝閫氳繃榪欐潯鎸囦護(hù)錛屽彲浠ヤ繚璇佹枃浠跺悕鏄浐瀹氱殑錛屼笉浼?xì)琚珮q欎簺涓棿鏂囦歡浠f浛錛屾湁鍒╀簬榪涜鍒嗘瀽銆?br>
7錛?error
璇硶濡備笅錛?br>
#error info
渚嬪錛?br>
#ifndef UNIX
#error This software requires the UNIX OS.
#endif
榪欐潯鎸囦護(hù)涓昏鏄粰鍑洪敊璇俊鎭紝涓婇潰鐨勮繖涓緥瀛愬氨鏄紝濡傛灉娌℃湁鍦║NIX鐜涓嬶紝灝變細(xì)杈撳嚭This software requires the UNIX OS.鐒跺悗璇卞彂緙栬瘧鍣ㄧ粓姝€傛墍浠ユ葷殑鏉ヨ錛岃繖鏉℃寚浠ょ殑鐩殑灝辨槸鍦ㄥ嚭鐜板叾瀹冪紪璇戦敊璇箣鍓嶈兘澶熺粰鍑轟竴瀹氱殑淇℃伅銆?br>
8錛?pragma
瀹冩槸闈炵粺涓鐨勶紝浠栬渚濋潬鍚勪釜緙栬瘧鍣ㄧ敓浜ц呫備緥濡俈C++涓細(xì)
#pragma comment(lib,"dllTest.lib")
瀵煎叆搴揹llTest.lib銆?br>
鍏侀瀹氫箟鏍囪瘑絎?/span>
涓轟簡(jiǎn)澶勭悊涓浜涙湁鐢ㄧ殑淇℃伅錛岄澶勭悊瀹氫箟浜?jiǎn)涓浜涢澶勭悊鏍囪瘑絎︼紝铏界劧鍚勭緙栬瘧鍣ㄧ殑棰勫鐞嗘爣璇嗙涓嶅敖鐩稿悓錛屼絾鏄粬浠兘浼?xì)澶勭悊涓嬮潰鐨?縐嶏細(xì)
__FILE__ 姝e湪緙栬瘧鐨勬枃浠剁殑鍚嶅瓧
__LINE__ 姝e湪緙栬瘧鐨勬枃浠剁殑琛屽彿
__DATE__ 緙栬瘧鏃跺埢鐨勬棩鏈熷瓧絎︿覆錛屼緥濡傦細(xì) "25 Dec 2000"
__TIME__ 緙栬瘧鏃跺埢鐨勬椂闂村瓧絎︿覆錛屼緥濡傦細(xì) "12:30:55"
渚嬪錛歝out<<"The file is :"<<__FILE__"<<"! The lines is:"<<__LINE__<<endl;
涔?jié)銆侀澶勭悊浣曞幓浣曚粠
濡備綍鍙栦唬#include棰勫鐞嗘寚浠わ紝鎴戜滑鍦ㄨ繖閲屽氨涓嶅啀涓涓璁ㄨ浜?jiǎn)銆侰++騫舵病鏈変負(fù)#include鎻愪緵鏇夸唬褰㈠紡錛屼絾鏄痭amespace鎻愪緵浜?jiǎn)涓縐嶄綔鐢ㄥ煙鏈哄埗錛屽畠鑳戒互鏌愮鏂瑰紡鏀寔緇勫悎錛屽埄鐢ㄥ畠鍙互鏀瑰杽#include鐨勮涓烘柟寮忥紝浣嗘槸鎴戜滑榪樻槸鏃犳硶鍙栦唬#include銆?br>
#pragma搴旇綆楁槸涓涓彲鏈夊彲鏃犵殑棰勫鐞嗘寚浠わ紝鎸夌収Bjarne鐨勮瘽璇達(dá)紝灝辨槸錛?#8220;#pragma琚繃鍒嗙殑緇忓父鐨勭敤浜庡皢璇█璇箟鐨勫彉褰㈤殣钘忓埌緙栬瘧緋葷粺閲岋紝鎴栬呰鐢ㄤ簬鎻愪緵甯︽湁鐗規(guī)畩璇箟鍜岀鎷欒娉曠殑璇█鎵╁厖銆?#8221;
瀵逛簬#ifdef錛屾垜浠粛鐒舵潫鎵嬫棤絳栵紝灝辯畻鏄垜浠埄鐢╥f璇彞鍜屽父閲忚〃杈懼紡錛屼粛鐒朵笉瓚充互鏇夸唬瀹冿紝鍥犱負(fù)涓涓猧f璇彞鐨勬鏂囧繀欏誨湪璇硶涓婃紜紝婊¤凍綾繪鏌ワ紝鍗充嬌浠栧鍦ㄤ竴涓粷涓嶄細(xì)琚墽琛岀殑鍒嗘敮閲岄潰銆?br>
鍗併侀緙栬瘧澶存枃浠剁殑琛ュ厖璇存槑
榪欓噷浠嬬粛VC6鐨勯緙栬瘧鍔熻兘鐨勪嬌鐢紝鐢變簬棰勭紪璇戣緇嗕嬌鐢ㄦ瘮杈冪殑澶嶆潅錛岃繖閲屽彧浠嬬粛鍑犱釜鏈閲嶈鐨勯緙栬瘧鎸囦護(hù): /Yu, /Yc,/Yx,/Fp銆傚叾瀹冪殑璇︾粏璧勬枡鍙互鍙傝?
MSDN -> Visual Studio 6.0 Document -> Visual C++ 6.0 Document -> VC++ Programmer Guider -> Compiler and Linker -> Details -> Creating Precompiled Header files
棰勭紪璇戝ご鐨勬蹇碉細(xì)
鎵璋撶殑棰勭紪璇戝ご灝辨槸鎶婁竴涓伐紼嬩腑鐨勯偅涓閮ㄥ垎浠g爜錛岄鍏堢紪璇戝ソ鏀懼湪涓涓枃浠墮噷錛堥氬父鏄互.pch涓烘墿灞曞悕鐨勶級(jí)錛岃繖涓枃浠跺氨縐頒負(fù)棰勭紪璇戝ご鏂囦歡榪欎簺棰勫厛緙栬瘧濂界殑浠g爜鍙互鏄換浣曠殑C/C++浠g爜錛岀敋鑷蟲(chóng)槸inline鐨勫嚱鏁幫紝浣嗘槸蹇呴』鏄ǔ瀹氱殑錛屽湪宸ョ▼寮鍙戠殑榪囩▼涓笉浼?xì)琚l忓父鏀瑰彉銆傚鏋滆繖浜涗唬鐮佽淇敼錛屽垯闇瑕侀噸鏂扮紪璇戠敓鎴愰緙栬瘧澶存枃浠躲傛敞鎰忕敓鎴愰緙栬瘧澶存枃浠舵槸寰堣楁椂闂寸殑銆傚悓鏃朵綘寰楁敞鎰忛緙栬瘧澶存枃浠墮氬父寰堝ぇ錛岄氬父鏈?-7M澶с傛敞鎰忓強(qiáng)鏃舵竻鐞嗛偅浜涙病鏈夌敤鐨勯緙栬瘧澶存枃浠躲?br>
涔熻浣犱細(xì)闂細(xì)鐜板湪鐨勭紪璇戝櫒閮芥湁Time stamp鐨勫姛鑳斤紝緙栬瘧鍣ㄥ湪緙栬瘧鏁翠釜宸ョ▼鐨勬椂鍊欙紝瀹冨彧浼?xì)缂栬瘧閭d簺缁彉q囦慨鏀圭殑鏂囦歡錛岃屼笉浼?xì)鍘痪~栬瘧閭d簺浠庝笂嬈$紪璇戣繃錛屽埌鐜板湪娌℃湁琚慨鏀硅繃鐨勬枃浠躲傞偅涔堜負(fù)浠涔堣繕瑕侀緙栬瘧澶存枃浠跺憿錛熺瓟妗堝湪榪欓噷錛屾垜浠煡閬撶紪璇戝櫒鏄互鏂囦歡涓哄崟浣嶇紪璇戠殑錛屼竴涓枃浠剁粡榪囦慨鏀瑰悗錛屼細(xì)閲嶆柊緙栬瘧鏁翠釜鏂囦歡錛屽綋鐒跺湪榪欎釜鏂囦歡閲屽寘鍚殑鎵鏈夊ご鏂囦歡涓殑涓滆タ錛?eg Macro, Preprocessor 錛夐兘瑕侀噸鏂板鐞嗕竴閬嶃俈C鐨勯緙栬瘧澶存枃浠朵繚瀛樼殑姝f槸榪欓儴鍒嗕俊鎭備互閬垮厤姣忔閮借閲嶆柊澶勭悊榪欎簺澶存枃浠躲?br>
鏍規(guī)嵁涓婃枃浠嬬粛錛岄緙栬瘧澶存枃浠剁殑浣滅敤褰撶劧灝辨槸鎻愰珮?shù)究瀹滈熷害浜?jiǎn)锛屾湁浜?jiǎn)瀹冧綘娌℃湁蹇呰姣忔閮界紪璇戦偅浜涗笉闇瑕佺粡甯告敼鍙樼殑浠g爜銆傜紪璇戞ц兘褰撶劧灝辨彁楂樹(shù)簡(jiǎn)銆備絾鏍規(guī)嵁鎴戠殑瀹炶返緇忛獙錛屼嬌鐢╒C6緙栬瘧鍣紝鍦ㄧ紪璇戜竴涓皬紼嬪簭鐨勬椂鍊欙紝鐢ㄤ笉鐢ㄩ緙栬瘧澶存枃浠訛紝鍩烘湰鐪嬩笉鍑虹紪璇戦熷害鐨勫樊璺濓紝鍙兘瀵逛簬涓涓ぇ鍨嬬▼搴忔潵璇達(dá)紝榪欑緙栬瘧閫熷害宸墠鑳戒綋鐜板嚭鏉ャ?br>
瑕佷嬌鐢ㄩ緙栬瘧澶達(dá)紝鎴戜滑蹇呴』鎸囧畾涓涓ご鏂囦歡錛岃繖涓ご鏂囦歡鍖呭惈鎴戜滑涓嶄細(xì)緇忓父鏀瑰彉鐨勪唬鐮佸拰鍏朵粬鐨勫ご鏂囦歡錛岀劧鍚庢垜浠敤榪欎釜澶存枃浠舵潵鐢熸垚涓涓緙栬瘧澶存枃浠訛紙.pch鏂囦歡錛夋兂蹇呭ぇ瀹墮兘鐭ラ亾 StdAfx.h榪欎釜鏂囦歡銆傚緢澶氫漢閮借涓鴻繖鏄疺C鎻愪緵鐨勪竴涓?#8220;緋葷粺綰у埆”鐨勶紝緙栬瘧鍣ㄥ甫鐨勪竴涓ご鏂囦歡銆傚叾瀹炰笉鏄殑錛岃繖涓枃浠跺彲浠ユ槸浠諱綍鍚嶅瓧鐨勩傛垜浠潵鑰冨療涓涓吀鍨嬬殑鐢盇ppWizard鐢熸垚鐨凪FC Dialog Based紼嬪簭鐨勯緙栬瘧澶存枃浠躲傦紙鍥犱負(fù)AppWizard浼?xì)湄?fù)鎴戜滑鎸囧畾濂藉浣曚嬌鐢ㄩ緙栬瘧澶存枃浠訛紝榛樿鐨勬槸StdAfx.h錛岃繖鏄疺C璧風(fēng)殑鍚嶅瓧錛夈傛垜浠細(xì)鍙戠幇榪欎釜澶存枃浠墮噷鍖呭惈浜?jiǎn)浠ヤ笅鐨勫ご鏂囦挥灱?xì)
#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鐨勫繀欏誨寘鍚殑澶存枃浠訛紝褰撶劧鎴戜滑涓嶅お鍙兘鍦ㄦ垜浠殑宸ョ▼涓慨鏀硅繖浜涘ご鏂囦歡鐨勶紝鎵浠ヨ浠栦滑鏄ǔ瀹氱殑銆?br>
閭d箞鎴戜滑濡備綍鎸囧畾瀹冩潵鐢熸垚棰勭紪璇戝ご鏂囦歡銆傛垜浠煡閬撲竴涓ご鏂囦歡鏄笉鑳界紪璇戠殑銆傛墍浠ユ垜浠繕闇瑕佷竴涓猚pp鏂囦歡鏉ョ敓鎴?pch 鏂囦歡銆傝繖涓枃浠墮粯璁ょ殑灝辨槸StdAfx.cpp銆傚湪榪欎釜鏂囦歡閲屽彧鏈変竴鍙ヤ唬鐮佸氨鏄細(xì)#include “Stdafx.h”銆傚師鍥犳槸鐞嗘墍褰撶劧鐨勶紝鎴戜滑浠呬粎鏄瀹冭兘澶熺紪璇戣屽凡鈥曗曗曚篃灝辨槸璇達(dá)紝瑕佺殑鍙槸瀹冪殑.cpp鐨勬墿灞曞悕銆傛垜浠彲浠ョ敤/Yc緙栬瘧寮鍏蟲(chóng)潵鎸囧畾StdAfx.cpp鏉ョ敓鎴愪竴涓?pch鏂囦歡錛岄氳繃/Fp緙栬瘧寮鍏蟲(chóng)潵鎸囧畾鐢熸垚鐨刾ch鏂囦歡鐨勫悕瀛椼傛墦寮project ->Setting->C/C++ 瀵硅瘽妗嗐傛妸Category鎸囧悜Precompiled Header銆傚湪宸﹁竟鐨勬爲(wèi)褰㈣鍥鵑噷閫夋嫨鏁翠釜宸ョ▼錛屽涓嬪浘錛?br>
錛堝浘錛戯級(jí)
鍦ㄥ浘涓垜浠殑Project Options(鍙充笅瑙掔殑閭d釜鐧界殑鍦版柟)鍙互鐪嬪埌 /Fp “debug/PCH.pch”錛岃繖灝辨槸鎸囧畾鐢熸垚鐨?pch鏂囦歡鐨勫悕瀛楋紝榛樿鐨勯氬父鏄<宸ョ▼鍚?gt;.pch錛堟垜鐨勭ず渚嬪伐紼嬪悕灝辨槸PCH錛夈?br>
鐒跺悗錛屽湪宸﹁竟鐨勬爲(wèi)褰㈣鍥鵑噷閫夋嫨StdAfx.cpp.濡傚浘錛?br>
錛堝浘錛掞級(jí)
榪欐椂鍘熸潵鐨凱roject Option鍙樻垚浜?Source File Option錛堝師鏉ユ槸宸ョ▼錛岀幇鍦ㄦ槸涓涓枃浠訛紝褰撶劧鍙樹(shù)簡(jiǎn)錛夈傚湪榪欓噷鎴戜滑鍙互鐪嬪埌 /Yc寮鍏籌紝/Yc鐨勪綔鐢ㄥ氨鏄寚瀹氳繖涓枃浠舵潵鍒涘緩涓涓狿ch鏂囦歡銆?Yc鍚庨潰鐨勬枃浠跺悕鏄偅涓寘鍚簡(jiǎn)紼沖畾浠g爜鐨勫ご鏂囦歡錛屼竴涓伐紼嬮噷鍙兘鏈変竴涓枃浠剁殑鍙互鏈塝C寮鍏熾俈C灝辨牴鎹繖涓夐」鎶?StdAfx.cpp緙栬瘧鎴愪竴涓狾bj鏂囦歡鍜屼竴涓狿CH鏂囦歡銆?br>
鐒跺悗鎴戜滑鍐嶉夋嫨涓涓叾瀹冪殑鏂囦歡鏉ョ湅鐪嬶紝濡傚浘錛?br>
錛堝浘3錛?br>
鍦ㄨ繖閲岋紝Precomplier 閫夋嫨浜?Use ………涓欏癸紝澶存枃浠舵槸鎴戜滑鎸囧畾鍒涘緩PCH 鏂囦歡鐨剆tdafx.h鏂囦歡銆備簨瀹炰笂錛岃繖閲屾槸浣跨敤宸ョ▼閲岀殑璁劇疆錛岋紙濡傚浘1錛?Yu "stdafx.h"銆?br>
榪欐牱錛屾垜浠氨璁劇疆濂戒簡(jiǎn)棰勭紪璇戝ご鏂囦歡銆備篃灝辨槸璇達(dá)紝鎴戜滑鍙互浣跨敤棰勭紪璇戝ご鍔熻兘浜?jiǎn)銆備互涓嬫槸娉ㄦ剰浜嬮」錛?br>
1錛屽鏋滀嬌鐢ㄤ簡(jiǎn)/Yu錛屽氨鏄浣跨敤浜?jiǎn)棰劸~栬瘧錛屾垜浠湪姣忎釜.cpp鏂囦歡鐨勬渶寮澶達(dá)紝鎴戝己璋冧竴閬嶆槸鏈寮澶達(dá)紝鍖呭惈浣犳寚瀹氫駭鐢焢ch鏂囦歡鐨?h鏂囦歡錛堥粯璁ゆ槸stdafx.h錛変笉鐒跺氨浼?xì)鏈夐棶棰樸傚鏋滀綘娌℃湁鍖呭惈榪欎釜鏂囦歡錛屽氨鍛婅瘔浣燯nexpected file end. 濡傛灉浣犱笉鏄湪鏈寮澶村寘鍚殑錛屼綘鑷繁璇曚互涓嬪氨鐭ラ亾浜?jiǎn)锛尵l濆鏈夊緢鎯婁漢鐨勬晥鏋溿?br>
2錛屽鏋滀綘鎶妏ch鏂囦歡涓嶅皬蹇?jī)涓簡(jiǎn)锛屾犚?guī)嵁浠ヤ笂鐨勫垎鏋愶紝浣犲彧瑕佽緙栬瘧鍣ㄧ敓鎴愪竴涓猵ch鏂囦歡灝卞彲浠ヤ簡(jiǎn)銆備篃灝辨槸璇存妸 stdafx.cpp錛堝嵆鎸囧畾/Yc鐨勯偅涓猚pp鏂囦歡錛夐噸鏂扮紪璇戜竴閬嶅氨鍙互浜?jiǎn)銆傚綋鐒朵綘鍙互鍌誨偦鐨?Rebuild all銆傜畝鍗曚竴鐐瑰氨鏄夋嫨閭d釜cpp鏂囦歡錛屾寜涓涓婥trl + F7灝卞彲浠ヤ簡(jiǎn)銆?/p>
1銆丟DI鍚嶅瓧鐨勬剰涔?br>GDI Graphic Device Interface錛屾垜璇翠笉娓呭拰GUI鏈変粈涔堝尯鍒傚彲鑳戒竴縐嶉拡瀵硅澶囷紝涓縐嶉拡瀵圭敤鎴瘋(gè)岃█鍚э紝鍙嶆浠ュ悗閮借GDI錛屼篃灝辨槸Windows鐨勫浘褰㈢紪紼嬨?br>
2銆佽澶囨弿榪頒笂涓嬫枃HDC
Handle Device Context
榪欎釜鏄叧閿殑鍏抽敭錛屽彲浠ョ悊瑙f垚鐢誨浘鐨勭幆澧冿紝浣曡皳鐜錛熺敾鏉匡紝綰革紝絎旓紝灝哄錛屽瓧浣擄紝棰滆壊錛屽尯鍩熺瓑銆傚弽姝e寘鎷綘鑳芥兂鍒扮殑鍜屾湭鑳芥兂鍒扮殑浜?jiǎn)銆傝鐢誨嚭涓嶅悓鐨勫浘褰紝寰堝ぇ紼嬪害涓婃槸瀵笻DC鐨勪慨鏀廣?br>
3銆丠DC鐨勫垱寤烘柟寮?br>WM_PAINT娑堟伅鏉ョ殑鏃跺欙紝鐢細(xì)
hdc = GetDC(hwnd);
//...
ReleaseDC(hwnd, hdc);
榪樻湁鍒殑鍔炴硶錛屼絾涓嶅父鐢紝榪欓噷鐣ヨ繃銆備笉榪囨湁涓涓繕鏄煎緱涓璇達(dá)紝閭e氨鏄彇寰梂indow HDC鐨勫姙娉曪紝鐢ㄥ畠鍙互鍦╓indows闈炲鎴峰尯鐢誨浘錛?/p>
4銆佽幏鍙朒DC淇℃伅
GetDeviceCaps()
鍏朵腑姣旇緝閲嶈鐨勬寚鏍囨槸錛?br>HORZRES - horizontal resolution
VERTRES - vertical resolution
BITSPIXEL - 鑹叉繁
5銆佷繚瀛楬DC涓庤繕鍘烪DC
6銆佺敾鍥劇敾鍥撅紒
7銆佺敾絎擧PEN錛堟敼鍙樼嚎鏉★級(jí)
鏂規(guī)硶1錛?br>HPEN hPen = GetStockObject(ARGUMENTS);
ARGUMENTS涓猴細(xì)BLACK_PEN 榛戠瑪WHITE_PEN 鐧界瑪
DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));
GetObject(hPen, sizeof(LOGPEN), (LPVOID)&logpen);
hPen = GetCurrentObject(hdc, OBJ_PEN);
8銆佽儗鏅ā寮?/span>
鏀瑰彉鑳屾櫙妯″紡錛屼篃灝辨槸鍒跺畾铏氱嚎闂撮棿闅欑殑濉厖闂?shù)簡(jiǎn)锛?xì)
9銆佸彔鍔犳ā寮?/span>
10銆佺敾鍒稨BRUSH錛堟敼鍙樺~鍏咃級(jí)
鐢誨埛鑳芥寚鏄庡尯鍩熷~鍏呮ā寮忋?br>鏂規(guī)硶1錛?/p>
HBRUSH hBrush = CreateSolidBrush(crColor);
HBRUSH hBrush = CreateHatchBrush(iHatchStyle, crColor);
11銆佸杈瑰艦濉厖妯″紡鍙?qiáng)鐢诲杈瑰?/span>
12銆佸尯鍩烪RGN錛堢粯鐢昏寖鍥達(dá)級(jí)
CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine); //iCombine: RGN_AND, RGN_OR, RGN_XOR, RGN_DIFF, RGN_COPY
FillRgn(); //濉厖鍖哄煙銆?/span> InvalidateRgn(hRgn);
FrameRgn(); //緇欏尯鍩熺敾杈廣?/span>
InvertRgn(); //鍙嶈漿鍖哄煙銆?/span>
HRGN hRgnPrev = SelectObject(hdc, hRgn); //灝嗗尯鍩熸斁緗叆HDC銆?/span>
ValidateRgn(hRgn);