re: GUI框架:消息檢查者 Richard Wei 2012-09-04 09:57
mark下
對(duì)于如何關(guān)聯(lián)HWND和CWnd常用有3種方法:
(1)MFC的Map,就是博主上面用的
(2)把CWnd指針?lè)旁贑reateWindowEx的最后一個(gè)參數(shù)里,在回調(diào)WM_NCCREATE里從CREATESTRUCT里取出來(lái),再保存CWnd*到SetWindowLong(GWL_USERDATA)中,后面其他消息就直接取出CWnd*調(diào)用
(3)ATL的Thunk機(jī)制
第一種方法容易理解,但是低效
第二種方法把CreateParams和UserData用掉了,別人沒(méi)法再用了,通用性不是很好
第三種方法簡(jiǎn)單高效,但是會(huì)涉及到機(jī)器碼
支持一下,不過(guò)即使有D3D和WPF的經(jīng)驗(yàn),做這個(gè)東西也不是容易的事
借助C++11種的function, 可以讓我們無(wú)差別的對(duì)待普通函數(shù)和類成員函數(shù),實(shí)現(xiàn)delegate會(huì)容易很多
@Dragon
是的,你可以試下連續(xù)Post 100條Message,然后結(jié)束結(jié)束接收線程,所有的消息就都被丟掉了,自然就內(nèi)存泄露了。
@bukebushuo
可以截層窗口, 不過(guò)截硬件加速的視頻不行,那個(gè)需要用API Hook.
PostMessage只是把消息放到線程消息隊(duì)列,線程退出時(shí)并不保證隊(duì)列中的所有消息都已經(jīng)被處理,所以博主上面的解決方案仍然會(huì)有內(nèi)存泄露。
re: 如何學(xué)習(xí)WindDbg Richard Wei 2012-08-15 17:50
@zaccheo
VS2008 Release版默認(rèn)編譯選項(xiàng)就是生成PDB符號(hào)的,在有符號(hào)的情況下用WinDbg調(diào)試程序其實(shí)不需要什么匯編知識(shí)。
博主不錯(cuò),比我畢業(yè)時(shí)厲害多了。
re: 如何判斷一個(gè)C++對(duì)象是否在堆上 Richard Wei 2012-08-13 14:30
上面關(guān)于對(duì)象是否在堆上的判斷應(yīng)該是不對(duì),因?yàn)槎褍?nèi)存不是連續(xù)內(nèi)存,內(nèi)部是通過(guò)類似鏈表的結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,<<軟件調(diào)試>>里有相關(guān)介紹,也可以通過(guò)WinDbg的 !address 命令查看內(nèi)存分布
re: 堆棧楨的生成原理 Richard Wei 2012-07-20 15:31
據(jù)寫(xiě)過(guò)調(diào)試器的朋友指點(diǎn),調(diào)試器會(huì)盡量減少代碼運(yùn)行時(shí)的干預(yù),所以上面關(guān)于函數(shù)調(diào)用時(shí)調(diào)試器保存調(diào)用現(xiàn)場(chǎng)的猜測(cè),應(yīng)該是不正確的。
調(diào)試器更多的可能是根據(jù)PDB文件信息來(lái)計(jì)算推理的,如果沒(méi)有PDB文件,它就只能猜測(cè),很多堆棧信息就會(huì)出錯(cuò)了。
據(jù)說(shuō)<<軟件調(diào)試>>里有相關(guān)介紹,回頭看下, 希望這篇博文不要誤導(dǎo)他人。
re: 開(kāi)源一套DirectUI界面庫(kù) Richard Wei 2012-07-20 08:36
@oksbsb
不知道你那邊為什么不行,我試了下還是可以下的, 代碼已發(fā)。
re: LingosHook : 值得紀(jì)念的一天 Richard Wei 2012-07-17 09:22
恭喜一下。
一直也想搞自己的軟件,無(wú)奈一直沒(méi)時(shí)間。
如果要用顯試調(diào)用類,建議還是用接口方式吧,導(dǎo)出一個(gè)CreateInstance(interface** ppInterface)就可以了,簡(jiǎn)單又方便,具體參考COM
re: 開(kāi)源一套DirectUI界面庫(kù) Richard Wei 2012-07-16 19:43
@圣
資源壓縮和delegate方式的事件處理加上去也不難。
這套東西只是半成品,本來(lái)想寫(xiě)給自己用的,可看了WPF后,覺(jué)得沒(méi)必要寫(xiě)了,微軟已經(jīng)把我們想做的東西做到了極致...
re: 跨模塊傳參數(shù)的教訓(xùn) Richard Wei 2012-07-16 10:04
@zuhd
恩,跨模塊返回一個(gè)未初始化的CString會(huì)有同樣的問(wèn)題,
所以跨模塊還是用C語(yǔ)言的字符串方式比較保險(xiǎn)。
re: 開(kāi)源一套DirectUI界面庫(kù) Richard Wei 2012-07-11 11:03
@先鋒
不用WTL,ATL就夠了。
相信這套東西會(huì)給真正研究過(guò)DirectUI的朋友很多參考價(jià)值。
re: 開(kāi)源一套DirectUI界面庫(kù) Richard Wei 2012-07-11 11:00
@圣
真想罵人,你看過(guò)代碼嗎?? 別弄臟了這里。
re: 用Windbg解決一個(gè)Bug Richard Wei 2012-07-08 10:08
@weolar
是的, 理論上Vc和Windbg用的是相同的的調(diào)試引擎,但是我試了些VC的command,設(shè)置斷點(diǎn)的bp和察看堆棧的kv都不支持,不知道怎么回事。
另外windbg本身很小,在QA機(jī)器上安裝也很方便。
re: 如何減小Exe, DLL 的大小 Richard Wei 2012-07-07 15:23
感覺(jué)另外還有應(yīng)該盡量少用全局和靜態(tài)變量,他們會(huì)被直接編譯到PE文件的數(shù)據(jù)(.data, .rdata)段中;另外圖片等資源也挺耗空間,簡(jiǎn)單的圖片可以在運(yùn)行時(shí)自己畫(huà)出來(lái)。
@萬(wàn)連文
不扯了,我最初的本意只是提醒博主:他想靠現(xiàn)在的基于GDI的DirectUI賺錢會(huì)很難.
@萬(wàn)連文
我也看好HTML5.
對(duì)于Native應(yīng)用,我覺(jué)得正如Mac上的Cocoa,windows上趨勢(shì)則是WinRT和Xaml。
設(shè)計(jì)好的界面引擎的確應(yīng)該和底層Rendering的方式無(wú)關(guān),無(wú)論GDI,D2D(D3D),或是OpenGL,但是3D和2D接口是如此不同以致現(xiàn)時(shí)中很難看到他們的統(tǒng)一。
說(shuō)Windows沒(méi)落或許有點(diǎn)過(guò)了,但是windows上傳統(tǒng)桌面應(yīng)用開(kāi)發(fā)的減少現(xiàn)在卻是趨勢(shì).
至于我那套界面,高手眼中的確是玩具程序,初學(xué)者或許可以拿來(lái)入門.
@bukebushuo
微軟不可能修改傳統(tǒng)GDI接口的內(nèi)部實(shí)現(xiàn)來(lái)支持硬件加速, 因?yàn)樾薷臎](méi)那么容易,那樣也意味著所有老的基于GDI開(kāi)發(fā)的應(yīng)用程序都要做兼容性測(cè)試. 即使要增加支持硬件加速的接口,也會(huì)以新的方式提供(比如D2D)。這里最關(guān)鍵的是微軟有了自己的Xaml界面的標(biāo)準(zhǔn), 外面的人這塊市場(chǎng)很難進(jìn)入了。
我只是善意的提醒...
本不想回復(fù)了,想想還是回復(fù)下吧.
我感覺(jué)經(jīng)過(guò)這么多年的發(fā)展,windows的桌面應(yīng)用軟件已經(jīng)開(kāi)始飽和,所以windows上的新應(yīng)用程序也越來(lái)越少,大部分是已有程序的維護(hù)和升級(jí)。當(dāng)然作為主要的辦公平臺(tái),在沒(méi)有找到新的辦公方式之前,windows傳統(tǒng)的桌面應(yīng)用還將在一定時(shí)間內(nèi)長(zhǎng)期存在。
隨著XP的淡出,基于GDI/GDI+開(kāi)發(fā)的界面也會(huì)逐步被支持硬件加速的D2D/D3D應(yīng)用所取代,傳統(tǒng)的窗口控件機(jī)制也將逐漸退出,所以個(gè)人在這時(shí)基于GDI/GDI+開(kāi)發(fā)DirectUI已經(jīng)沒(méi)有多少意義。而微軟Xaml方式的界面(WPF, Metro )正逐步成為新的Windows界面標(biāo)準(zhǔn),所以我相信微軟以后傳統(tǒng)桌面下也會(huì)有支持觸摸、支持自動(dòng)測(cè)試的Native版本的WPF。
至于移動(dòng)領(lǐng)域,我個(gè)人覺(jué)得微軟可能會(huì)通過(guò)WinRT實(shí)現(xiàn)PC, win8平板,windows Phone開(kāi)發(fā)方式的統(tǒng)一。
很多開(kāi)發(fā)人員(包括我)都不愿意放棄自己辛苦學(xué)習(xí)的已有技術(shù),但是我不得不說(shuō)GDI過(guò)時(shí)了...
如果想賺錢,windows傳統(tǒng)桌面下界面應(yīng)用已經(jīng)沒(méi)有多少前途,尤其是基于GDI的,希望不要在錯(cuò)誤的道路上越走越遠(yuǎn); 當(dāng)然如果是興趣,玩什么的都沒(méi)錯(cuò)。
re: 關(guān)于編程的胡扯 Richard Wei 2012-06-22 09:37
不錯(cuò),正在為平臺(tái)而煩惱,支持一下
re: 遠(yuǎn)程線程入門 Richard Wei 2012-06-20 23:53
@飯中淹
不依賴匯編重定位的代碼注入也做了下嘗試,發(fā)現(xiàn)挺好用的,測(cè)試代代碼也放上去了,單純用C++就可以了,就是注入代碼大小不太好算。
re: 遠(yuǎn)程線程入門 Richard Wei 2012-06-20 21:30
@飯中淹
是的,我們可以先在目標(biāo)進(jìn)程中把需要的數(shù)據(jù)分配好,然后通過(guò)線程參數(shù)把地址傳進(jìn)去,這樣可以避免全局變量。
關(guān)于代碼注入,這篇文章不錯(cuò):
http://www.vckbase.com/index.php/wv/1580
@畢達(dá)哥拉斯半圓
不錯(cuò), 新加了
(6)C++支持多種編程模型,包括面向過(guò)程,面向?qū)ο螅趯?duì)象,泛型編程等,設(shè)計(jì)模式主要是基于面向?qū)ο蟮模鳭ava只支持面向?qū)ο箝_(kāi)發(fā)。
re: 從自己的角度來(lái)看人生路 Richard Wei 2012-06-20 10:22
博主還很年輕
re: 跨越Win8 Metro開(kāi)發(fā) Richard Wei 2012-06-15 16:56
@空明流轉(zhuǎn)
是的,微軟做了我們想做的,如果Desktop下也有Native的Xaml UI, 那么自己開(kāi)發(fā)DirectUI就沒(méi)多少用處了。
@leolai
是的,設(shè)計(jì)模式在比較大型的C++開(kāi)源項(xiàng)目中用的還是比較多的,比如網(wǎng)絡(luò)庫(kù)ACE,界面庫(kù)QT,游戲引擎Orge, Irrlicht等
re: 跨越Win8 Metro開(kāi)發(fā) Richard Wei 2012-06-15 16:43
@leolai
恭喜你,看來(lái)Metro開(kāi)發(fā)對(duì)你沒(méi)多少障礙
re: richedit研究02 – 大綱 Richard Wei 2012-06-15 09:48
關(guān)注, Win7下例子跑不起來(lái)
re: 難以割舍的二段構(gòu)造 Richard Wei 2012-06-14 16:37
支持一下,C++里我們一般把分配內(nèi)存和簡(jiǎn)單的初始化工作都放在了構(gòu)造函數(shù)里,而把一些復(fù)雜的工作放在一個(gè)單獨(dú)的初始化函數(shù)里,這樣的話比較靈活。如果覺(jué)得使用不方便,可以自己封裝一層,也就是所謂的RAII了。
windows API里很多結(jié)構(gòu)體的第一個(gè)字段一般都是UINT cbSize, 就是為了以后可以擴(kuò)充。
@春秋十二月
看來(lái)你沒(méi)看懂, C or C++ :)
re: 軟命令接口的適用場(chǎng)合 Richard Wei 2012-06-13 21:08
@jacky
確實(shí)應(yīng)該是facade, 只留意大概讀音,沒(méi)想到拼寫(xiě)錯(cuò)誤。
多謝指正。
re: Windows 8 基本概念 Richard Wei 2012-06-13 13:50
最近也開(kāi)始關(guān)注Win8開(kāi)發(fā),無(wú)奈一直沒(méi)法入門,感覺(jué)從Desktop開(kāi)發(fā)轉(zhuǎn)換到Metro開(kāi)發(fā)的幾個(gè)門檻是:
(1)C++/CX語(yǔ)言本身的學(xué)習(xí)及語(yǔ)言背后的原理。
(2)Metro模式背后原理的學(xué)習(xí),搞清楚它和傳統(tǒng)Desktop的交互和關(guān)系。
(3)WinRT類庫(kù)的學(xué)習(xí), 最好對(duì)整個(gè)WinRT的體系結(jié)構(gòu)進(jìn)行系統(tǒng)的介紹。
(4)通過(guò)XAML開(kāi)發(fā)UI的學(xué)習(xí), 這個(gè)東西對(duì)很多WPF的程序員來(lái)說(shuō)很容易,對(duì)其他人來(lái)說(shuō)就沒(méi)有這么簡(jiǎn)單了。
(5)D3D的學(xué)習(xí),以及D3D和XAML UI交互的學(xué)習(xí),開(kāi)發(fā)一些高端產(chǎn)品最后還是需要在XAML里嵌入很多自己rendering的東西。
我覺(jué)得當(dāng)上面的層次都掌握了,才可以說(shuō)自己真正懂Metro開(kāi)發(fā)了。 希望摟主可以按上面層次作些介紹。
re: 軟命令接口的適用場(chǎng)合 Richard Wei 2012-06-13 13:29
@華夏之火
這個(gè)怎么說(shuō)呢,F(xiàn)aced模式強(qiáng)調(diào)的是一個(gè)復(fù)雜系統(tǒng)對(duì)外有一個(gè)統(tǒng)一的入口; Bridge模式強(qiáng)調(diào)的是分層的概念,將抽象層和實(shí)現(xiàn)層分離,二層可以分別獨(dú)立的變化。感覺(jué)上面的"軟命令"方式,從對(duì)外暴露的接口的簡(jiǎn)單統(tǒng)一性來(lái)說(shuō)比較符合Faced模式;但是從內(nèi)部實(shí)現(xiàn)來(lái)說(shuō),你要理解成同一消息可以有多種處理方式,Bridge模式也可以。
@leolai
同意。
一般來(lái)說(shuō),除非某些設(shè)計(jì)模式你現(xiàn)在確實(shí)適合使用,或是你能預(yù)測(cè)到今后可能的變化,你才應(yīng)該使用該模式。
否則還是只要滿足當(dāng)前的需要就夠了,等確實(shí)有新需求時(shí)再考慮重構(gòu)你現(xiàn)有的代碼。比如上面有的 去邊框(unframe), 用XML格式打印圖片的組成結(jié)構(gòu) 等,都是新需求。
re: C++11新特性不完全測(cè)試 Richard Wei 2012-06-13 10:39
@華夏之火
恩,大家本來(lái)對(duì)concept期望很大, 如果真的有concept, C++11就完全是一門新語(yǔ)言了。
這個(gè)例子源自《C++沉思錄》,同時(shí)也建議樓主看一下這本書(shū),它會(huì)告訴你Why C++, how C++?
當(dāng)然,看了樓主一些博文,我還是挺佩服樓主的,就是希望樓主不要癡迷于windows 消息處理函數(shù)的設(shè)計(jì)機(jī)制。
既然原文是指我的博文,我來(lái)嘗試評(píng)價(jià)下樓主上面的實(shí)現(xiàn),如果有不正確的地方,請(qǐng)指正:
(1)樓主用C的方式來(lái)模擬C++的虛函數(shù),除了以后難維護(hù)外,得到了什么好處?
(2)Windows用軟命令的方式來(lái)實(shí)現(xiàn)消息處理函數(shù), 是因?yàn)橄㈩愋吞啵曳奖阋院髷U(kuò)展新消息,我感覺(jué)用的恰到好處,但樓主這里也用這種方式就感覺(jué)有點(diǎn)過(guò)了。如果都按照這種方式,無(wú)論什么類都只要一個(gè)CommandHandler函數(shù)就夠了。我個(gè)人覺(jué)得一個(gè)用途明確的接口才是優(yōu)雅的設(shè)計(jì)。
(3)請(qǐng)問(wèn)樓主如何處理去邊框(unframe)的情況,如何知道當(dāng)前的對(duì)象是不是支持unframe?
(4)樓主有沒(méi)有發(fā)現(xiàn)main函數(shù)里使用你的接口時(shí)特別別扭(比如這個(gè)代碼CHorseDecorater hors(pict1.m_Imp, pict2.m_Imp); pict1.Print(cout);), 我覺(jué)得良好的設(shè)計(jì),應(yīng)該讓使用的人覺(jué)得很舒服。
(5)樓主看起來(lái)挺討厭設(shè)計(jì)模式,但是在某些情況下用正確的設(shè)計(jì)模式確實(shí)可以讓你的程序有很好的可擴(kuò)充性,畢竟它們是大師智慧的結(jié)晶。