前言:
四年前在delphi ktop有人提到看盤軟體配合DDE技術,在用delphi實作時發生了亂碼加在後面的情形。http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=97629
當時沒時間,只是大致上猜其原因。四年後的今天,又有一位朋友說他找到如何解的方式。於是讓我再度燃起追其真正的原因。
原因:
前言:
四年前在delphi ktop有人提到看盤軟體配合DDE技術,在用delphi實作時發生了亂碼加在後面的情形。http://delphi.ktop.com.tw/board.php?cid=30&fid=71&tid=97629
當時沒時間,只是大致上猜其原因。四年後的今天,又有一位朋友說他找到如何解的方式。於是讓我再度燃起追其真正的原因。
原因:
Ⓞ著者: 蕭沖
症狀: 下中斷點後無論如何也進不了,且畫面出不來。但若改成非ide下,直接執行編好的exe檔就很正常!
解決方式: 僅需要把一些form改成sizeable,並縮至相較的小後,即可下中斷並切入debug。
⓪編著: 蕭沖
TServerSocket 與 TClientSocket 都算是一個包裝(Wrapper)物件的容器(container),也就是說它本身只是把Socket物件含入裡面,並透過介面來操作含在裡面的Socket物件。
真正有"作用"的Soket物件是TCustomWinSocket這個類別,注意裡面有「Win」這個字,若沒這個字,那就僅用Container,如上面講的TClientSocket。因此,在隨作各種事件與方法時,都是在處理TCustomWinSocket的子類別,如TServerWinSocket ,TServerClientWinSocket等。
當TServerSocket使用stNonBlocking模式時,其實就是選用了Windows Socket Mode 中的WSAAsyncSelect方式(可參考我之前的相關文章(http://aftcast.pixnet.net/blog/post/22191725)。簡單講就是用 Post Windows Message (FD_CONNECT、FD_CLOSE、FD_READ、FD_WRITE、FD_ACCEPT等事件)至Application的方式來處理,因此這時候負責收封包的OnClientRead的handler就算是Thread-safe的。相反的,若是stThreadBlocking模式,則於Accept時,會產生相對應的一個thread來處理與client端的連線,接著會去建立一個thread(你自己定的,參考下面),然後一切的存取都在thread裡,這時候就要注意Thread-safe的問題。必要時要用Critical Section、Synchronize等等。可參考我寫的關於Thread-safe的文章。
著作: 蕭沖
自從有dll這種動態連接庫後,lib檔就不再僅代表是過去dos時代的static lib 了。
給 dll 用的lib,特稱為 import lib,有別於 static lib。import lib 裡記錄的是關於會使用到哪些函式,但其實裡面沒有實作函式的機器碼。 相反的,static lib 是含有程式碼於其中,所以通常檔案也比較大。
但要如何的從一個副檔名lib,來判別他是哪一類呢? 有幾個方法:
1/ 目視法: 看檔案的大小,一般40k以上應該就是 static lib。但當然不夠精準
⓪編著: 蕭沖
一般的管理程式,如:sqlitebrowser,它所建立的都是基於 utf8 而生成的 db。
在中文的環境下,若使用windows作業系統,個人覺得用unicode(UTF-16)版會比較方便,因為無需轉換utf8格式。
⓪著作: 蕭沖
近來發現BCB6的TClientSocket關於OnRead的事件有些問題:若在事件裡沒有處理到ReceiveBuf這個方法,則下一回的event就不會被觸發。所以,在OnRead的事件裡,無論如何先收資料下來再說! 千萬別一開始就在ReceiveBuf前return或是把ReceiveBuf放在某個if裡。(為何可能會錯誤的那麼做? 因為常常都是想檢查ReceiveLength,若不符合我們要的結構長度,則…)
若不收下來,那所有的封包依舊保留在socket的資料緩衝,於是爆了,接著就當了!!
⓪編著: 蕭沖
經過數回合的安裝測式後發現,最好的組合有二種:
1/ BcB6(經過update4) + DsPack231 + DirectX 9.0c 第一版(sum2004) + dxsdk_oct2004_extras (修正vc6用的lib)
2/ BcB6(經過update4) + DsPack234 + DirectX 9.0c dec2004
第一種方式還可以配合VC6的使用。第二種則VC6無法使用,會有許多compiler的錯誤,但DsPack在bcb上是正常的。
__________________________________________________________________
◎修改project的bpr(xml)檔時,最好是在非IDE的情形下。不然經常會被IDE給overwrite。
⓪編著 :蕭沖
VCL component msg handling:
Event -> ProcessMessage (TApplication)