锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
鍔熻兘:鎵撳紑鏁版嵁搴?濡傛灉涓嶅瓨鍦ㄥ垯鑷姩鍒涘緩.
PARAM1(IN): 鏁版嵁搴撴枃浠跺悕,UTF-8鏍煎紡
PARAM2(OUT): 榪斿洖鐨勬暟鎹簱鍙ユ焺
榪斿洖鍊?榪斿洖SQLITE_OK鎴愬姛,鍙嶄箣澶辮觸(鏁版嵁搴撳彞鏌刾pDb涓虹┖),澶辮觸鍊艱鍏蜂綋SQLITE_*瀹氫箟.
=====================================================================================
int sqlite3_close(sqlite3 *);
鍔熻兘:鍏抽棴鏁版嵁搴?br />PARAM1(IN):鎵撳紑鐨勬暟鎹簱鍙ユ焺
榪斿洖鍊?榪斿洖SQLITE_OK鎴愬姛,鍙嶄箣澶辮觸.
=====================================================================================
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be executed */
sqlite3_callback, /* Callback function */
void *, /* 1st argument to callback function */
char **errmsg /* Error msg written here */
);
鍔熻兘:鎵цSQL
PARAM1(IN):鏁版嵁搴撳彞鏌?br />PARAM2(IN):sql璇彞,浠0緇撳熬.
PARAM3(IN):鍥炶皟鍑芥暟
PARAM4(IN):鍥炶皟鍙傛暟
PARAM5(OUT):杈撳嚭閿欒淇℃伅
榪斿洖鍊?SQLITE_OK鎴愬姛,鍙嶄箣澶辮觸,澶辮觸鍚庨敊璇俊鎭PARAM5;
璇存槑錛氬鏋滄湁澶氭潯SQL璇彞,涓棿鐢ㄥ垎鍙?;)闅斿紑.鍥炶皟鍑芥暟鍜屽洖璋冨弬鏁伴氬父鍦ㄦ煡璇㈣鍙ヤ細鐢ㄥ埌,
瀵規瘡鏉℃煡璇㈢粨鏋滅粨鏋滈兘浼氳皟鐢ㄥ洖璋冨嚱鏁頒竴嬈?
鍥炶皟鍑芥暟鏍煎紡:
typedef int(*sqlite3_callback)(void *,int ,char **,char **);
鍙傛暟1:sqlite3_exec涓紶鍏ョ殑鍙傛暟
鍙傛暟2:鎬誨垪鏁?
鍙傛暟3:鍒楁暟鎹?char*)
鍙傛暟4:鍒楀悕縐?char*)
=====================================================================================
int sqlite3_get_table(
sqlite3*, /* An open database */
const char *sql, /* SQL to be executed */
char ***resultp, /* Result written to a char *[] that this points to */
int *nrow, /* Number of result rows written here */
int *ncolumn, /* Number of result columns written here */
char **errmsg /* Error msg written here */
);
鍔熻兘:鏌ヨ琛?br />PARAM1(IN):鏁版嵁搴撳彞鏌?br />PARAM2(IN):sql璇彞,浠0緇撳熬.
PARAM3(OUT):鏌ヨ緇撴灉
PARAM4(OUT):榪斿洖琛屾暟(澶氬皯鏉℃暟鎹?
PARAM5(OUT):榪斿洖鍒楁暟(澶氬皯瀛楁)
PARAM6(OUT):榪斿洖閿欒淇℃伅
榪斿洖鍊?SQLITE_OK鎴愬姛,鎴垮瓙澶辮觸瑙侀敊璇俊鎭?/p>
=====================================================================================
void sqlite3_free_table(char **result);
鍔熻兘:閲婃斁閫氳繃sqlite3_get_table鏌ヨ淇濆瓨鐨勭粨鏋滄暟鎹?br />PARAM1(IN):瑕侀噴鏀劇殑鏁版嵁鎸囬拡
=====================================================================================
int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nBytes, /* Length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
鍔熻兘:鏋勯犳煡璇?br />PARAM1(IN):鏁版嵁搴撳彞鏌?br />PARAM2(IN):sql璇彞
PARAM3(IN):sql璇彞闀垮害,璁劇疆鎴?1鍒欒嚜鍔ㄦ寜瀛楃涓茶綆梥ql璇彞闀垮害
PARAM4(OUT):淇濆瓨鐨勬煡璇㈢粨鏋勪綋,
PARAM5(OUT):NULL鍗沖彲
榪斿洖鍊?SQLITE_OK鎴愬姛.
=====================================================================================
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
鍔熻兘:涓烘煡璇㈢粨鏋勪綋緇戝畾鏁版嵁
PARAM1(IN):鏌ヨ緇撴瀯浣?br />PARAM2(IN):緇戝畾絎嚑涓暟鎹?sql璇彞涓殑絎嚑涓棶鍙??))
PARAM3(IN):浜岃繘鍒舵暟鎹寚閽?br />PARAM4(IN):浜岃繘鍒舵暟鎹暱搴?br />PARAM5(IN):鏋愭瀯鍥炶皟鍑芥暟,閫氬父璁劇疆NULL,緇撴潫鍚庤嚜宸遍噴鏀?br />榪斿洖鍊?S_OK鎴愬姛.
璇存槑:緇戝畾鍑芥暟蹇呴』瑕佸湪sqlite3_step鍓?sqlite3_prepare鎴栬卻qlite3_reset涔嬪悗璋冪敤.
鏈粦瀹氱殑鍙傛暟緙虹渷涓篘ULL,綾諱技鐨勭粦瀹氬嚱鏁拌繕鏈変互涓?br />int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite_int64);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
=====================================================================================
int sqlite3_reset(sqlite3_stmt *pStmt);
鍔熻兘:閲嶇疆鎵鏈夌粦瀹氱殑鍊?鍥炲埌鍒氬垰璋冪敤sqlite3_prepare鍚庣殑鐘舵?/p>
=====================================================================================
int sqlite3_step(sqlite3_stmt*);
鍔熻兘:鎵ц鏌ヨ
PARAM1:鏌ヨ緇撴瀯浣?br />榪斿洖鍊?
SQLITE_BUSY:鏁版嵁搴撹閿?鍙互絳夊緟閲婃斁鍚庨噸鏂拌皟鐢ㄨ鍑芥暟
SQLITE_DONE:鎴愬姛
SQLITE_ROW:鎴愬姛騫朵笖鏈夋暟鎹繑鍥?瀵規瘡鏌ヨ鍒頒竴鏉℃暟鎹兘浼氳繑鍥炶鍊?
鍙互璋冪敤sqlite3_column_*鍑芥暟鑾峰彇鏁版嵁鍚庨噸鏂拌皟鐢ㄥ鐞嗕笅涓鏉℃暟鎹?br />SQLITE_ERROR:澶辮觸
SQLITE_MISUSE:閿欒鐨勮皟鐢?姣斿宸茬粡榪斿洖浜哠QLITE_DONE鎴栬匰QLITE_ERROR鍚庤繕緇х畫璋冪敤璇ュ嚱鏁?/p>
=====================================================================================
int sqlite3_finalize(sqlite3_stmt *pStmt);
鍔熻兘:閲婃斁鏌ヨ緇撴瀯浣?/p>
=====================================================================================
int sqlite3_key(
sqlite3 *db, /* Database to be rekeyed */
const void *pKey, int nKey /* The key */
);
鍔熻兘:涓哄姞瀵嗙殑鏁版嵁搴撴寚瀹氬瘑鐮?鏀瑰嚱鏁板湪sqlite3_open涔嬪悗璋冪敤
=====================================================================================
int sqlite3_rekey(
sqlite3 *db, /* Database to be rekeyed */
const void *pKey, int nKey /* The new key */
);
鍔熻兘:閲嶈鏁版嵁搴撳瘑鐮?濡傛灉pKey = 0 鎴栬?nKey = 0,榪欐暟鎹簱涓嶅姞瀵?/p>
=====================================================================================
const char *sqlite3_libversion(void);
int sqlite3_libversion_number(void);
鍔熻兘:鑾峰彇鐗堟湰鍙?/p>
sqlite_int64 sqlite3_last_insert_rowid(sqlite3*);
鍔熻兘:鑾峰彇鏈鍚庢彃鍏ョ殑琛屾爣紺?
int sqlite3_changes(sqlite3*);
鍔熻兘:鑾峰彇鏈榪戞墽琛岀殑sqlite3_exec褰卞搷鐨勮鏁?
int sqlite3_total_changes(sqlite3*);
鍔熻兘:鑾峰彇鑷粠鏁版嵁搴撴墦寮鍚庢湁鏀瑰姩鐨勫嚱鏁?/p>
void sqlite3_interrupt(sqlite3*);
鍔熻兘:鎵撴柇鎴栧仠姝㈡暟鎹簱褰撳墠鎿嶄綔.
int sqlite3_complete(const char *sql);
鍔熻兘:鍒ゆ柇璇彞鏄惁浠ュ垎鍙?;)緇撳熬
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
鍔熻兘:璁劇疆鏌ヨ蹇欑鏃剁殑鍥炶皟澶勭悊
璇存槑:緙虹渷鐨勫洖璋冨嚱鏁頒負絀?濡傛灉鍥炶皟鍑芥暟涓虹┖,琛ㄩ攣瀹氬悗sqlite3_exec()鎵ц浼氱洿鎺ヨ繑鍥濻QLITE_BUSY
int sqlite3_busy_timeout(sqlite3*, int ms);
鍔熻兘:璁劇疆鏌ヨ瓚呮椂鏃墮棿(姣)
char *sqlite3_mprintf(const char*,...);
char *sqlite3_vmprintf(const char*, va_list);
char *sqlite3_snprintf(int,char*,const char*, ...);
鍔熻兘:鏍煎紡鍖栧瓧絎?闇瑕佺敤%q鏉ヤ唬鏇?s.(涓昏鏄笉鐢ㄥ鍒嗗彿'榪涜杞箟)
void *sqlite3_malloc(int);
void *sqlite3_realloc(void*, int);
void sqlite3_free(void*);
鍔熻兘:鍐呭瓨鍑芥暟
int sqlite3_set_authorizer(
sqlite3*,
int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
void *pUserData
);
鍔熻兘:璁劇疆鏁版嵁搴撴巿鏉?/p>
void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
void *sqlite3_profile(sqlite3*,
void(*xProfile)(void*,const char*,sqlite_uint64), void*);
void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
鍔熻兘:璁劇疆鎵ц鍥炶皟鍑芥暟,sqlite3_exec(),sqlite3_step() ,sqlite3_get_table()鏃朵細璋冪敤
void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
鍔熻兘:璁劇疆浜嬪姟鍥炶皟鍑芥暟
int sqlite3_errcode(sqlite3 *db);
const char *sqlite3_errmsg(sqlite3*);
鍔熻兘:鑾峰彇閿欒鐮佸拰閿欒娑堟伅
int sqlite3_bind_parameter_count(sqlite3_stmt*);
鍔熻兘:榪斿洖闇瑕佺粦瀹氱殑鍙傛暟鏁扮洰(sql璇彞涓棶鍙?鏁伴噺)
const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
鍔熻兘:鑾峰彇緇戝畾鍙傛暟鍚嶅瓧,?鍙傛暟榪斿洖NULL
int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
鍔熻兘:鑾峰彇緇戝畾鍙傛暟绱㈠紩
int sqlite3_clear_bindings(sqlite3_stmt*);
鍔熻兘:娓呴櫎緇戝畾鐨勫弬鏁?/p>
int sqlite3_column_count(sqlite3_stmt *pStmt);
鍔熻兘:鑾峰彇鍒楁暟
const char *sqlite3_column_name(sqlite3_stmt*,int);
鍔熻兘:鑾峰彇鍒楀悕
const char *sqlite3_column_database_name(sqlite3_stmt*,int);
const void *sqlite3_column_database_name16(sqlite3_stmt*,int);
const char *sqlite3_column_table_name(sqlite3_stmt*,int);
const void *sqlite3_column_table_name16(sqlite3_stmt*,int);
const char *sqlite3_column_origin_name(sqlite3_stmt*,int);
const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
鍔熻兘:榪斿洖鍒椾俊鎭?
const char *sqlite3_column_decltype(sqlite3_stmt *, int i);
鍔熻兘:榪斿洖鍒楁暟鎹被鍨?/p>
int sqlite3_data_count(sqlite3_stmt *pStmt);
鍔熻兘:榪斿洖鏁版嵁鏁伴噺(琛屾暟)
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
sqlite_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);
int sqlite3_column_numeric_type(sqlite3_stmt*, int iCol);
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
鍔熻兘:鑾峰彇鍒楁暟鎹?/p>
int sqlite3_create_function(
sqlite3 *,
const char *zFunctionName,
int nArg,
int eTextRep,
void*,
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
void (*xFinal)(sqlite3_context*)
);
鍔熻兘:
const void *sqlite3_value_blob(sqlite3_value*);
int sqlite3_value_bytes(sqlite3_value*);
int sqlite3_value_bytes16(sqlite3_value*);
double sqlite3_value_double(sqlite3_value*);
int sqlite3_value_int(sqlite3_value*);
sqlite_int64 sqlite3_value_int64(sqlite3_value*);
const unsigned char *sqlite3_value_text(sqlite3_value*);
const void *sqlite3_value_text16(sqlite3_value*);
const void *sqlite3_value_text16le(sqlite3_value*);
const void *sqlite3_value_text16be(sqlite3_value*);
int sqlite3_value_type(sqlite3_value*);
int sqlite3_value_numeric_type(sqlite3_value*);
鍔熻兘:綾諱技sqlite3_column_*鍑芥暟
鏈枃鐢?a >搴旀湁灝芥湁-搴旀湁灝芥湁緗戜負鎮ㄦ暣鐞嗘彁渚?/p>
銆?span class="t_tag" href="tag.php?name=%CA%F4%D0%D4">灞炴?/span>鏂歸潰
AfxDump
void AfxDump(const CObject* pOb);聽聽聽 // 濡傛灉鍦ㄨ皟璇曞櫒鍐呰皟鐢紝鍒欒漿瀛樺璞$殑鐘舵?br />
鍙傛暟錛?pOb 鎸囧悜鐢盋Object緇ф壙鐨勭被鐨勫璞$殑鎸囬拡銆?
璇存槑錛?br />鍦ㄨ皟璇曞櫒涓皟鐢ㄨ繖涓嚱鏁頒互鍦ㄨ皟璇曟椂杞偍瀵硅薄鐨勭姸鎬併侫fxDump璋冪敤涓涓璞$殑Dump鍑芥暟騫朵笖灝嗕俊鎭彂閫佸埌afxDump鍙橀噺鎸囧畾鐨勪綅緗侫fxDump浠呰兘鍦∕FC鐨勮皟璇曠増鏈腑浣跨敤銆?br />浣犵殑紼嬪簭浠g爜涓嶅簲璇ヨ皟鐢ˋfxDump錛岃屾槸搴旇璋冪敤閫傚綋瀵硅薄鐨凞ump鎴愬憳鍑芥暟銆?/p>
AfxDumpStack
void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT); // 鐢熸垚褰撳墠鏍堢殑涓涓槧鍍忥紝璇ュ嚱鏁伴氬父琚潤鎬侀摼鎺?br />
鍙傛暟錛?dwTarget 鎸囧嚭杞偍杈撳嚭鐨勭洰鏍囥傚叾鍙栧煎彲浠ョ敤浣嶆垨鎿嶄綔絎︼紙|錛夌粍鍚堣搗鏉ワ紝鍙兘鍊煎涓嬶細 路 AFX_STACK_DUMP_TARGET_TRACE 閫氳繃TRACE瀹忚緭鍑恒俆RACE浠呬粎鍦ㄨ皟璇曠増鏈腑浜х敓杈撳嚭錛屽湪鍙戣鐗堟湰涓笉浜х敓杈撳嚭銆傚悓鏃訛紝TRACE鍙互琚噸瀹氬悜鍒拌皟璇曞櫒浠ュ鐨勭洰鏍囥?
路 AFX_STACK_DUMP_TARGET_DEFAULT 灝嗚漿鍌ㄨ緭鍑哄彂閫佸埌緙虹渷鐩爣銆傚浜庤皟璇曠増鏈紝杈撳嚭鍙戦佺粰TRACE瀹忋傚湪鍙戣鐗堟湰涓紝杈撳嚭鍙戦佸埌鍓創鏉褲?
路 AFX_STACK_DUMP_TARGET_CLIPBOARD 杈撳嚭浠呭彂閫佸埌鍓創鏉褲傛暟鎹皢鎸塁F_TEXT鏍煎紡浠ユ櫘閫氭枃鏈殑褰㈠紡鏀懼湪鍓創鏉夸笂銆?
路 AFX_STACK_DUMP_TARGET_BOTH 鍚屾椂灝嗚緭鍑哄彂閫佸埌鍓創鏉垮拰TRACE瀹忋?
路 AFX_STACK_DUMP_TARGET_ODS 閫氳繃Win32鍑芥暟OutputDebugString()鐩存帴灝嗚緭鍑哄彂閫佺殑璋冭瘯鍣ㄣ傚鏋滆繛鎺ヤ簡璋冭瘯鍣紝瀹冨湪璋冭瘯鐗堟湰鍜屽彂琛岀増鏈腑閮戒細浜х敓璋冭瘯鍣ㄨ緭鍑恒侫FX_STACK_DUMP_TARGET_ODS 閫氬父鍒拌揪璋冭瘯鍣紙濡傛灉榪炴帴浜嗚皟璇曞櫒錛夛紝騫朵笖涓嶈兘琚噸瀹氬悜銆?
璇存槑錛?br />
榪欎釜鍏ㄥ眬鍑芥暟鍙互琚敤鏉ョ敓鎴愬綋鍓嶆爤鐨勪竴涓槧璞°備笅闈㈢殑渚嬪瓙鍙嶆槧浜哅FC瀵硅瘽妗嗗簲鐢ㄧ▼搴忎腑鎸夐挳澶勭悊鍑芥暟璋冪敤AfxDumpStack鎵浜х敓鐨勫崟琛岃皟璇曡緭鍑猴細
=== begin AfxDumpStack output ===
...
BFF928E0: WINDOWS\SYSTEM\KERNERL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===
BFF928E0錛?鏈榪戜竴嬈″嚱鏁拌皟鐢ㄧ殑榪斿洖鍦板潃
WINDOWS\SYSTEM\KERNEL32.DLL! 鍖呭惈鍑芥暟璋冪敤鐨勬ā鍧楃殑瀹屾暣璺緞鍚?
UTUnRegister 璋冪敤鐨勫嚱鏁板師鍨?
+ 2492 bytes 浠ュ瓧鑺備負鍗曚綅鐨勪粠鍑芥暟鍘熷瀷鍦板潃錛堣繖涓緥瀛愪腑涓篣TUnregister錛夊埌榪斿洖鍦板潃錛堣繖涓緥瀛愪腑涓築EF928E0錛夌殑鍋忕Щ
AfxDumpStack鍦∕FC搴撶殑璋冭瘯鐗堟湰鍜岄潪璋冭瘯鐗堟湰涓兘鍙互浣跨敤銆備絾鏄紝榪欎釜鍑芥暟閫氬父鏄潤鎬佽繛鎺ョ殑錛屽嵆浣夸綘鐨勫彲鎵ц鏂囦歡浠ュ叡浜獶LL鐨勬柟寮忎嬌鐢∕FC銆?br />
鍦ㄥ叡浜簱鐨勫疄鐜頒腑錛屽彲浠ュ湪MFCS42.LIB搴擄紙浠ュ強瀹冪殑鍙樺寲褰㈠紡錛変腑鎵懼埌榪欎釜鍑芥暟銆?br />
涓轟簡鎴愬姛鍦頒嬌鐢ㄨ繖涓嚱鏁幫細
聽聽聽聽聽聽聽 路 鍦ㄤ綘鐨勮礬寰勪腑蹇呴』鍖呭惈IMAGEHLP.DLL鏂囦歡銆傚鏋滀綘娌℃湁榪欎釜DLL鏂囦歡錛岃繖涓嚱鏁頒細鏄劇ず涓鏉¢敊璇俊鎭侷MAGEHLP.DLL鏄殢Win32 SDK鍜學indows涓璧峰彂鍞殑鍙暎鍙戠殑DLL銆傚湪C:\[Windows]\system[32]涓嬫煡鎵懼畠銆傛湁鍏矷MAGEHLP鎻愪緵鐨勫嚱鏁伴泦鐨勪粙緇嶅彲浠ュ弬鑰冣滃彲縐繪鐨勫彲鎵ц鏂囦歡鐨勬搷浣溾濅竴鏂囥?
聽聽聽聽聽聽聽 路 鍏鋒湁鏍堟鏋剁殑妯″潡蹇呴』鍖呭惈璋冭瘯淇℃伅銆傚鏋滃畠涓嶅寘鍚皟璇曚俊鎭紝榪欎釜鍑芥暟浠嶇劧浼氱敓鎴愬鏍堢殑璺熻釜錛屼絾鏄繖縐嶈窡韙槸寰堢畝鐣ョ殑銆?/p>
AfxEnableMemoryTracking
BOOL AfxEnableMemoryTracking(BOOL bTrack); // 鎵撳紑鎴栧叧闂唴瀛樿窡韙?br />
榪斿洖鍊鹼細浠ュ墠鐨勮窡韙厑璁哥姸鎬佽緗?br />
鍙傛暟錛?bTrack 灝嗚繖涓艱涓篢RUE鏃跺氨鎵撳紑浜嗗唴瀛樿窡韙壒鎬с傚鏋滄槸FALSE鍒欏皢鍏跺叧闂?
璇存槑錛?br />璇婃柇鍐呭瓨璺熻釜閫氬父鍦∕FC鐨勮皟璇曠増鏈腑鏈夋晥銆傚埄鐢ㄨ繖涓嚱鏁板浣犵殑浠g爜涓紜垎閰嶅唴瀛樼殑閮ㄥ垎紱佹璺熻釜銆?br />鏈夊叧AfxEnableMemoryTracking鐨勬洿澶氫俊鎭鍙傝銆奦isual C++紼嬪簭鍛樻寚鍗椼嬩腑鐨勨淢FC璋冭瘯鏀寔鈥濄?br />娉ㄦ剰錛氳繖涓嚱鏁頒粎鍦∕FC鐨勮皟璇曠増鏈腑璧蜂綔鐢ㄣ?/p>
AfxIsMemoryBlock
BOOL AfxIsMemoryBlock( const void* p, UINT nBytes, LONG* plRequestNumber = NULL ); // 媯楠屼竴涓唴瀛樺潡鏄惁琚紜殑鍒嗛厤
榪斿洖鍊鹼細
濡傛灉鍐呭瓨鍧楁槸鐜板湪鍒嗛厤鐨勶紝騫朵笖鍏墮暱搴︿篃鏄紜殑錛屽垯榪斿洖闈為浂鍊箋傚惁鍒欎負0銆?br />
鍙傛暟錛?p 鎸囧悜灝嗚嫻嬭瘯鐨勫唴瀛樺潡銆?
nBytes 鍖呭惈浜嗕互瀛楄妭涓哄崟浣嶇殑鍐呭瓨鍧楅暱搴︺?
plRequestNumber 鎸囧悜涓涓暱鏁存暟錛屽畠灝嗚璁句負鍐呭瓨鍧楃殑鍒嗛厤緋誨垪鍙風爜銆傜敱plRequestNumber鎸囧悜鐨勮繖涓彉閲忓彧鏈夊綋AfxIsMemoryBlock榪斿洖闈為浂鍊兼椂鎵嶄細琚~鍏呫?
璇存槑錛?br />媯嫻嬩竴涓唴瀛樺湴鍧錛岀‘淇濆畠浠h〃浜嗕竴涓敱new鐨勮瘖鏂増鏈垎閰嶇殑媧誨姩鐨勫唴瀛樺潡銆傚畠鍚屾椂涔熸楠屾寚瀹氱殑澶у皬鏄惁涓庢渶鍒濆垎閰嶇殑澶у皬鐩哥銆傚鏋滆繖涓嚱鏁拌繑鍥為潪闆跺鹼紝鍒嗛厤鐨勭郴鍒楀彿鐮佸皢鍦╬lRequestNumber涓繑鍥炪傝繖涓彿鐮佷唬琛ㄤ簡榪欎釜鍐呭瓨鍧楃浉瀵逛簬鍏跺畠鎵鏈夊唴瀛樺垎閰嶇殑欏哄簭銆?br />
紺轟緥錛?br />// AfxIsMemoryBlock鐨勪緥瀛?br />CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
ASSERT( AfxIsMemoryBlock( pcage, sizeof( CAge ) ) )
AfxIsValidString
BOOL AfxIsValidString( LPCSTR lpsz, int nLength = -1 ); // 媯楠屼竴涓瓧絎︿覆鎸囬拡鏄惁鏈夋晥
濡傛灉緇欏畾鐨勬寚閽堟寚鍚戜竴涓粰瀹氬ぇ灝忕殑瀛楃涓插垯榪斿洖闈為浂鍊鹼紝鍚﹀垯榪斿洖0銆?br />
鍙傛暟錛?lpsz 瑕佹祴璇曠殑鎸囬拡銆?
nLength 鎸囧畾瑕佹祴璇曠殑瀛楃涓茬殑闀垮害錛屼互瀛楄妭涓哄崟浣嶃傚鏋滃間負錛?錛岃〃紺哄瓧絎︿覆鏄互null緇撳熬鐨勩?
璇存槑錛?br />浣跨敤榪欎釜鍑芥暟鏉ョ‘瀹氭寚鍚戝瓧絎︿覆鐨勬寚閽堟槸鍚︽湁鏁堛?/p>
AfxSetAllocHook
AFX_ALLOC_HOOK AfxSetAllocHook( AFX_ALLOC_HOOK pfnAllocHook ); // 鍏佽鍦ㄦ瘡嬈¤繘琛屽唴瀛樺垎閰嶄簨璋冪敤涓涓嚱鏁?br />
濡傛灉浣犲笇鏈涘厑璁稿垎閰嶏紝鍒欒繑鍥為潪闆跺箋傚惁鍒欒繑鍥?銆?br />
鍙傛暟錛?pfnAllocHook 鎸囧畾瑕佽皟鐢ㄧ殑鍑芥暟鍚嶃傚弬鑰冨叧浜庡垎閰嶅嚱鏁扮殑鍘熷瀷鐨勮鏄庛?
璇存槑錛?br />榪欎釜鍑芥暟璁劇疆涓涓挬瀛愶紝浣挎瘡嬈″垎閰嶅唴瀛樹箣鍓嶉兘浼氳皟鐢ㄤ竴涓寚瀹氱殑鍑芥暟銆傚井杞熀紜綾誨簱涓殑璋冭瘯鍐呭瓨鍒嗛厤鍑芥暟鑳藉璋冪敤涓涓敤鎴峰畾涔夌殑閽╁瓙鍑芥暟錛屼嬌鐢ㄦ埛鑳藉鐩戞帶鍐呭瓨鍒嗛厤騫舵帶鍒舵槸鍚﹀厑璁稿垎閰嶅唴瀛樸傚唴瀛樺垎閰嶇殑閽╁瓙鍑芥暟鐨勫師鍨嬪涓嬶細
BOOL AFXAPI AllocHook( size_t nSize, BOOL bObject, LONG lRequestNumber );
nSize 璁″垝鍒嗛厤鐨勫唴瀛樺ぇ灝忋?
bObject 濡傛灉鏄涓轟竴涓狢Object媧劇敓綾誨璞″垎閰嶅唴瀛樺垯涓篢RUE錛屽惁鍒欎負FALSE銆?
lRequestNumber 鍐呭瓨鍒嗛厤鐨勭郴鍒楀彿銆?br />娉ㄦ剰錛孉FXAPI璋冪敤綰﹀畾鎰忓懗鐫璋冪敤鑰呭繀欏諱粠鏍堜腑娓呴櫎鍙傛暟銆?/p>
AfxDoForAllClasses
void AFXAPI AfxDoForAllClasses(
void (* pfn)(const CRuntimeClass* pClass, void* pContext),
void* pContext
); //瀵規墍鏈変粠CObject緇ф壙鐨勬敮鎸佽繍琛屾椂媯鏌ョ殑綾繪墽琛屼竴涓壒瀹氱殑鍔熻兘
鍙傛暟錛?pfn 鎸囧悜姣忎釜綾婚兘浼氳皟鐢ㄧ殑閲嶅鍑芥暟銆傝繖涓弬鏁版槸涓涓寚鍚慍RuntimeClass瀵硅薄鐨勬寚閽堜互鍙婃寚鍚戣皟鐢ㄨ呮彁渚涚粰鍑芥暟鐨勯檮鍔犳暟鎹殑void鎸囬拡銆?
pContext 鎸囧悜璋冪敤鑰呮彁渚涚粰閲嶅鍑芥暟鐨勫彲閫夋暟鎹殑鎸囬拡銆傝繖涓寚閽堝彲浠ユ槸NULL銆?
璇存槑錛?br />鍦ㄥ簲鐢ㄧ▼搴忕殑鍐呭瓨絀洪棿涓紝涓烘墍鏈変粠CObject緇ф壙鐨勫彲涓茶鍖栫殑綾昏皟鐢ㄦ寚瀹氱殑閲嶅鍑芥暟銆備粠CObject緇ф壙鐨勫彲涓茶鍖栫殑綾繪槸浠ECLARE_SERIAL瀹忕戶鎵跨殑銆傛瘡嬈¤皟鐢ㄦ寚瀹氱殑閲嶅鍑芥暟鏃訛紝閮戒細灝嗗湪pContext涓紶閫掔粰AfxDoForAllClasses鐨勬寚閽堜紶閫掔粰閲嶅鍑芥暟銆?br />娉ㄦ剰錛氳繖涓嚱鏁頒粎鍦∕FC鐨勮皟璇曠増鏈腑璧蜂綔鐢ㄣ?/p>
AfxDoForAllObjects
void AfxDoForAllObjects(
void (* pfn)(CObject* pObject, void* pContext),
void* pContext
); // 瀵規墍鏈変粠CObject緇ф壙鐨勭敤new鍒嗛厤鍐呭瓨瀵硅薄鎵ц涓涓寚瀹氱殑鍔熻兘
鍙傛暟錛歱fn 鎸囧悜姣忎釜瀵硅薄閮芥墽琛岀殑閲嶅鍑芥暟銆傚嚱鏁扮殑鍙傛暟鏄竴涓寚鍚慍Object鐨勬寚閽堜互鍙婃寚鍚戣皟鐢ㄨ呮彁渚涚粰鍑芥暟鐨勯檮鍔犳暟鎹殑void鎸囬拡銆?
pContext 鎸囧悜璋冪敤鑰呮彁渚涚粰鍑芥暟鐨勯檮鍔犳暟鎹殑鎸囬拡銆傝繖涓寚閽堝彲浠ヤ負NULL銆?
璇存槑錛?br />瀵規瘡涓敤new鍒嗛厤鐨勪粠CObject緇ф壙鐨勫璞℃墽琛屾寚瀹氱殑閲嶅鍑芥暟銆傛爤銆佸叏灞鍙橀噺鎴栧祵鍏ュ璞′笉鍖呮嫭鍦ㄥ唴銆傛瘡嬈¤皟鐢ㄦ寚瀹氱殑閲嶅鍑芥暟鏃訛紝閮戒細灝嗗湪pContext涓紶閫掔粰AfxDoForAllObjects鐨勬寚閽堜紶閫掔粰閲嶅鍑芥暟銆?br />娉ㄦ剰錛氳繖涓嚱鏁頒粎鍦∕FC鐨勮皟璇曠増鏈腑璧蜂綔鐢ㄣ?br />
from:http://hi.baidu.com/ice_water/blog/item/7cef04f73475c42a720eec98.html
鍦ㄩ渶瑕佸湪鐩稿簲鐨勫璇濇涓姞涓奍nitInstance錛坴oid錛夊嚱鏁頒腑娣誨姞
AfxInitRichEdit();
b.鍗囩駭榛樿鐨凴iched鐗堟湰(榛樿鐨勬湁涓浜沚ug)錛屽
鍙湪InitInstance涓坊鍔?br />LoadLibrary("RICHED20.DLL")
鏈鍚庢敞鎰?FreeLibrary
濡傛灉鏄疌RichEditView鍩虹被鐨勫彲鐢?br />BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)
{
//瑁呭叆rich edit version 2.0
if (LoadLibraryA("RICHED20.DLL") == NULL)
{
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
PostMessage(WM_QUIT,0,0);
return FALSE;
}
m_strClass = RICHEDIT_CLASSA;//for 2.0 class
return CRichEditView::PreCreateWindow(cs);
}
c.鏈鍚庤拷鍔犺
richeditctrl.SetSel(-1, -1);
richeditctrl.ReplaceSel( (LPCTSTR)str );
d.瀛楁暟闄愬埗
CRichEditCtrl::LimitText(long nChars)
e.鎹㈣鍒囨崲
CRichEditView鐨凮nInitialUpdate()鍑芥暟涓姞鍏ヤ笅闈袱鍙ワ細
m_nWordWrap = WrapNone;
WrapChanged();
WrapChanged瀹為檯涓婁篃鏄皟鐢?br />ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
榪樻湁涓嶅父鐢ㄧ殑 m_nWordWrap == WrapToTargetDevice
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
濡傛灉鏄湪Dialog涓紝鍙嬌鐢⊿etTargetDevice錛屾敞鎰忓湪灞炴ч噷闈㈠姞涓妛ant return
f.鏈夋椂鍊欎笉甯屾湜甯︽牸寮忕殑鏁版嵁綺樿創錛屽彲閫氳繃PasteSpecial閫夋嫨鎬х矘璐?br />pmyRichEditCtrl->PasteSpecial(CF_TEXT);
g.闅忕潃杈撳叆闅忕潃鑷姩婊氬姩鏉℃粴鍔ㄥ埌鏈鍚庝竴琛?br />int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
if (nFirstVisible > 0)
{
聽聽聽 pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
}
鎴?br />m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
h.璁劇疆UNDO鐨勬鏁?鍙兘鐢ㄥ湪RICHED20浠ヤ笂錛屽嵆榛樿涓嶆敮鎸侊紝蹇呴』鍗囩駭)
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
TM_MULTILEVELUNDO 鏀寔澶氬彇娑?榛樿鍊?.鍙氳繃EM_SETUNDOLIMIT璁劇疆鏈澶ф鏁?
SendMessage(EM_SETUNDOLIMIT,100,0);
i.鍝嶅簲OnChange
EM_SETEVENTMASK 璁劇疆 ENM_CHANGE
long lMask = GetEventMask();
lMask |= ENM_CHANGE;
lMask &= ~ENM_PROTECTED;
SetEventMask(lMask);
j.璁劇疆鍙
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
閫氳繃璁劇疆PROTECTED瀹炵幇閫変腑鐨勬枃鏈彧璇伙紝鍙傝
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/
浜?鍑芥暟搴旂敤
a.璁劇疆瀛椾綋錛堜富瑕佹槸閫氳繃SetSelectionCharFormat錛?br />CHARFORMAT cf;
rich.GetSelectionCharFormat(cf);
cf.dwMask|=CFM_BOLD;
cf.dwEffects|=CFE_BOLD;//璁劇疆綺椾綋錛屽彇娑堢敤cf.dwEffects&=~CFE_BOLD;
cf.dwMask|=CFM_ITALIC;
cf.dwEffects|=CFE_ITALIC;//璁劇疆鏂滀綋錛屽彇娑堢敤cf.dwEffects&=~CFE_ITALIC;
cf.dwMask|=CFM_UNDERLINE;
cf.dwEffects|=CFE_UNDERLINE;//璁劇疆鏂滀綋錛屽彇娑堢敤cf.dwEffects&=~CFE_UNDERLINE;
cf.dwMask|=CFM_COLOR;
cf.crTextColor = RGB(255,0,0);//璁劇疆棰滆壊
cf.dwMask|=CFM_SIZE;
cf.yHeight =200;//璁劇疆楂樺害
cf.dwMask|=CFM_FACE;
strcpy(cf.szFaceName ,_T("闅朵功"));//璁劇疆瀛椾綋
rich.SetSelectionCharFormat(cf);
b.璁劇疆瀛椾綋鐨勮闂磋窛
瑕佺敤richedit2.0浠ヤ笂
璇曡瘯
PARAFORMAT2 pf;
pf.cbSize = sizeof(PARAFORMAT2);
pf.dwMask = PFM_NUMBERING | PFM_OFFSET;
pf.wNumbering = PFN_BULLET;//娉ㄦ剰PFM_NUMBERING
pf.dxOffset = 10;
VERIFY(SetParaFormat(pf));
甯哥敤鐨刣wMask鏈?br />PFM_NUMBERING 鎴愬憳 wNumbering 鎵嶈搗浣滅敤錛岄」鐩鍙鳳紝榛樿鐢≒FN_BULLET
2 浣跨敤闃挎媺浼暟瀛?(1, 2, 3, ...).聽
3 浣跨敤灝忓啓瀛楁瘝 (a, b, c, ...).聽
4 浣跨敤澶у啓瀛楁瘝 (A, B, C, ...).聽
5 浣跨敤灝忓啓緗楅┈鏁板瓧 (i, ii, iii, ...).聽
6 浣跨敤澶у啓緗楅┈鏁板瓧 (I, II, III, ...).聽
7 鑷畾涔夛紝瀛楃瑙佹垚鍛?wNumberingStart.聽
PFM_OFFSET 鎴愬憳 dxOffset 鎵嶈搗浣滅敤錛岀緝榪涳紝鍗曚綅twips
PFM_STARTINDENT 鎴愬憳 dxStartIndent 鎵嶈搗浣滅敤錛岄琛岀緝榪?br />PFM_SPACEAFTER 鎴愬憳 dySpaceAfter 鎵嶈搗浣滅敤錛屾闂磋窛
PFM_LINESPACING 鎴愬憳 dyLineSpacing 鎵嶈搗浣滅敤錛岃闂磋窛
c.璁劇疆CRichEditCtrl(2.0)鑳屾櫙閫忔槑
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
style &= WS_EX_TRANSPARENT;
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
鎴?CreateEx錛岀劧鍚庢妸WS_EX_TRANSPARENT鏍峰紡鍔犱笂
e.寰楀埌鍐呭鏈変笁縐?br />1)GetWindowText
2)浣跨敤EM_GETTEXTEX
GETTEXTEX gt;
gt.cb = 200;
gt.flags = GT_DEFAULT;
gt.codepage = CP_ACP ;
gt.lpDefaultChar = NULL;
gt.lpUsedDefChar = NULL;
SendMessage(EM_GETTEXTEX,(WPARAM)>,(LPARAM)text);
3)StreamOut(涓昏鐢ㄤ簬RTF絳夋牸寮忚緭鍑?
static DWORD CALLBACK
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
聽聽聽 CFile* pFile = (CFile*) dwCookie;
聽聽聽 pFile->Write(pbBuff, cb);
聽聽聽 *pcb = cb;
聽聽聽 return 0;
}
聽聽聽 CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
聽聽聽 EDITSTREAM es;
聽聽聽 es.dwCookie = (DWORD) &cFile;//璁劇疆鐢ㄤ緥鍙傛暟,浠ヤ究鍥炶皟鍑芥暟璋冪敤
聽聽聽 es.pfnCallback = MyStreamOutCallback;
聽聽聽 pmyRichEditCtrl->StreamOut(SF_RTF, es);
璇誨叆鍙互姝ょ被鎺紝SetWindowText,EM_SETTEXTEX,StreamIn
f.鏌ユ壘瀛楃涓?br />FINDTEXTEX ft;
ft.chrg.cpMin = 0;
ft.chrg.cpMax = -1;
ft.lpstrText = "|";
long lPos = FindText(0, &ft);
濡傛灉瑕佺戶緇煡鎵撅紝淇敼cpMin,濡?br />int nCount = 0;
do
{
long lPos = GetRichEditCtrl().FindText(0, &ft);
if( -1 == lPos) break;
ft.chrg.cpMin = lPos + strlen(ft.lpstrText);
++nCount;
}while(TRUE);
g.浠tml鏍煎紡淇濆瓨
鐩墠鍋氭硶鍙厛杞負RTF鏍煎紡錛屽啀閫氳繃RTF-to-HTML Converter
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/
h.閲嶈澆OnProtected鍑芥暟寰楀埌瀵瑰簲鐨勬秷鎭紝濡傜矘璐寸瓑
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
{
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
switch (pEP->msg) {
case WM_KEYDOWN://鎸夐敭錛屽垽鏂璸EP->wParam
case WM_PASTE://綺樿創
case WM_CUT://鍓垏
case EM_SETCHARFORMAT:
default:
聽聽 break;
};
*pResult = FALSE;
}
涓?鑱婂ぉ甯哥敤聽
a.LINK 閾炬帴鍔熻兘
1.聽聽 LoadLibrary(_T("Riched20.dll"));
2. 鍒涘緩RichEdit2.0鎺т歡
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
聽聽聽聽聽聽聽聽聽聽 rect.left, rect.top, cx, cy,
聽聽 pParentWnd->m_hWnd, (HMENU)nID, NULL);
3. 璁懼畾閫変腑鐨勬枃瀛椾負閾炬帴鏄劇ず
CHARFORMAT2 cf2;
ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_LINK;
cf2.dwEffects |= CFE_LINK;
m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
4.鏀寔閾炬帴鐨勭偣鍑誨搷搴?br />m_cRichEdit.SetEventMask(ENM_LINK);
5.鍝嶅簲閾炬帴鐨勭偣鍑籈N_LINK
BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
ON_NOTIFY_REFLECT(EN_LINK,OnURL)
END_MESSAGE_MAP()
......
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
{
TCHAR LinkChar[512];
ENLINK *pLink = (ENLINK *)pNmhdr;
if (pLink->msg == WM_LBUTTONUP)
{
SetSel(penLink->chrg);//榪欐槸閾炬帴鐨勬枃瀛楄寖鍥?br />long Res = GetSelText((char *)LinkChar);//榪欐槸閾炬帴鏂囧瓧
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //鍚庨潰鏄綘鐨勫鐞嗚繃紼?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ......
聽聽聽聽聽聽聽聽聽 }
}
b.鎻掑叆浣嶅浘
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/
鑷畾涔夊湪RichEdit涓彃鍏ュ璞$殑鍥炬爣
http://www.blogcn.com/user3/jiangsheng/blog/1319738.html
鏂規硶鍩烘湰鍚孠nowledge Base鏂囩珷Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
鍙槸鍦ㄦ渶鍚庢彃鍏ヤ箣鍓嶈皟鐢ㄤ竴涓婭OleCache::SetData,鐢ㄤ竴涓狧GLOBAL浣滀負鍙傛暟錛孒GLOBAL閲岄潰鐨勬暟鎹槸涓涓狹ETAFILEPICT緇撴瀯錛屽寘鍚嚜宸辨彁渚涚殑鍥劇墖
浣跨敤CRichEditView::InsertFileAsObject灝卞彲浠ユ彃鍏ュ浘鍍忋俈C++甯︽湁涓涓緥瀛怶ordPad銆?br />鍙﹀鍙互鍙傝冣淚nsert any HBITMAP (Bitmap) in your RichEdit Control鈥?http://www.codeguru.com/richedit/richeditrc.html)銆?/p>
c.鏄劇ずGIF鍔ㄧ敾
甯哥敤鐨勬槸閫氳繃qq鐨刬mageole.dll(涔熸湁鐢℅if89.dll鐨?
http://www.xiaozhou.net/cooldog/blogview.asp?logID=82
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
鍦╮ichedit鎺т歡涓彃鍏ュ姩鎬丟IF (Native C++鐗?
http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx
d.IRichEditOleCallback鐨勪嬌鐢?br />http://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022
綾諱技 MSN 淇℃伅鍙戦佹鐨勫埗浣?涓?
http://www.vckbase.com/document/viewdoc/?id=1087
鍐呭鍖呭惈錛氬疄鐜板彸閿彍鍗曪紝鍥劇墖鎻掑叆錛岃鍙?鍐欏叆RTF鏍煎紡瀛楃涓?/p>
鑷畾涔?CRichEditCtrl 鎺т歡
http://www.vckbase.com/document/viewdoc/?id=328
鍐呭鍖呭惈錛氶紶鏍囧彸閿秷鎭紝娑堟伅鏄犲皠錛屽瓧浣撳彉鎹?/p>
PS.richedit鎺т歡鍗囩駭鍒?.0鍚庯紝鍏堟妸瀛椾綋璁句負妤蜂綋錛岃緭鍏ユ眽瀛楁病鏈夐棶棰橈紝浣嗚緭鍏ュ瓧姣嶆椂錛屽瓧姣嶈嚜鍔ㄨ煩杞負Arial瀛椾綋錛岃?.0鍗存病鏈夎繖涓枃棰橈紝浠嶇劧鏄敤妤蜂綋鏄劇ず瀛楁瘝
鏄竴涓笓闂ㄧ殑璁捐 Dual-font, Smart font apply, 鍙傝 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
涓嶈兘鏄劇ず鍥劇墖絳夊叾浠朞LE瀵硅薄
MFC鎻愪緵鐨凜RichEditCtrl娌℃湁鎻愪緵鐩存帴鏄劇ず鍥劇墖絳塐LE瀵硅薄鐨勫睘鎬ф垨鏂規硶璁劇疆錛屼絾鏄彁渚涗簡涓涓帴鍙etOLECallback( IRichEditOleCallback* pCallback );
瑕佽CRichEditCtrl鏄劇ず鍥劇墖錛屽氨寰楀湪IRichEditOleCallback涓婁笅鍔熷か銆?br />IRichEditOleCallback鏄痺indows涓殑鎺ュ彛錛屽畠鐨勫畾涔夊涓嬶細
ContextSensitiveHelp:
聽聽聽 閫氳繃璇ユ柟娉曢氱煡搴旂敤紼嬪簭瀹冨皢浠ヤ笂涓嬫枃鍏寵仈鏂瑰紡璋冨害甯姪銆?br />DeleteObject:
聽聽聽 閫氳繃璇ユ柟娉曞彂鍑洪氱煡錛氫竴涓璞″嵆灝嗕粠RichEdit鎺т歡涓垹闄?br />GetClipboardData:
聽聽聽 閫氳繃璇ユ柟娉曞厑璁窻ichEdit鐨勫鎴風錛堣皟鐢ㄧ▼搴忥級鎻愪緵鑷繁鐨勭矘璐村璞?br />GetContextMenu:
聽聽聽 閫氳繃璇ユ柟娉曞悜搴旂敤紼嬪簭鎻愬嚭閫氳繃榧犳爣鍙抽敭浜嬩歡鏉ヨ幏鍙栦笂涓嬫枃鑿滃崟鐨勮姹?br />GetDragDropEffect:
聽聽聽 閫氳繃璇ユ柟娉曞厑璁窻ichEdit鐨勫鎴風錛堣皟鐢ㄧ▼搴忥級璁劇疆鎷栧姩鎿嶄綔鐨勬晥鏋?br />GetInPlaceContext:
聽聽 閫氳繃璇ユ柟娉曟彁渚涗簡搴旂敤紼嬪簭綰у拰鏂囨。綰ф帴鍙o紝浠ュ強蹇呰鐨勬敮鎸両n-place嬋媧葷殑淇℃伅
GetNewStrorage:
聽聽聽 閫氳繃璇ユ柟娉曞瓨鍌ㄤ粠綺樿創鏉挎垨瓚呮枃鏈祦(RTF)涓鍙栫殑鏂板璞?br />QueryAcceptData:
聽聽聽 閫氳繃璇ユ柟娉曞喅瀹氬湪綺樿創鎿嶄綔鎴栨嫋鏀炬搷浣滀腑寮曞叆鐨勬暟鎹槸鍚﹀彲浠ヨ鎺ュ彈銆?br />QueryInsertObject:
聽聽聽 閫氳繃璇ユ柟娉曞悜搴旂敤紼嬪簭璇㈤棶鏌愪釜瀵硅薄鏄惁鍙互琚彃鍏?br />ShowContainerUI:
聽聽聽 閫氳繃璇ユ柟娉曞憡鐭ュ簲鐢ㄧ▼搴忔槸鍚︽樉紺鴻嚜宸辯殑鎿嶄綔鐣岄潰
澶ц嚧浜嗚В浜咺RichEditOleCallback鎺ュ彛鍚庯紝灝卞簲璇ユ竻妤氾紝瑕佹樉紺哄浘鐗囩瓑ole瀵硅薄錛岃嚦灝戝簲璇ュ疄鐜癎etNewStorage鏂規硶錛屽洜涓鴻鏂規硶鏄瓨鍌╫le瀵硅薄鐨勬帴鍙f柟娉曘?/p>
浠ヤ笅鏄帴鍙e0鏄庣殑浠g爜錛?br />聽聽聽 interface IExRichEditOleCallback;聽聽 // forward declaration (see below in this header file)
聽聽 IExRichEditOleCallback* m_pIRichEditOleCallback;
聽聽 BOOL m_bCallbackSet;
聽聽
聽聽
聽聽 interface IExRichEditOleCallback : public IRichEditOleCallback
聽聽 {
聽聽 public:
聽聽聽聽聽聽 IExRichEditOleCallback();
聽聽聽聽聽聽 virtual ~IExRichEditOleCallback();
聽聽聽聽聽聽 int m_iNumStorages;
聽聽聽聽聽聽 IStorage* pStorage;
聽聽聽聽聽聽 DWORD m_dwRef;
聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg);
聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);
聽聽聽聽聽聽 virtual ULONG STDMETHODCALLTYPE AddRef();
聽聽聽聽聽聽 virtual ULONG STDMETHODCALLTYPE Release();
聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR *lplpFrame,
聽聽聽聽聽聽聽聽聽聽 LPOLEINPLACEUIWINDOW FAR *lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *lpcfFormat,
聽聽聽聽聽聽聽聽聽聽 DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR *lpchrg, DWORD reco, LPDATAOBJECT FAR *lplpdataobj);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);
聽聽聽聽聽聽聽 virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR *lpchrg,
聽聽聽聽聽聽聽聽聽聽 HMENU FAR *lphmenu);
聽聽 };
-----------------------------------------------------------------------
娉細
聽聽聽聽聽聽聽 m_edit1浠h〃ID涓篒DC_EDIT1鐨凜Edit鎺т歡鐨刢ontrol綾誨瀷鐨勫彉閲?br />聽聽聽聽聽聽聽 m_richedit1浠h〃ID涓篒DC_RICHEDIT1鐨凜RichEditCtrl鎺т歡鐨刢ontrol綾誨瀷鐨勫彉閲?/p>
--------------------------------------------------------------------------------
1.璁劇疆edit鍙灞炴?/p>
聽聽聽 鏂規硶涓錛?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 m_edit1.SetReadOnly(TRUE);
聽聽聽 鏂規硶浜岋細
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);
--------------------------------------------------------------------------------
2.鍒ゆ柇edit涓厜鏍囩姸鎬佸茍寰楀埌閫変腑鍐呭(richedit鍚屾牱閫傜敤)
聽聽聽聽聽聽聽 int nStart, nEnd;
聽聽聽聽聽聽聽 CString strTemp;
聽聽聽聽聽聽聽 m_edit1.GetSel(nStart, nEnd);
聽聽聽聽聽聽聽 if(nStart == nEnd)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 strTemp.Format(_T("鍏夋爣鍦?d"), nStart);
聽聽聽聽聽聽聽聽聽聽聽 AfxMessageBox(strTemp);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 else
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 //寰楀埌edit閫変腑鐨勫唴瀹孤犅犅?
聽聽聽聽聽聽聽聽聽聽聽 m_edit1.GetWindowText(strTemp);
聽聽聽聽聽聽聽聽聽聽聽 strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
聽聽聽聽聽聽聽聽聽聽聽 AfxMessageBox(strTemp);
聽聽聽聽聽聽聽 }
聽聽聽 娉細GetSel鍚庯紝濡傛灉nStart鍜宯End錛岃〃鏄庡厜鏍囧浜庢煇涓綅緗紙鐩磋鏉ョ湅灝辨槸鍏夋爣鍦ㄩ棯鍔級錛?br />聽聽聽聽聽聽聽聽聽聽聽聽 濡傛灉nStart鍜宯End涓嶇浉絳夛紝琛ㄦ槑鐢ㄦ埛鍦╡dit涓変腑浜嗕竴孌靛唴瀹廣?/p>
--------------------------------------------------------------------------------
3.鍦╡dit鏈鍚庢坊鍔犲瓧絎︿覆
聽聽聽聽聽聽聽 CString str;
聽聽聽聽聽聽聽 m_edit1.SetSel(-1, -1);
聽聽聽聽聽聽聽 m_edit1.ReplaceSel(str);
--------------------------------------------------------------------------------
4.闅忚緭鍏ヨ嚜鍔ㄦ粴鍔ㄥ埌鏈鍚庝竴琛?richedit鍚屾牱閫傜敤)
聽聽聽 鏂規硶涓錛氾紙鎽樿嚜msdn錛?br />聽聽聽聽聽聽聽 // The pointer to my edit.
聽聽聽聽聽聽聽 extern CEdit* pmyEdit;
聽聽聽聽聽聽聽 int nFirstVisible = pmyEdit->GetFirstVisibleLine();
聽聽聽聽聽聽聽 // Scroll the edit control so that the first visible line
聽聽聽聽聽聽聽 // is the first line of text.
聽聽聽聽聽聽聽 if (nFirstVisible > 0)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 pmyEdit->LineScroll(-nFirstVisible, 0);
聽聽聽聽聽聽聽 }
聽聽聽 鏂規硶浜岋細
聽聽聽聽聽聽聽 m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
--------------------------------------------------------------------------------
5.濡備綍闄愬埗edit杈撳叆鎸囧畾瀛楃
聽聽 鍙互浠嶤Edit媧劇敓涓涓被錛屾坊鍔燱M_CHAR娑堟伅鏄犲皠銆備笅闈竴涓緥瀛愬疄鐜頒簡闄愬畾杈撳叆16榪涘埗瀛楃鐨勫姛鑳姐?/p>
聽聽 void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
聽聽 {
聽聽聽聽聽聽聽 if ( (nChar >= '0' && nChar <= '9') ||
聽聽聽聽聽聽聽聽聽聽聽聽 (nChar >= 'a' && nChar <= 'f') ||
聽聽聽聽聽聽聽聽聽聽聽聽 (nChar >= 'A' && nChar <= 'F') ||
聽聽聽聽聽聽聽聽聽聽聽聽聽 nChar == VK_BACK ||
聽聽聽聽聽聽聽聽聽聽聽聽聽 nChar == VK_DELETE)聽聽聽 //msdn鐨剉irtual key
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 CEdit::OnChar(nChar, nRepCnt, nFlags);
聽聽聽聽聽聽聽 }聽聽聽聽
聽聽 }
--------------------------------------------------------------------------------
6.濡備綍浣跨敤richedit
聽聽聽 娣誨姞AfxInitRichEdit();
聽聽聽聽聽聽 CxxxApp::InitInstance()
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽 AfxInitRichEdit();
聽聽聽聽聽聽聽聽聽 .............
聽聽聽聽聽聽 }
聽聽 AfxInitRichEdit()鍔熻兘錛氳杞?RichEdit 1.0 Control (RICHED32.DLL).
--------------------------------------------------------------------------------
7.濡備綍浣跨敤richedit2.0 or richedit3.0
聽聽聽 浣跨敤鍘熷洜錛氱敱浜嶳ichEdit2.0A鑷姩涓哄瀛楃錛圵ideChar錛夛紝鎵浠ュ畠鍙互瑙e喅涓枃涔辯爜浠ュ強涓浜涙眽瀛楅棶棰?/p>
聽聽聽 鏂規硶涓錛氾紙msdn涓婄殑鍋氭硶錛岄傜敤浜庣敤VC.NET鍙婁互鍚庣増鏈垱寤虹殑宸ョ▼錛?br />聽聽聽聽聽聽聽聽聽聽聽 To update rich edit controls in existing Visual C++ applications to version 2.0,
聽聽聽聽聽聽聽聽聽聽聽 open the .RC file as text, change the class name of each rich edit control from聽聽 "RICHEDIT" to聽 "RichEdit20a".
聽聽聽聽聽聽聽聽聽聽聽 Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
聽聽聽 鏂規硶浜岋細浠ュ璇濇涓轟緥錛?br />聽聽聽聽聽聽 (1)聽聽聽 澧炲姞涓鍏ㄥ眬鍙橀噺 HMODULE hMod;
聽聽聽聽聽聽 (2)聽聽聽 鍦–xxxApp::InitInstance()涓坊鍔犱竴鍙Mod = LoadLibrary(_T("riched20.dll"));
聽聽聽聽聽聽聽聽聽聽聽聽聽 鍦–xxxApp::ExitInstance()涓坊鍔犱竴鍙reeLibrary(hMod);
聽聽聽聽聽聽 (3)聽聽聽聽聽 鍦ㄥ璇濇涓婃斁涓涓猺ichedit錛屾枃鏈柟寮忔墦寮.rc鏂囦歡淇敼璇ichedit鎺т歡鐨勭被鍚?RICHEDIT" to聽 "RichEdit20a".
聽聽聽聽聽聽 (4)聽聽聽聽聽 鍦ㄥ璇濇澶存枃浠舵坊鍔?CRichEditCtrl m_richedit;
聽聽聽聽聽聽聽聽聽聽聽聽聽 鍦∣nInitDialog涓坊鍔?m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);
--------------------------------------------------------------------------------
8.鏀瑰彉richedit鎸囧畾鍖哄煙鐨勯鑹插強瀛椾綋
聽聽聽聽聽聽聽 CHARFORMAT cf;
聽聽聽聽聽聽聽 ZeroMemory(&cf, sizeof(CHARFORMAT));
聽聽聽聽聽聽聽 cf.cbSize = sizeof(CHARFORMAT);
聽聽聽聽聽聽聽 cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
聽聽聽聽聽聽聽 cf.dwEffects = 0;
聽聽聽聽聽聽聽 cf.yHeight = 12*12;//鏂囧瓧楂樺害
聽聽聽聽聽聽聽 cf.crTextColor = RGB(200, 100, 255); //鏂囧瓧棰滆壊
聽聽聽聽聽聽聽 strcpy(cf.szFaceName ,_T("闅朵功"));//璁劇疆瀛椾綋
聽聽聽
聽聽聽聽聽聽聽 m_richedit1.SetSel(1, 5); //璁劇疆澶勭悊鍖哄煙
聽聽聽聽聽聽聽 m_richedit1.SetSelectionCharFormat(cf);
--------------------------------------------------------------------------------
9.璁劇疆琛岄棿璺濓紙鍙傜敤浜巖ichedit2.0錛?/p>
聽聽聽聽聽聽聽 PARAFORMAT2 pf;
聽聽聽聽聽聽聽 pf2.cbSize = sizeof(PARAFORMAT2);
聽聽聽聽聽聽聽 pf2.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
聽聽聽聽聽聽聽 pf2.dyLineSpacing = 200;
聽聽聽聽聽聽聽 pf2.bLineSpacingRule聽 = 4;
聽聽聽聽聽聽聽 m_richedit.SetParaFormat(pf2);
--------------------------------------------------------------------------------
10.richedit鎻掑叆浣嶅浘
Q220844錛欻ow to insert a bitmap into an RTF document using the RichEdit control in Visual C++ 6.0
http://support.microsoft.com/default.aspx?scid=kb;en-us;220844
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/
--------------------------------------------------------------------------------
11.richedit鎻掑叆gif鍔ㄧ敾
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
--------------------------------------------------------------------------------
12.richedit宓屽叆ole瀵硅薄
http://support.microsoft.com/kb/141549/en-us
--------------------------------------------------------------------------------
13.浣縭ichedit閫変腑鍐呭鍙
http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/
--------------------------------------------------------------------------------
14.鎵撳嵃richedit
http://www.protext.com/MFC/RichEdit3.htm
--------------------------------------------------------------------------------
15.richeidt鐢ㄤ簬鑱婂ぉ娑堟伅紿楀彛
http://www.vckbase.com/document/viewdoc/?id=1087
http://www.codeproject.com/richedit/chatrichedit.asp
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/
--------------------------------------------------------------------------------
16.瑙e喅richedit鐨凟N_SETFOCUS鍜孍N_KILLFOCUS鏃犲搷搴旂殑闂
http://support.microsoft.com/kb/181664/en-us
--------------------------------------------------------------------------------
17.richedit鎷煎啓媯鏌?/p>
http://www.codeproject.com/com/AutoSpellCheck.asp
--------------------------------------------------------------------------------
18.鏀瑰彉edit鑳屾櫙鑹?/p>
Q117778錛欻ow to change the background color of an MFC edit control
http://support.microsoft.com/kb/117778/en-us
--------------------------------------------------------------------------------
19.褰揺dit鎺т歡鐨勭埗紿楀彛灞炴ф槸甯︽爣棰樻爮WS_CAPTION鍜屽瓙紿楀彛WS_CHILD鏃訛紝涓嶈兘璁劇疆鐒︾偣SetFocus
Q230587錛歅RB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window
http://support.microsoft.com/kb/230587/en-us
--------------------------------------------------------------------------------
20. 鍦‥dit涓洖杞︽椂錛屼細閫鍑哄璇濇
閫変腑Edit鐨勯鏍糤ant Return銆?/p>
MSDN鐨勮В閲婂涓嬶細
ES_WANTRETURN聽聽 Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiple-line edit control in a dialog box. Without this style, pressing the ENTER key has the same effect as pressing the dialog box's default pushbutton. This style has no effect on a single-line edit control.
--------------------------------------------------------------------------------
21. 鍔ㄦ佸垱寤虹殑edit娌℃湁杈規鐨勯棶棰?/p>
聽聽聽 m_edit.Create(....);
聽聽聽 m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
--------------------------------------------------------------------------------
22. 涓涓兘鏄劇ずRTF錛宱le錛堝寘鎷琯if錛?wmv錛宔xcel 錛宲pt錛夌殑渚嬪瓙
http://www.codeproject.com/richedit/COleRichEditCtrl.asp
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/qsycn/archive/2009/11/10/4793461.aspx
聽
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/abcpanpeng/archive/2010/04/21/5509680.aspx
1, 娣誨姞涓嬮潰寰楀嚱鏁幫紝
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>
LONG WINAPI GenerateDump(struct _EXCEPTION_POINTERS *pExceptionPointers)
{
LONG ret = EXCEPTION_EXECUTE_HANDLER;
BOOL bMiniDumpSuccessful;
TCHAR szPath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
TCHAR* szAppName = TEXT(鈥淎ppName鈥?;
TCHAR* szVersion = TEXT(鈥渧1.0鈥?;
DWORD dwBufferSize = MAX_PATH;
HANDLE hDumpFile;
SYSTEMTIME stLocalTime;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
GetLocalTime( &stLocalTime );
GetTempPath( dwBufferSize, szPath );
_stprintf( szFileName, TEXT(鈥?s%s鈥?, szPath, szAppName );
CreateDirectory( szFileName, NULL );
_stprintf( szFileName, TEXT(鈥渃:\\aaaa.dmp鈥?);
hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
ExpParam.ThreadId = GetCurrentThreadId();
ExpParam.ExceptionPointers = pExceptionPointers;
ExpParam.ClientPointers = TRUE;
bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);
int i = GetLastError();
HRESULT hr = HRESULT_FROM_WIN32(i);
return ret;
}
2錛屽湪project setting涓姞鍏bghelp.lib浣滀負library鐨刬nput錛岃繖鏄疢iniDumpWriteDump闇瑕佺殑銆?strong>鍦―ebug Information Format璁劇疆Program Database (/Zi)銆傝緗?strong>Generate Debug Info涓?strong>Yes (/DEBUG)銆傚湪Optimization璁劇疆References涓?Eliminate Unreferenced Data (/OPT:REF)銆傝緗?Enable COMDAT Folding涓?Remove Redundant COMDATs (/OPT:ICF)銆傚悗闈袱欏硅緗彲浠ュぇ澶х緝灝廵xe鏂囦歡澶у皬銆?/p>
3錛屼嬌鐢ㄥ涓嬶細
void SomeFunction()
{
int *pBadPtr = NULL;
*pBadPtr = 0;
}
void Ctest2Dlg::OnBnClickedButton1()
{
__try
{
SomeFunction();
}
__except(GenerateDump(GetExceptionInformation()))
{
}
}
4錛屼嬌鐢╳indbg鎵撳紑dmp鏂囦歡錛屽氨鍙互鐪嬪埌鍑洪敊鏃剁殑call stack浜嗐?/p>
鍑犵偣瑕佹敞鎰忕殑錛?錛夌綉涓婃湁鏂囩珷浠嬬粛浣跨敤 SetUnhandledExceptionFilter璁劇疆寮傚父榪囨護錛屼繚璇佸嚭鐜板紓甯告椂鑳借皟鐢╩inidump鍑芥暟錛屼絾鏄繖鏈変簺闂錛岃繖涓嚱鏁頒細瀵艱嚧debugger澶辨晥錛岃屼笖濂藉儚璺焏rwatson鏈変簺鍐茬獊錛屾劅瑙夌敤璧鋒潵姣旇緝鍗遍櫓銆傚湪紼嬪簭鐨勫叧閿儴鍒嗗姞鍏_try 鈥?__exception錛岃繖鏍風緝灝忔崟鎹夎寖鍥達紝搴旇灝辮凍澶熺敤浜嗐?錛夊繀欏繪槸鐢╛_try 鈥?__exception榪欐牱鐨勫艦寮忥紝鎵嶈兘淇濊瘉GetExceptionInformation()鑳芥甯鎬嬌鐢ㄣ?錛塎iniDumpWithDataSegs榪欎釜鍙傛暟鎴戣瘯鐫鎹㈡垚鍙﹀鍑犱釜錛屽ソ鍍忛兘涓嶅ソ鐢ㄣ傝繑鍥炲奸兘鏄?錛岀粡榪囪В鏋恖asterror閮芥槸E_INVALIDARG錛屽鎬?/p>
update: 鍏充簬浣跨敤windbg
windbg涓嬭澆鍦板潃鍦ㄨ繖閲?a >http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
涓嬭澆瀹夎鏈鏂扮増鏈嵆鍙紝鎴戞病鏈夋悶娓呮鐨勪竴鐐規槸蹇呴』瑕佽緗畐indows鐨剆ymbol鐩綍錛屽惁鍒欏厜鏈塸db鏄病娉曠湅鍒拌皟鐢ㄦ爤淇℃伅鐨勩?/p>
浣跨敤windbg榪囩▼濡備笅錛氬畨瑁呫傜劧鍚庢墦寮鑿滃崟file-> symbol file path錛屾坊鍔犲涓?/p>
srv*c:\symbol_local*http://msdl.microsoft.com/download/symbols;c:\debug
鍏朵腑srv*c:\symbol_local*http://msdl.microsoft.com/download/symbols;鎸囨槑浠庣綉涓婁笅杞芥搷浣滅郴緇熶嬌鐢ㄧ殑symbol瀛樻斁鍒癱鐩榮ymbol_local鐩綍錛屽彟澶栫▼搴忕殑symbol錛坧db鏂囦歡錛夊彲浠ユ斁鍦╟鐩榙ebug鐩綍涓嬨?/p>
windbg浼氭樉紺轟竴孌墊椂闂碽usy鎴栬卹etrieving..錛岀劧鍚庡氨鍙互鐪嬪埌璇︾粏鐨刣ump淇℃伅浜?/p>
![]() |
| SMTP鍛戒護 | 鍛戒護璇存槑 |
| HELLO 錛渄omain錛?錛淐RLF錛?/td> | 璇嗗埆鍙戦佹柟鍒版帴鏀禨MTP鐨勪竴涓狧ELLO鍛戒護 |
| MAIL FROM:錛渞everse-path錛烇紲CRLF錛? | 錛渞everse-path錛炰負鍙戦佽呭湴鍧銆傛鍛戒護鍛婅瘔鎺ユ敹鏂逛竴涓柊閭歡鍙戦佺殑寮濮嬶紝騫跺鎵鏈夌殑鐘舵佸拰緙撳啿鍖鴻繘琛屽垵濮嬪寲銆傛鍛戒護寮濮嬩竴涓偖浠朵紶杈撳鐞嗭紝鏈緇堝畬鎴愬皢閭歡鏁版嵁浼犻佸埌涓涓垨澶氫釜閭涓?/td> |
| RCPT TO:錛渇orward-path錛烇紲CRLF錛? | 錛渇orward-path錛炴爣璇嗗悇涓偖浠舵帴鏀惰呯殑鍦板潃 |
| DATA 錛淐RLF錛? | 鎺ユ敹SMTP灝嗘妸鍏跺悗鐨勮涓虹湅浣滈偖浠舵暟鎹幓澶勭悊錛屼互錛淐RLF錛?錛淐RLF錛炴爣璇嗘暟鎹殑緇撳熬銆?/td> |
| REST 錛淐RLF錛?/td> | 閫鍑?澶嶄綅褰撳墠鐨勯偖浠朵紶杈?/td> |
| NOOP 錛淐RLF錛?/td> | 瑕佹眰鎺ユ敹SMTP浠呭仛OK搴旂瓟銆傦紙鐢ㄤ簬嫻嬭瘯錛?/td> |
| QUIT 錛淐RLF錛?/td> | 瑕佹眰鎺ユ敹SMTP榪斿洖涓涓狾K搴旂瓟騫跺叧闂紶杈撱?/td> |
| VRFY 錛渟tring錛?錛淐RLF錛? | 楠岃瘉鎸囧畾鐨勯偖綆辨槸鍚﹀瓨鍦紝鐢變簬瀹夊叏鍥犵礌錛屾湇鍔″櫒澶氱姝㈡鍛戒護銆?/td> |
| EXPN 錛渟tring錛?錛淐RLF錛? | 楠岃瘉緇欏畾鐨勯偖綆卞垪琛ㄦ槸鍚﹀瓨鍦紝鎵╁厖閭鍒楄〃錛屼篃甯哥姝嬌鐢ㄣ?/td> |
| HELP 錛淐RLF錛?/td> | 鏌ヨ鏈嶅姟鍣ㄦ敮鎸佷粈涔堝懡浠?/td> |
| 搴旂瓟鐮?/td> | 璇存槑 |
| 501 | 鍙傛暟鏍煎紡閿欒 |
| 502 | 鍛戒護涓嶅彲瀹炵幇 |
| 503 | 閿欒鐨勫懡浠ゅ簭鍒?/td> |
| 504 | 鍛戒護鍙傛暟涓嶅彲瀹炵幇 |
| 211 | 緋葷粺鐘舵佹垨緋葷粺甯姪鍝嶅簲 |
| 214 | 甯姪淇℃伅 |
| 220 | 錛渄omain錛炴湇鍔″氨緇?/td> |
| 221 | 錛渄omain錛炴湇鍔″叧闂?/td> |
| 421 | 錛渄omain錛炴湇鍔℃湭灝辯華錛屽叧闂紶杈撲俊閬?/td> |
| 250 | 瑕佹眰鐨勯偖浠舵搷浣滃畬鎴?/td> |
| 251 | 鐢ㄦ埛闈炴湰鍦幫紝灝嗚漿鍙戝悜錛渇orward-path錛?/td> |
| 450 | 瑕佹眰鐨勯偖浠舵搷浣滄湭瀹屾垚錛岄偖綆變笉鍙敤 |
| 550 | 瑕佹眰鐨勯偖浠舵搷浣滄湭瀹屾垚錛岄偖綆變笉鍙敤 |
| 451 | 鏀懼純瑕佹眰鐨勬搷浣滐紱澶勭悊榪囩▼涓嚭閿?/td> |
| 551 | 鐢ㄦ埛闈炴湰鍦幫紝璇峰皾璇曪紲forward-path錛? |
| 452 | 緋葷粺瀛樺偍涓嶈凍錛岃姹傜殑鎿嶄綔鏈墽琛?/td> |
| 552 | 榪囬噺鐨勫瓨鍌ㄥ垎閰嶏紝瑕佹眰鐨勬搷浣滄湭鎵ц |
| 553 | 閭鍚嶄笉鍙敤錛岃姹傜殑鎿嶄綔鏈墽琛?/td> |
| 354 | 寮濮嬮偖浠惰緭鍏ワ紝浠?."緇撴潫 |
| 554 | 鎿嶄綔澶辮觸 |
| R:220 sina.com Simple Mail Transfer Service Ready S:HELLO sohu.com R:250 sina.com S:MAIL FROM:錛渓angrui@sohu.com錛?br />R:250 OK S:RCPT TO:錛渞enping@sina.com錛?br />R:250 OK S:DATA R:354 Start mail input;end with "錛淐RLF錛?錛淐RLF錛? S:鈥︹?br />R:250 OK S:QUIT R:221 sina.com Service closing transmission channel |
| //閭歡澶村噯澶?br />strTemp = _T( "From: " ) + m_strFrom; file://鍙戜歡浜哄湴鍧 add_header_line( (LPCTSTR)strTemp ); strTemp = _T( "To: " ) + m_strTo; file://鏀朵歡浜哄湴鍧 add_header_line( (LPCTSTR)strTemp ); m_tDateTime = m_tDateTime.GetCurrentTime();//鍙戦佹椂闂?br />strTemp = _T( "Data: " ); strTemp += m_tDateTime.Format( "%a, %d %b %y %H:%M:%S %Z" ); add_header_line( (LPCTSTR)strTemp ); strTemp = _T( "Subject: " ) + m_strSubject; file://涓婚 add_header_line( (LPCTSTR)strTemp ); file://閭歡澶寸粨鏉?br />m_strHeader += _T( "\r\n" ); file://閭歡浣撳噯澶?br />if( m_strBody.Right( 2 ) != _T( "\r\n" ) ) file://紜鏈鍚庝互鍥炶濺鎹㈣緇撴潫 m_strBody += _T( "\r\n" ); |
| BOOL CSMTP::get_response( UINT response_expected )//杈撳叆鍙傛暟涓哄笇鏈涚殑搴旂瓟鐮?br />{ 鈥︹?br />// m_wsSMTPServer涓篊Socket鐨勭被瀵硅薄錛岃皟鐢≧eceive()灝嗗簲絳旂爜鎺ユ敹鍒扮紦瀛?br />// response_buf涓?br />m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE ) sResponse = response_buf; sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( "%d" ), &response ); pResp = &response_table[ response_expected ]; file://媯楠屾敹鍒扮殑搴旂瓟鐮佹槸鍚︽槸鎵甯屾湜寰楀埌鐨?br />if( response != pResp-錛瀗Response ) { 鈥︹?/涓嶇浉絳夌殑璇濊繘琛岄敊璇鐞?br />return FALSE; } return TRUE; } |
| //鏍煎紡鍖栧茍鍙戦丠ELLO鍛戒護錛屽茍鎺ユ敹銆侀獙璇佹湇鍔″櫒搴旂瓟鐮?br />gethostname( local_host, 80 ); sHello.Format( _T( "HELO %s\r\n" ), local_host ); m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() ); if( !get_response( GENERIC_SUCCESS ) ) file://媯楠屽簲絳旂爜鏄惁涓?50 { 鈥︹?br />return FALSE; } file://鏍煎紡鍖栧茍鍙戦丮AIL鍛戒護錛屽茍鎺ユ敹銆侀獙璇佹湇鍔″櫒搴旂瓟鐮?br />sFrom.Format( _T( "MAIL From: 錛?s錛瀄r\n" ), (LPCTSTR)msg-錛瀖_strFrom ); m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() ); if( !get_response( GENERIC_SUCCESS ) ) file://媯楠屽簲絳旂爜鏄惁涓?50 return FALSE; file://鏍煎紡鍖栧茍鍙戦丷CPT鍛戒護錛屽茍鎺ユ敹銆侀獙璇佹湇鍔″櫒搴旂瓟鐮?br />sEmail=(LPCTSTR)msg-錛瀖_strTo; sTo.Format( _T( "RCPT TO: 錛?s錛瀄r\n" ), (LPCTSTR)sEmail ); m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() ); if(!get_response( GENERIC_SUCCESS )) file://媯楠屽簲絳旂爜鏄惁涓?50 return FALSE; file://鏍煎紡鍖栧茍鍙戦丏ATA鍛戒護錛屽茍鎺ユ敹銆侀獙璇佹湇鍔″櫒搴旂瓟鐮?br />sTemp = _T( "DATA\r\n" ); m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() ); if( !get_response( DATA_SUCCESS ) ) file://媯楠屽簲絳旂爜鏄惁涓?54 return FALSE; file://鍙戦佹牴鎹甊FC 822鏂囨。瑙勫畾鏍煎紡鍖栬繃鐨勯偖浠跺ご m_wsSMTPServer.Send( (LPCTSTR)msg-錛瀖_strHeader, msg-錛瀖_strHeader.GetLength() ); 鈥︹?br />file://鍙戦佹牴鎹甊FC 822鏂囨。瑙勫畾鏍煎紡鍖栬繃鐨勯偖浠朵綋 sTemp = msg-錛瀖_strBody; if( sTemp.Left( 3 ) == _T( ".\r\n" ) ) sTemp = _T( "." ) + sTemp; while( (nPos = sTemp.Find( szBad )) 錛?-1 ) { sCooked = sTemp.Mid( nStart, nPos ); sCooked += szGood; sTemp = sCooked + sTemp.Right( sTemp.GetLength() - (nPos + nBadLength) ); } m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() ); file://鍙戦佸唴瀹規暟鎹粨鏉熸爣蹇?錛淐RLF錛?錛淐RLF錛?錛屽茍媯楠岃繑鍥炲簲絳旂爜 sTemp = _T( "\r\n.\r\n" ); m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() ); if( !get_response( GENERIC_SUCCESS ) )// 媯楠屽簲絳旂爜鏄惁涓?50 return FALSE; |