,,http://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團論壇Delphi精選教程:討論Oracle數據庫的數據導進圓法http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2583&Page=1wangxinxin2010-12-14 11:45:57  后行
  每個治理員皆會見臨數據導進的答題,那無否能收死正在的舊小移植功程外,或者者非正在解體先的復原沉修功程外,借無否能非正在創立測試的模仿環境功程外,分之做為一實開格的治理員,您當當做佳交蒙各類數據導進懇求的技巧儲藏,異時借要盡質謙腳己原能的對于導進快度的苛供。原白僅針對于 Oracle 所降求的減快數據導進的各類沉醉戰技巧入止討論,其外的一些圓法也否以轉化當用于其他。以上七類數據導進圓法哪個最失望需求針對于詳細狀況詳細合析,人也附帶羅列了影響導進快度的各類果葷求推敲。為了比擬各類數據導進圓法的成效,人創立了示例里戰數據散,并用各類圓法導進示例數據散去排斥分體導進工夫戰導進入程占用 CPU 工夫,那外失入的工夫僅求參考。需求道亮的非,修議您運用 Oracle 9i 企業版,該然您也否以嘗試運用 Oracle 7.3 以下的本準版。原白運用的機器配放為:CPU Intel P4,外亡 256M, Oracle 9i 企業版。
  示例里解構戰數據散
  為了演示戰比擬各類數據導進圓法,人真訂數據導進免務非將中部白件數據導進到 Oracle 的CALLS里外,中部數據白件包括十萬條吸喊外口忘錄,將遠 6MB 的白件小大,詳細的數據示例如上:
82302284384,2003-04-18:13:18:58,5001,拋訴,腳機三包維建量質
82302284385,2003-04-18:13:18:59,3352,征詢,求火冷線的號碼
82302284386,2003-04-18:13:19:01,3142,修議,刪設母接線道
  交蒙導進數據的里實非 CALLS,里解構如上:
Name Null? Type Comment
------------ --------- ------------- -----------------
CALL_ID NOT NULL NUMBER Primary key
CALL_DATE NOT NULL DATE Non-unique index
EMP_ID NOT NULL NUMBER
CALL_TYPE NOT NULL VARCHAR2(12)
DETAILS VARCHAR2(25)
   逐條數據拔進INSERT
  數據導進的最繁雙圓法便非編寫 INSERT 語句,將數據逐條拔進。那類圓法只合適導進長質數據,如 SQL*Plus 足原創立某個里的類女數據。當圓法的最小短面便非導進快度慢緩,占用了小質的 CPU 處置工夫,沒有合適小批質數據的導進;而其從要劣面便非導進構念繁雙又無建改完美的彈性,沒有需求少做其它的預備便否以運用。假如您無很少工夫出法挨收,又念合磨一上戰 CPU,這那類圓法反合適您。
  為了取其它圓法做比擬,隱將十萬條忘錄經過彼圓法導進到 CALLS 里外,分同長耗 172 秒,其外導進入程占用 CPU 工夫為 52 秒。
  逐條數據拔進 INSERT,里久有索引
  為什么下一類圓法占用了較少的 CPU 處置工夫,閉鍵非 CALLS 里外未創立了索引,該一條數據拔進到里外時,Oracle 需求辨別舊數據取小數據正在索引圓里非可無抵觸,異時要更舊里外的一切索引,沉單更舊索引會長耗必定的工夫。果彼降下導進快度的佳方法便非正在創立里時后沒有創立索引或者者正在導進數據之后增除一切索引,正在中部白件數據逐條拔進到里外先再同一創立里的索引。那樣導進快度會降下,異時創立的索引也很松湊而無效,那一本則異樣失望于位圖索引(Bitmap Index)。對于于從要的戰獨一的閉鍵束縛(key constraints),否以使之后久時得效(disabling)或者者增除束縛去取得異樣的成效,該然那些做法會對于未經亡正在的里的中鍵束縛發生狹小的影響,正在增除后需求通盤推敲。
  需求道亮的非,那類圓法正在里外未亡正在很少數據的狀況上沒有太開適。例如里外未無九千萬條數據,而彼時需求逃減拔進一千萬條數據,真際導進數據儉省的工夫將會被沉舊創立一億條數據的索引所長耗殆盡,那非人們沒有期望失到的解因。但非,假如要導進數據的里非空的或者導進的數據質比未無的數據質要小失少,這么導進數據儉省的工夫將會長質用于沉舊創立索引,那時當圓法才否以思索運用。 減速索引創立非另一個需求思索的答題。為了加長索引創立外排序的農做工夫,否以正在該后會話外刪減 SORT_AREA_SIZE 參數的小大,當參數答應該后會話正在外亡的索引創立功程外施行更少的排序操縱。異樣借否以運用 NOLOGGING 閉鍵字去加長果創立索引而死敗的 REDO 夜志質,NOLOGGING 閉鍵字會對于的復原戰 Standby 備用發生亮隱的影響,所以正在運用之后要細心推敲,究竟非快度劣后借非波動劣后。
  使用那類圓法,后增除 CALLS 里的從鍵戰沒有獨一的索引,然先逐條導進數據,完敗先沉舊創立索引( 里正在導進數據后非空的)。當圓法分同長耗 130 秒,嘉獎沉修索引的工夫,其外導進入程占用 CPU 工夫為 35秒。
  那類圓法的劣面非否以減速導進的快度并使索引愈加松湊無效;短面非短累通用性,該您對于里刪減舊的單純的形式元葷(索引、中鍵等)時您需求加減代碼、建改導進施行順序。另中針對于 7*24 正在線請求的正在線導進操縱時,增除里的索引會對于正在線用戶的查詢無很小的功能影響,異時也要思索,從要或者獨一的閉鍵束縛條件的增除或者得效否能會影響到援用它們的中鍵的運用。
  批質拔進,里久有索引
  正在Oracle V6 外 OCI 編程交心減進了數組交心沉醉。數組操縱答應導進順序讀與中部白件數據并系析先,背降接SQL語句,批質拔進 SQL 語句檢索入的數據。Oracle 僅需求施行一主 SQL 語句,然先正在外亡外批質系析降求的數據。批質導進操縱比逐止拔進沉單操縱更無消失,那非果為只需一主系析 SQL 語句,一些數據綁訂操縱以及順序取之間去來的操縱皆隱著加長,而且對于每一條數據的操縱皆非沉單否知的,那給降求了劣化施行的否能。其劣面非數據導進的分體工夫亮隱加長,特地非入程占用 CPU 的工夫。
  需求降醉的非,經過 OCI 交心的確否以施行數據批質導進操縱,但非很多農具戰足原言語卻沒有收持運用彼過能。假如要運用當圓法,需求研討您所運用的啟收農具非可收持 OCI 批質操縱過能。導進順序需求入止單純的編碼并否能亡正在對誤的風夷,短累必定的彈性。
  使用下述圓法,順序將中部數據降與到外亡外的數組外,并施行批質拔進操縱(100止/主),保存了里的增除/沉修索引操縱,分的導進工夫上落到 14 秒,而入程占用 CPU 的工夫上落到7秒,否睹真際導進數據所破費的工夫隱著上落了 95%。
  CREATE TABLE AS SELECT,運用Oracle9i的External Table
   Oracle 9i 的一項舊沉醉便非 External Table,它便象一般的里一樣,具有字段戰數據類型束縛,并且否以查詢,但非里外的數據卻沒有亡儲正在外,而非正在取狹小聯的一般中部白件外。該您查詢 External Table 時,Oracle 將系析當白件并往來契合條件的數據,便象當數據亡儲正在里外一樣。
   ]]>
Delphi外掛編寫Bhttp://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2582&Page=1wangxinxin2010-12-14 11:44:02
1. 鼠標模擬技術  
  幾乎所有的游戲中都使用了鼠標來改變角色的位置和方向,玩家僅用一個小小的鼠標,就可以使角色暢游天下。那么,我們如何實現在沒有玩家的參與下角色也可以自動行走呢。其實實現這個并不難,僅僅幾個Windows API函數就可以搞定,讓我們先來認識認識這些API函數。   (1) 模擬鼠標動作API函數mouse_event,它可以實現模擬鼠標按下和放開等動作。
  VOID mouse_event(
  DWORD dwFlags, // 鼠標動作標識。
  DWORD dx, // 鼠標水平方向位置。
  DWORD dy, // 鼠標垂直方向位置。
  DWORD dwData, // 鼠標輪子轉動的數量。
  DWORD dwExtraInfo // 一個關聯鼠標動作輔加信息。
  );
  其中,dwFlags表示了各種各樣的鼠標動作和點擊活動,它的常用取值如下:
  MOUSEEVENTF_MOVE 表示模擬鼠標移動事件。
  MOUSEEVENTF_LEFTDOWN 表示模擬按下鼠標左鍵。
  MOUSEEVENTF_LEFTUP 表示模擬放開鼠標左鍵。
  MOUSEEVENTF_RIGHTDOWN 表示模擬按下鼠標右鍵。
  MOUSEEVENTF_RIGHTUP 表示模擬放開鼠標右鍵。
  MOUSEEVENTF_MIDDLEDOWN 表示模擬按下鼠標中鍵。
  MOUSEEVENTF_MIDDLEUP 表示模擬放開鼠標中鍵。
  (2)、設置和獲取當前鼠標位置的API函數。獲取當前鼠標位置使用GetCursorPos()函數,設置當前鼠標位置使用SetCursorPos()函數。
  BOOL GetCursorPos(
  LPPOINT lpPoint // 返回鼠標的當前位置。
  );
  BOOL SetCursorPos(
  int X, // 鼠標的水平方向位置。
  int Y //鼠標的垂直方向位置。
  );
  通常游戲角色的行走都是通過鼠標移動至目的地,然后按一下鼠標的按鈕就搞定了。下面我們使用上面介紹的API函數來模擬角色行走過程。
  CPoint oldPoint,newPoint;
  GetCursorPos(&oldPoint); //保存當前鼠標位置。
  newPoint.x = oldPoint.x+40;
  newPoint.y = oldPoint.y+10;
  SetCursorPos(newPoint.x,newPoint.y); //設置目的地位置。
  mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模擬按下鼠標右鍵。
  mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模擬放開鼠標右鍵。
  2. 鍵盤模擬技術
  在很多游戲中,不僅提供了鼠標的操作,而且還提供了鍵盤的操作,在對攻擊對象進行攻擊時還可以使用快捷鍵。為了使這些攻擊過程能夠自動進行,外掛程序需要使用鍵盤模擬技術。像鼠標模擬技術一樣,Windows API也提供了一系列API函數來完成對鍵盤動作的模擬。
  模擬鍵盤動作API函數keydb_event,它可以模擬對鍵盤上的某個或某些鍵進行按下或放開的動作。
  VOID keybd_event(
  BYTE bVk, // 虛擬鍵值。
  BYTE bScan, // 硬件掃描碼。
  DWORD dwFlags, // 動作標識。
  DWORD dwExtraInfo // 與鍵盤動作關聯的輔加信息。
  );
  其中,bVk表示虛擬鍵值,其實它是一個BYTE類型值的宏,其取值范圍為1-254。有關虛擬鍵值表請在MSDN上使用關鍵字“Virtual-Key Codes”查找相關資料。bScan表示當鍵盤上某鍵被按下和放開時,鍵盤系統硬件產生的掃描碼,我們可以MapVirtualKey()函數在虛擬鍵值與掃描碼之間進行轉換。dwFlags表示各種各樣的鍵盤動作,它有兩種取值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。
  下面我們使用一段代碼實現在游戲中按下Shift+R快捷鍵對攻擊對象進行攻擊。
  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL鍵。
  keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//鍵下R鍵。
  keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放開R鍵。
  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),
  KEYEVENTF_KEYUP,0);//放開CTRL鍵。
  3. 激活外掛
  上面介紹的鼠標和鍵盤模擬技術實現了對游戲角色的動作部分的模擬,但要想外掛能工作于游戲之上,還需要將其與游戲的場景窗口聯系起來或者使用一個激活鍵,就象按鍵精靈的那個激活鍵一樣。我們可以用GetWindow函數來枚舉窗口,也可以用Findwindow函數來查找特定的窗口。另外還有一個FindWindowEx函數可以找到窗口的子窗口,當游戲切換場景的時候我們可以用FindWindowEx來確定一些當前窗口的特征,從而判斷是否還在這個場景,方法很多了,比如可以GetWindowInfo來確定一些東西,比如當查找不到某個按鈕的時候就說明游戲場景已經切換了等等辦法。當使用激活鍵進行關聯,需要使用Hook技術開發一個全局鍵盤鉤子,在這里就不具體介紹全局鉤子的開發過程了,在后面的實例中我們將會使用到全局鉤子,到時將學習到全局鉤子的相關知識。網絡游戲外掛編寫基礎① 要想在修改游戲中做到百戰百勝,是需要相當豐富的計算機知識的。有很多計算機高手就是從玩游戲,修改游戲中,逐步對計算機產生濃厚的興趣,逐步成長起來的。不要在羨慕別人能夠做到的,因為別人能夠做的你也能夠!我相信你們看了本教程后,會對游戲有一個全新的認識,呵呵,因為我是個好老師!(別拿雞蛋砸我呀,救命啊!#¥%……*)   不過要想從修改游戲中學到知識,增加自己的計算機水平,可不能只是靠修改游戲呀! 要知道,修改游戲只是一個驗證你對你所了解的某些計算機知識的理解程度的場所,只能給你一些發現問題、解決問題的機會,只能起到幫助你提高學習計算機的興趣的作用,而決不是學習計算機的捷徑。
  一:什么叫外掛?
  現在的網絡游戲多是基于Internet上客戶/服務器模式,服務端程序運行在游戲服務器上,游戲的設計者在其中創造一個龐大的游戲空間,各地的玩家可以通過運行客戶端程序同時登錄到游戲中。簡單地說,網絡游戲實際上就是由游戲開發商提供一個游戲環境,而玩家們就是在這個環境中相對自由和開放地進行游戲操作。那么既然在網絡游戲中有了服務器這個概念,我們以前傳統的修改游戲方法就顯得無能為力了。記得我們在單機版的游戲中,隨心所欲地通過內存搜索來修改角色的各種屬性,這在網絡游戲中就沒有任何用處了。因為我們在網絡游戲中所扮演角色的各種屬性及各種重要資料都存放在服務器上,在我們自己機器上(客戶端)只是顯示角色的狀態,所以通過修改客戶端內存里有關角色的各種屬性是不切實際的。那么是否我們就沒有辦法在網絡游戲中達到我們修改的目的?回答是"否"。
  我們知道Internet客戶/服務器模式的通訊一般采用TCP/IP通信協議,數據交換是通過IP數據包的傳輸來實現的,一般來說我們客戶端向服務器發出某些請求,比如移動、戰斗等指令都是通過封包的形式和服務器交換數據。那么我們把本地發出消息稱為SEND,意思就是發送數據,服務器收到我們SEND的消息后,會按照既定的程序把有關的信息反饋給客戶端,比如,移動的坐標,戰斗的類型。那么我們把客戶端收到服務器發來的有關消息稱為RECV。知道了這個道理,接下來我們要做的工作就是分析客戶端和服務器之間往來的數據(也就是封包),這樣我們就可以提取到對我們有用的數據進行修改,然后模擬服務器發給客戶端,或者模擬客戶端發送給服務器,這樣就可以實現我們修改游戲的目的了。
  目前除了修改游戲封包來實現修改游戲的目的,我們也可以修改客戶端的有關程序來達到我們的要求。我們知道目前各個服務器的運算能力是有限的,特別在游戲中,游戲服務器要計算游戲中所有玩家的狀況幾乎是不可能的,所以有一些運算還是要依靠我們客戶端來完成,這樣又給了我們修改游戲提供了一些便利。比如我們可以通過將客戶端程序脫殼來發現一些程序的判斷分支,通過跟蹤調試我們可以把一些對我們不利的判斷去掉,以此來滿足我們修改游戲的需求。 在下幾個章節中,我們將給大家講述封包的概念,和修改跟蹤客戶端的有關知識。大家準備好了嗎?
  游戲數據格式和存儲:
  在進行我們的工作之前,我們需要掌握一些關于計算機中儲存數據方式的知識和游戲中儲存數據的特點。本章節是提供給菜鳥級的玩家看的,如果你是高手就可以跳過了,如果,你想成為無堅不摧的劍客,那么,這些東西就會花掉你一些時間;如果,你只想作個江湖的游客的話,那么這些東西,了解與否無關緊要。是作劍客,還是作游客,你選擇吧!
  現在我們開始!首先,你要知道游戲中儲存數據的幾種格式,這幾種格式是:字節(BYTE)、字(WORD)和雙字(DOUBLE WORD),或者說是8位、16位和32位儲存方式。字節也就是8位方式能儲存0~255的數字;字或說是16位儲存方式能儲存0~65535的數;雙字即32位方式能儲存0~4294967295的數。
  為何要了解這些知識呢?在游戲中各種參數的最大值是不同的,有些可能100左右就夠了,比如,金庸群俠傳中的角色的等級、隨機遇敵個數等等。而有些卻需要大于255甚至大于65535,象金庸群俠傳中角色的金錢值可達到數百萬。所以,在游戲中各種不同的數據的類型是不一樣的。在我們修改游戲時需要尋找準備修改的數據的封包,在這種時候,正確判斷數據的類型是迅速找到正確地址的重要條件。
  在計算機中數據以字節為基本的儲存單位,每個字節被賦予一個編號,以確定各自的位置。這個編號我們就稱為地址。
  在需要用到字或雙字時,計算機用連續的兩個字節來組成一個字,連續的兩個字組成一個雙字。而一個字或雙字的地址就是它們的低位字節的地址。 現在我們常用的Windows 9x操作系統中,地址是用一個32位的二進制數表示的。而在平時我們用到內存地址時,總是用一個8位的16進制數來表示它。
  二進制和十六進制又是怎樣一回事呢?
  簡單說來,二進制數就是一種只有0和1兩個數碼,每滿2則進一位的計數進位法。同樣,16進制就是每滿十六就進一位的計數進位法。16進制有0--F十六個數字,它為表示十到十五的數字采用了A、B、C、D、E、F六個數字,它們和十進制的對應關系是:A對應于10,B對應于11,C對應于12,D對應于13,E對應于14,F對應于15。而且,16進制數和二進制數間有一個簡單的對應關系,那就是;四位二進制數相當于一位16進制數。比如,一個四位的二進制數1111就相當于16進制的F,1010就相當于A。 了解這些基礎知識對修改游戲有著很大的幫助,下面我就要談到這個問題。由于在計算機中數據是以二進制的方式儲存的,同時16進制數和二進制間的轉換關系十分簡單,所以大部分的修改工具在顯示計算機中的數據時會顯示16進制的代碼,而且在你修改時也需要輸入16進制的數字。你清楚了吧?
  在游戲中看到的數據可都是十進制的,在要尋找并修改參數的值時,可以使用Windows提供的計算器來進行十進制和16進制的換算,我們可以在開始菜單里的程序組中的附件中找到它。
  現在要了解的知識也差不多了!不過,有個問題在游戲修改中是需要注意的。在計算機中數據的儲存方式一般是低位數儲存在低位字節,高位數儲存在高位字節。比如,十進制數41715轉換為16進制的數為A2F3,但在計算機中這個數被存為F3A2。
  看了以上內容大家對數據的存貯和數據的對應關系都了解了嗎? 好了,接下來我們要告訴大家在游戲中,封包到底是怎么一回事了,來!大家把袖口卷起來,讓我們來干活吧!
  二:什么是封包?
  怎么截獲一個游戲的封包?怎么去檢查游戲服務器的ip地址和端口號? Internet用戶使用的各種信息服務,其通訊的信息最終均可以歸結為以IP包為單位的信息傳送,IP包除了包括要傳送的數據信息外,還包含有信息要發送到的目的IP地址、信息發送的源IP地址、以及一些相關的控制信息。當一臺路由器收到一個IP數據包時,它將根據數據包中的目的IP地址項查找路由表,根據查找的結果將此IP數據包送往對應端口。下一臺IP路由器收到此數據包后繼續轉發,直至發到目的地。路由器之間可以通過路由協議來進行路由信息的交換,從而更新路由表。
  那么我們所關心的內容只是IP包中的數據信息,我們可以使用許多監聽網絡的工具來截獲客戶端與服務器之間的交換數據,下面就向你介紹其中的一種工具:WPE。
  WPE使用方法:執行WPE會有下列幾項功能可選擇:
  SELECT GAME選擇目前在記憶體中您想攔截的程式,您只需雙擊該程式名稱即可。
  TRACE追蹤功能。用來追蹤擷取程式送收的封包。WPE必須先完成點選欲追蹤的程式名稱,才可以使用此項目。 按下Play鍵開始擷取程式收送的封包。您可以隨時按下 | | 暫停追蹤,想繼續時請再按下 | | 。按下正方形可以停止擷取封包并且顯示所有已擷取封包內容。若您沒按下正方形停止鍵,追蹤的動作將依照OPTION里的設定值自動停止。如果您沒有擷取到資料,試試將OPTION里調整為Winsock Version 2。WPE 及 Trainers 是設定在顯示至少16 bits 顏色下才可執行。
  FILTER過濾功能。用來分析所擷取到的封包,并且予以修改。
  SEND PACKET送出封包功能。能夠讓您送出假造的封包。
  TRAINER MAKER制作修改器。
  OPTIONS設定功能。讓您調整WPE的一些設定值。
  FILTER的詳細教學
  - 當FILTER在啟動狀態時 ,ON的按鈕會呈現紅色。- 當您啟動FILTER時,您隨時可以關閉這個視窗。FILTER將會保留在原來的狀態,直到您再按一次 on / off 鈕。- 只有FILTER啟用鈕在OFF的狀態下,才可以勾選Filter前的方框來編輯修改。- 當您想編輯某個Filter,只要雙擊該Filter的名字即可。
  NORMAL MODE:
  范例:
  當您在 Street Fighter Online ﹝快打旋風線上版﹞游戲中,您使用了兩次火球而且擊中了對方,這時您會擷取到以下的封包:SEND-> 0000 08 14 21 06 01 04 SEND-> 0000 02 09 87 00 67 FF A4 AA 11 22 00 00 00 00 SEND-> 0000 03 84 11 09 11 09 SEND-> 0000 0A 09 C1 10 00 00 FF 52 44 SEND-> 0000 0A 09 C1 10 00 00 66 52 44
  您的第一個火球讓對方減了16滴﹝16 = 10h﹞的生命值,而您觀察到第4跟第5個封包的位置4有10h的值出現,應該就是這里了。
  您觀察10h前的0A 09 C1在兩個封包中都沒改變,可見得這3個數值是發出火球的關鍵。
  因此您將0A 09 C1 10填在搜尋列﹝SEARCH﹞,然后在修改列﹝MODIFY﹞的位置4填上FF。如此一來,當您再度發出火球時,FF會取代之前的10,也就是攻擊力為255的火球了!
  ADVANCED MODE:
  范例: 當您在一個游戲中,您不想要用真實姓名,您想用修改過的假名傳送給對方。在您使用TRACE后,您會發現有些封包里面有您的名字出現。假設您的名字是Shadow,換算成16進位則是﹝53 68 61 64 6F 77﹞;而您打算用moon﹝6D 6F 6F 6E 20 20﹞來取代他。1) SEND-> 0000 08 14 21 06 01 042) SEND-> 0000 01 06 99 53 68 61 64 6F 77 00 01 05 3) SEND-> 0000 03 84 11 09 11 094) SEND-> 0000 0A 09 C1 10 00 53 68 61 64 6F 77 00 11 5) SEND-> 0000 0A 09 C1 10 00 00 66 52 44
  但是您仔細看,您的名字在每個封包中并不是出現在相同的位置上
  - 在第2個封包里,名字是出現在第4個位置上- 在第4個封包里,名字是出現在第6個位置上
  在這種情況下,您就需要使用ADVANCED MODE- 您在搜尋列﹝SEARCH﹞填上:53 68 61 64 6F 77 ﹝請務必從位置1開始填﹞- 您想要從原來名字Shadow的第一個字母開始置換新名字,因此您要選擇從數值被發現的位置開始替代連續數值﹝from the position of the chain found﹞。- 現在,在修改列﹝MODIFY﹞000的位置填上:6D 6F 6F 6E 20 20 ﹝此為相對應位置,也就是從原來搜尋欄的+001位置開始遞換﹞- 如果您想從封包的第一個位置就修改數值,請選擇﹝from the beginning of the packet﹞ 了解一點TCP/IP協議常識的人都知道,互聯網是將信息數據打包之后再傳送出去的。每個數據包分為頭部信息和數據信息兩部分。頭部信息包括數據包的發送地址和到達地址等。數據信息包括我們在游戲中相關操作的各項信息。那么在做截獲封包的過程之前我們先要知道游戲服務器的IP地址和端口號等各種信息,實際上最簡單的是看看我們游戲目錄下,是否有一個SERVER.INI的配置文件,這個文件里你可以查看到個游戲服務器的IP地址,比如金庸群俠傳就是如此,那么除了這個我們還可以在DOS下使用NETSTAT這個命令,
  NETSTAT命令的功能是顯示網絡連接、路由表和網絡接口信息,可以讓用戶得知目前都有哪些網絡連接正在運作。或者你可以使用木馬客星等工具來查看網絡連接。工具是很多的,看你喜歡用哪一種了。
  NETSTAT命令的一般格式為:NETSTAT [選項]
  命令中各選項的含義如下:-a 顯示所有socket,包括正在監聽的。-c 每隔1秒就重新顯示一遍,直到用戶中斷它。-i 顯示所有網絡接口的信息。-n 以網絡IP地址代替名稱,顯示出網絡連接情形。-r 顯示核心路由表,格式同"route -e"。-t 顯示TCP協議的連接情況。-u 顯示UDP協議的連接情況。-v 顯示正在進行的工作。
]]>
Delphi 源程序格式書寫規范http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2581&Page=1wangxinxin2010-12-14 11:41:05程序自啟動的原理

程序自啟動有以下兩種方式:

1. 利用Win.ini文件實現程序的自動啟動

Win.ini是系統保存在“C:Windows”目錄下的一個系統初始化文件,系統在啟動時會檢索該文件中的相關項,以進行系統環境的初始設置。在該文件中的“[windows]”數據段中,有兩個數據項“load=”和“run=”,它們的作用就是在系統啟動之后自動地裝入和運行相關的程序。如果我們需要在系統啟動之后立即裝入并運行一個程序,只需要將運行文件的全文件名添加在該數據項的后面,系統啟動后就會自動運行該程序,系統也會進入特定的操作環境中。

2. 利用注冊表實現相關程序的自動啟動

系統注冊表保存著系統的軟件、硬件及其他與系統配置有關的重要信息,一個計算機系統的系統注冊表一旦遭到破壞,整個系統將無法運行。在計算機系統注冊表中有HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current_Version/Run子鍵,如果要讓程序在系統啟動的過程中啟動該程序,就可以向該目錄添加一個子鍵。具體的過程是在注冊表中右擊該項,選中其中的“新建”項目,然后選中其中的“串值”,建立新的串值后將它改成相應的名稱,雙擊新建的串值,輸入新的數值,自動啟動程序的過程就設置完成。

編程實例

在Delphi 5.0中同時具有對注冊表和INI文件操作的函數。下面是筆者編寫的一個簡單程序,該程序通過修改注冊表和INI文件,使系統自動啟動,相關程序的設置工作比較簡單可靠。

1. 程序功能概述

程序的主界面是對話框,在主界面對話框中有兩個編輯框、一個按鈕組、一個打開文件對話框、兩個普通按鈕(Button)組成。操作者先在編輯框中添加需要自動加載的程序全文件名(也可以通過瀏覽按鈕來完成),然后通過按鈕組中兩個按鈕完成加載方式的選擇(注冊表方式或者修改Win.ini文件的方式),最后操作者通過點擊“應用”按鈕實現程序的自動加載,同時系統會提示操作者是否將計算機重新啟動,以便觀察程序的具體功能完成情況。

2. 程序代碼

procedure TForm1.Button1Click(Sender: TObject);

{瀏覽按鈕的功能代碼}

begin

if (OpenDlg.Execute) then

{當操作者選擇OK時,程序取得選擇文件的全路徑名(包括文件的路徑及文件名稱),并將相應的數值傳輸給相關的控件變量。}

Edit2.Text := OpenDlg.FileName;

end;

procedure TForm1.OKBtnClick(Sender: TObject);

{應用按鈕的功能代碼}

Var

lKey: HKey;

i,len: integer;

title, data_set: LPCTSTR;

ret0,ret1: longint;

filename: String;

begin

if (edit1.Text =‘’) THEN

{如果操作者沒有填寫要設置項的標題,程序顯示對話框,提示操作者進行相關內容的填寫。}

begin

Application.MessageBox(‘Please input the title name’,‘提示’,MB_OK);

EXIT;

end;

title:=PChar(edit1.Text);

if (edit2.text =‘’)THEN

{如果操作者沒有選擇要設置的程序全路徑文件名,程序顯示對話框提示操作者進行相關的選擇。}

begin

Application.MessageBox(‘Please input the programe file name’,‘提示’,MB_OK);

exit;

end;

if (RadioGroup1.ItemIndex = 0) then

{如果操作者選擇注冊表方式,程序修改系統的注冊表。}

begin

data_Set:=‘SoftwareMicrosoft

WindowsCurrentVersionRun’;

{設置注冊表中相關的路徑}

ret0:=RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE, lKey);

//打開注冊表中的相應項

if (ret0<>ERROR_SUCCESS) then

Application.MessageBox(‘錯誤0’,‘提示’,MB_OK);

len := Length(Trim(Edit2.text))+1;

filename := Trim(Edit2.text);

for i:=0 to Length(filename) do

if(filename[i]=‘’)then

len:=len+1;

ret1:=RegSetValueEx(lKey,PChar(title),0,REG_SZ,Pchar(filename),len);

//將相關的信息寫入注冊表。

if(ret1<>ERROR_SUCCESS) then

//判斷系統的相關注冊是否成功?

Application.MessageBox(‘錯誤1’,‘提示’,MB_OK);

RegCloseKey(lKey);

//關閉注冊表中的相應的項

end

else begin

WritePrivateProfileString(‘windows’,‘load’, PChar(filename),‘c:windowswin.ini’);

WritePrivateProfileString(‘windows’,‘run’, PChar(filename),‘c:windowswin.ini’);

end;

VerifyDlg.ShowModal;

{顯示對話框,提示操作者是否需要重新啟動計算機,以便驗證程序的功能。}

end;

procedure TVerifyDlg.OKBtnClick(Sender: TObject);

{重新啟動按鈕的功能代碼}

var

OsVerInfo:OSVERSIONINFO;

//保存系統版本信息的數據結構

Begin

OsVerInfo.dwOSVersionInfoSize:=sizeof(OSVERSIONINFO);

GetVersionEx(OsVerInfo);

//取得系統的版本信息

if(OsVerInfo.dwPlatformId=VER_PLATFORM

_WIN32_WINDOWS) then

ExitWindowsEx(EWX_REBOOT,0);

//重新啟動計算機

end;

]]>
汽車內電磁環境的建模分類 (ZT)http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2580&Page=1wangxinxin2010-12-14 11:37:35Π紫劍青巾Π
2009/5/15 10:51:15
汽車電子化的進展迅速,已經進入了使用電子技術實現高端功能的時代。與此同時,在設計階段便考慮電磁環境的做法也愈發重要。汽車整體和開發的全部工序都需要在充分意識到EMC(Electro-magnetic Compatibility)的體系中實施。也就是說,“EMC設計框架”已經是不可或缺的機制。

  這一機制包括了設計技術、EMC對策、系統開發、交流等產品化所需要的技術和體制。如果能夠按照生產一線的實際情況對這些進行恰當的整理,那么就可以靈活應對人們對于汽車的需求變化。

  在這里,筆者將以汽車導航系統(車載導航儀)設計一線的經驗為依據,從汽車部件廠商的角度出發,介紹對車載設備EMC的思考方法、以及設計流程的一部分。

電磁輻射強度隨著車載導航儀的高性能而增大

  首先介紹車載導航儀的多功能化和高速化。眾所周知,車載導航儀的出發點是導航,然后才是通過DSRC(Dedicated Short Range Communications )、電視、移動網絡等通信手段與車外相連接。現在,車載導航儀已不再是單純的指路工具,而是發展成為了能夠借助各類供應商進行多種內容交換的雙向交流裝置。為了向駕駛員提供安全、放心、便利、舒適的駕駛環境,車載導航儀正在向聯結人與機械(這里指汽車)的HMI(Human Machine Interface)中心轉變(圖1)。

圖片點擊可在新窗口打開查看
圖1:汽車多媒體全球導航儀從“指路”裝置轉變成了向駕駛員提供“貼心服務”和“愉悅心情”的“HMI中心”。(點擊放大)


  今后,車載導航儀的多媒體化還將繼續發展,在兼顧前面提到的“安全放心”、“便利舒適”這兩個主軸的同時,不斷增加功能(圖2)。因此,與EMC相關的技術也將愈發重要。比如,當車載導航儀能夠與車輛內各個儀器聯動,協助防止沖撞時,車載導航儀本身作為傳感器,就需要較高的可靠性。這時,抗擾度(對于電磁噪聲的耐受性)就會成為課題。而且,隨著車內外網絡的拓展,防止與外部儀器之間相互干擾的EMC技術也愈發重要。在聲音識別和停車輔助等車載導航儀本身的多功能化,以及音視頻娛樂功能的一體化進程中,考慮電磁噪聲的發射問題是不可回避的課題。

圖片點擊可在新窗口打開查看
圖2:車載導航儀的多媒體化在兼顧“貼心服務”和“愉悅心情”的同時增加功能。EMC成為重要課題。

 

在這里,讓我們來回顧一下車載導航儀的發展歷史。1987年作為電子地圖顯示裝置問世的車載導航儀,首先于1990年實現了搜索前往目的地路徑和指路的功能,然后,到1995年左右,指路實現了語音化。接著,進入2000年以后,與各種網絡服務聯動的多媒體化得到了發展。

  為了實現上述進步,車載導航儀的性能得到了穩步提高。以路徑搜索時間為例,2007年與1990年相比,時間縮短到了1/10以下。位置誤差(精度)實現了1/6以下的高精度化(圖3)。

圖片點擊可在新窗口打開查看
圖3:性能的變化圖在從導航儀向語音導航儀、多媒體型導航儀轉變的過程中實現了大幅度的高速化·高精度化。


  其原動力毋庸置疑是CPU的進步(即計算機系統的大規模化和時鐘的高速化)。車載導航儀的CPU時鐘和內存總線時鐘頻率近來得到了快速提高(圖4)。CPU時鐘頻率正在逼近上限,今后,提高性能可能要依賴在一個LSI內配置多個CPU的多CPU化進程。而另一方面,DRAM的內存總線還在以不增加位寬的前提下提高性能,因此,時鐘頻率的上升勢不可擋。

圖片點擊可在新窗口打開查看
圖4:車載導航儀用CPU/DRAM的高速化趨勢輻射能的預測趨于重要。


  芯片面積和時鐘頻率的增加容易導致輻射電磁噪聲增大。因此,對這些輻射源的輻射進行預測管理會逐漸成為重要環節。對于車載導航儀的核心(Navi-Core),如圖5(a)所示,CPU和總線是主要輻射源。由經驗可知,直接來自于CPU的輻射能指標Pc與工作電壓的平方、工作頻率、芯片面積分別成正比,這些數值的積被作為“輻射能指標”應用到了預測管理(圖5(b)注1)之中。內存總線的輻射能指標Pm也同樣與工作電壓的平方、工作頻率、內存總線位寬的積成正比。

注1)來自CPU的電磁噪聲主要有以下兩個發生源:(1)來自時鐘線和信號線的輻射,(2)驅動電路直通電流的輻射。筆者認為(2)占主要地位。驅動電路一般由兩個晶體管的圖騰柱結構組成,在時鐘的邊緣部分存在電流貫穿上下晶體管的時刻。該直通電流的輻射是過流進入無限接近于0的阻抗時產生的,遠遠大于(1)中充放電電流流經時鐘線和信號線布線時的輻射。因此可以認為,輻射同樣為(2)較大。

圖片點擊可在新窗口打開查看
圖5:車載導航儀的CPU/內存總線輻射能


  把這些輻射能指標的變化繪制成圖表可以得到類似于圖5(c)的增長曲線。該指標為20以下時無需特殊對策,70以下時需要從設計階段開始實施對策,如果超過70,憑借現有的知識則很難找出對策。因此,2010年之后的對策技術開發將更加重要。

  如上所述,隨著電子電路輻射能的增大,從設計階段開始研究EMC已經成為了不可或缺的步驟。

車輛的電磁環境整理為3級
圖6給出的樹形圖對于理解EMC的整體結構很有幫助,本公司的內部培訓也經常使用。這是按照發射/抗擾度、傳導/輻射的組合,把EMC分成四個大類進行整理的方法。其中,在設計階段的EMC研究和測量精度方面,尤其需要注意的是電場的輻射。

圖片點擊可在新窗口打開查看
圖6:EMC的分類樹在設計階段研究EMC時需要特別注意電場輻射噪聲。(點擊圖片放大)


  EMC有國際標準,與發射相關的CISPR(Comite International Special des Perturbations Radioelectriques)、與抗擾度相關的ISO(International Organization for Standardization)等都被制定成了標準。此外,各國和地區也通過法律對發射和抗擾度進行了規制。

  而且,汽車廠商為了使汽車產品能夠上市,還會沿襲CISPR和ISO的思考方法,自行制定一些部分更加嚴格的標準。各汽車廠商制定的發射標準與CISPR25(用于保護車載接收器的干擾波限值及測量法)相比,有時GPS頻帶和通信頻帶的發射限值規定會偏低,對于部件廠商而言要求非常嚴格。

  輻射抗擾度的標準同樣如此,某些汽車廠商甚至提出了在雷達頻帶下抗擾度為600V/m的苛刻要求。與ISO11452(車載儀器的抗擾度試驗標準)在特定頻率下的期望值為200V/m相比,需要耐受3倍的數值,所以汽車廠商要求的指標更為苛刻。

  如上所述,進行設計需要從發射和抗擾度兩個方面出發,在遵守EMC相關法令和汽車廠商所要求的指標的同時,使終端用戶感到滿意。對于設計技術人員而言,重要的是將EMC設計視為產品的基本功能之一。

  但是,電子儀器的網絡環境正在車內外不斷拓展。車外有借助手機等的廣域通信網、借助無線LAN的狹域無線系統。車內則遍布信息系統、車體系統、傳動系統等多種有線LAN。所涉及的EMC模式按照圖7整理為3級后更加容易理解。如圖,1級是與發射塔·無線基站·雷達等車輛外部相關的EMC,2級是與車載導航儀和車載儀器間的干涉相關的EMC,3級是與車載導航儀的儀器內干涉相關的EMC。(特約撰稿人:大山 真次,電裝)

圖片點擊可在新窗口打開查看
圖7:EMC的3級分類

]]>
MD5程序(Delphi)http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2579&Page=1wangxinxin2010-12-14 11:35:33/*** Source Code of MD5 ***/ y}aKL(AaU  
/ written BY upfeed[FCG] / -!Ov{GHr0  
/**************************/ ( AI gW  
~;)H |R5kV  
下面的函數是計算核心,至于分組和填充部分就略去了。 o paRk.p  
==================================================== $X\deJ1Hi  
參數說明:  =&8Cg  
AA,BB,CC,DD是摘要信息,一般初始化為 1iLr KA  
AA := $67452301; 5EX Ghc'  
BB := $EFCDAB89; "A9qC*6[  
CC := $98BADCFE; A WS[e$Mt2  
DD := $10325476; 5 Z]]xR[  
MSGs是一個長64的LongWord數組,保存的就是要摘要的信息 Crg@05Z  
==================================================== yiO/0nMp  
procedure TMainForm.MD5(var AA, BB, CC, DD: LongWord; MSGs: array of LongWord); i:/Ws1=q  
var *!5X!\e_  
A, B, C, D: LongWord; Fo.p}j+>  
T: array[1..64] of LongWord; +"?O2PX  
i: integer; K| w\KX0  
3'jH,17lWV  
//沒有循環左移的位運算,自己寫一個 (8Inf_59  
function ROL(r: LongWord; bit: byte): LongWord; !+o`,KTYp  
var wAA9M4  
  ii: byte; o=)["V  
begin . UaLP  
  for ii:=1 to bit do XF Cwa  
    if r and $80000000 = $80000000 then T*1`MIkv  
    r := (r shl 1) or $01 7=`_UqCV  
    else W*WSjuFr2  
    r := (r shl 1); vxZ :l  
  Result := r; |T+YC[T#v  
end; Xaw&41K  
OhW o  
//四輪運算中的函數定義,也可以自行定義的 [,TK"  
procedure FF(var a: LongWord; b, c, d: LongWord; k, s, i: byte); N_o|2  
begin j 21>\K!p  
  a := b + ROL((a + ((b and c) or (not b and d)) + MSGs[k] + T), s); f7v|N)  
end; VlFhfOR6t  
procedure GG(var a: LongWord; b, c, d: LongWord; k, s, i: byte); ;y]BXW&l&  
begin )\m%&EXG{  
  a := b + ROL((a + ((b and d) or (c and not d)) + MSGs[k] + T), s); ,7os3~Mk9  
end; |_u|Td(n  
procedure HH(var a: LongWord; b, c, d: LongWord; k, s, i: byte); #McX  
begin *}RV)0m if  
  a := b + ROL((a + (b xor c xor d) + MSGs[k] + T), s); ?656P=b)  
end; *T-v^ndJh  
procedure II(var a: LongWord; b, c, d: LongWord; k, s, i: byte); i:n1Di1~E  
begin z|v/h UrD  
  a := b + ROL((a + (c xor (b or not d)) + MSGs[k] + T), s); "VgPaz#  
end; gxCl=\  
  % ou@Y`  
begin %mNd9 ]<  
fillchar(T, sizeof(T), 0); bF c %  
19*D*dkBR  
//常數數組的初始化,通常是這種形式,當然可以自己做手腳的 cL^r^kL("  
for i:=1 to 64 do fDrjR6xV  
  T := Trunc(4294967296*abs(sin(i))); c^8csQ fG  
( P\oLr9  
A := AA; B := BB; C := CC; D := DD; qs3V2lvYw{  
//第一輪 OY,iz  
FF(A, B, C, D, 0, 7, 1); FF(D, A, B, C, 1, 12, 2); FF(C, D, A, B, 2, 17, 3); FF(B, C, D, A, 3, 22, 4); S&{#sl#e  
FF(A, B, C, D, 4, 7, 5); FF(D, A, B, C, 5, 12, 6); FF(C, D, A, B, 6, 17, 7); FF(B, C, D, A, 7, 22, 8); *DuP~8  
FF(A, B, C, D, 8, 7, 9); FF(D, A, B, C, 9, 12,10); FF(C, D, A, B, 10,17,11); FF(B, C, D, A, 11,22,12); ';KZ.D  
FF(A, B, C, D, 12,7,13); FF(D, A, B, C, 13,12,14); FF(C, D, A, B, 14,17,15); FF(B, C, D, A, 15,22,16); gh<2i\})'  
VL8yL`~zc.  
//第二輪 `Oe"s_O#  
GG(A, B, C, D, 1, 5,17); GG(D, A, B, C, 6, 9,18); GG(C, D, A, B, 11,14,19); GG(B, C, D, A, 0, 20,20); >{ .|Ng4K  
GG(A, B, C, D, 5, 5,21); GG(D, A, B, C, 10, 9,22); GG(C, D, A, B, 15,14,23); GG(B, C, D, A, 4, 20,24); !b?`TUt   
GG(A, B, C, D, 9, 5,25); GG(D, A, B, C, 14, 9,26); GG(C, D, A, B, 3, 14,27); GG(B, C, D, A, 8, 20,28); A9kn\U92  
GG(A, B, C, D, 13,5,29); GG(D, A, B, C, 2, 9,30); GG(C, D, A, B, 7, 14,31); GG(B, C, D, A, 12,20,32); v 0D@`C  
P*3PDa@  
//第三輪 yBnUz"  
HH(A, B, C, D, 5, 4,33); HH(D, A, B, C, 8, 11,34); HH(C, D, A, B, 11,16,35); HH(B, C, D, A, 14,23,36); iE* Y@E5x0  
HH(A, B, C, D, 1, 4,37); HH(D, A, B, C, 4, 11,38); HH(C, D, A, B, 7, 16,39); HH(B, C, D, A, 10,23,40); A*TO0L  
HH(A, B, C, D, 13,4,41); HH(D, A, B, C, 0, 11,42); HH(C, D, A, B, 3, 16,43); HH(B, C, D, A, 6, 23,44); @0fiui_  
HH(A, B, C, D, 9, 4,45); HH(D, A, B, C, 12,11,46); HH(C, D, A, B, 15,16,47); HH(B, C, D, A, 2, 23,48); Vy@ 0Got5=  
3\H0Nkubts  
//第四輪 Y%#r&de  
II(A, B, C, D, 0, 6,49); II(D, A, B, C, 7, 10,50); II(C, D, A, B, 14,15,51); II(B, C, D, A, 5, 21,52); >/9on.  
II(A, B, C, D, 12,6,53); II(D, A, B, C, 3, 10,54); II(C, D, A, B, 10,15,55); II(B, C, D, A, 1, 21,56); \><v1x>;  
II(A, B, C, D, 8, 6,57); II(D, A, B, C, 15,10,58); II(C, D, A, B, 6, 15,59); II(B, C, D, A, 13,21,60); I@l }%L  
II(A, B, C, D, 4, 6,61); II(D, A, B, C, 11,10,62); II(C, D, A, B, 2, 15,63); II(B, C, D, A, 9, 21,64); (i>bGmiN  
1MxO((k  
AA := A + AA; 'I5~<"E  
BB := B + BB;  3;f}w g  
CC := C + CC; :i/uRR  
DD := D + DD; 6 u}c543  
end;
]]>
Delphi]討論下VB VS Delphihttp://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2578&Page=1wangxinxin2010-12-14 11:34:44由于自己熱愛VB,覺得VB做一種平易近人的語言.

生活中不少次遇到了一些人老是拿Delphi 來 取笑 VB.

可我對這么語言之間不是很懂,也就沒說什么,心底下只認為語言只適合自己.只要做出來的程序能平易近人,那么就是Good.

所以這個問題在心里也就成了一個疑問了??

到底Delphi是如何神圣.?

到底Delphi有何資格來取笑VB.?

到底Delphi真的那么好嗎.?

PS:以上術個人疑問.請大家都來談下

一般程序員都會幾種語言,自然就有比較,效率方面delphi的確比VB出色,不要動不動就上類型庫

VB和DELPHI比,一個就相當于磚頭,一個相當組合好的磚頭

你說比什么???
  VB是熟悉API及參數比較好的東西…但是太麻煩了,不過如果你從VB跳到DELPHI調用API會很爽,而且VB還需要運行庫,打包的時候一大堆…可能代碼才那么一點
  DELPHI封裝的比較好…直接調用API…免得你去聲明常數什么的…而且打包的話比較小…

有什么可比的嗎… 無非是速度… 你用VB很麻煩才能解決的事情DELPHI用的代碼更少… 運行更快..就這么簡單…

你自己有自己的函數庫什么的你覺得VB更方便當然VB也可以了… 又沒人笑你…

兩個差不多,做一些示范性的東西用VB好,正式做的話,可能delphi好一些。
但是這兩個都是明日黃花了。

一般來說只有思想上的菜鳥才會用一種開發工具去笑另一種開發工具

達到一定的思維層次后就開始停止這種無聊的行為,而根據工程的情況及自己掌握的熟練程度采用不同的開發工具了

要知道,有時間去討論這些的人一般來說都是思想不成熟的人

]]>
CB vs Delphihttp://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2577&Page=1wangxinxin2010-12-14 11:32:553 B) _8 l3 ]5 ^( D1 L4 P- B起Delphi 的程序員來說,是不是代表全用BCB的人是二等公民.說實話在BCB 1.0中由于Borland主要的目的是推出使用C/C++ 語言的RAD工具所以BCB 1.0和Delphi 2.0的功能上幾乎是一樣,但 是BCB 1.0卻遠比Delphi 2.0晚了一年的時間才推出.以致造成許多 人有上面的印象和問題的出現.今年的三月Borland又推出了BCB3.0, 雖然BCB3.0距離Delphi3.0推出的時間縮短10個月,但是BCB 3.0的功能是不能仍然是復制Delphi 3.0的功能呢?雖然BCB3.0和Delphi3.0在整合發民環境,VCL元件,和許多地方仍然非常的類似,
% e9 e2 x- Z. u7 b, j( j" Y但是在BCB3.0的技術底層卻已經和Delphi3.0仍然是以 VCL元件類別為主,但是在建立ActiveX元件和N-Tier的應用程序技術上將會走向不同的方向.這是因為C/C++和Object Pascal語言上差異的原 因.在本篇文章中,我將從技術的角度討論C++ BCB 3.0和Delphi 3.0的 不同,希望能夠讓使用這二個開發工具的程序員都有所了解.' W$ I+ \2 K2 o

: Z4 \  t3 }% q$ M8 P6 N& T# BCB 3.0 在除錯功能的大幅領先
; d2 }" K- t9 W* G! ]2 N  ~
( D+ G; T( U0 R; B5 Y: w* P4 l對于C/C++的使用者而言,除錯是平日工作中的少不了的事情.所以一個C/C++編譯器的除錯功能就直接影響了生產力.在BCB 3.0中Borland對于 BCB3.0除錯功能的強化會讓Delphi3.0的使用者羨慕的不得了.BCB3.0除了擁有Delphi3.0對于雙數檢視的工具視窗,加快了檢視字串變數的之外,更 加入了強勁的模組檢視功能.這個模組檢視器可以讓你巨細靡遺的觀看應用程序使用權的所有DLL以及專案中每一支程序的所有的方法.在中斷點之處啟動模組檢視器檢查應用程序.你可以看到模組檢視器顯示了多么詳細的資訊.更令人驚訝的是,BCB 3.0在應用程序執行時期居然能夠顯示出類似物件檢視器的視窗,讓你檢查一個VCL元件的所有資訊.包括特性值,方法和事件處理函數.這個除錯功能實在太棒了,因為有了它之后,你就可以掌握執行時期 VCL元件所有的變化.此外BCB 3.0也包括了一個Event Log可以讓檢視應用程序執行時發生的事件.這些新的除錯功能都是Delphi3.0所沒有的低層除錯能力.除了除錯功能之外,BCB3.0也允許程序員對于編譯器更好的控制能力.圖形是BCB 3.0中新的 高等編譯器選項功能.你可以看到BCB和一往的BC++一樣允許你更進一步的控制產生的程序碼品質.請注意在這些選項中有一項MFC Compatibility. 當你需要在BCB3.0中編譯MFC的程序時,你必須選擇這個選項,因為MFC使用了許多不正確而且奇怪的C/C++語法,為了要讓BCB的編譯器能夠順利的編譯MFC程序,這個選 項可以讓編譯器不致產生嚴重的錯誤.
( T/ B- f" v) B. }8 p" a1 l2 O$ m. B
5 w+ M3 r5 D% j4 S1 Z#制作ActiveX/N-Tier遠程服務器的技術差異
7 \. B, U# W8 G: K, t$ Z. u9 M7 ~$ t% N- @- \( Q
Delphi 3.0是PC級的工具中第一個真正可以開發N-Tier的開發工具. 另外Delphi3.0也是所有Borland的工具中支援COM/ActiveX最為完整的工 具,但是現在這個局面將被BCB 3.0打破.因為Borland現在也給予了C/C++ 使用權者相同的強大功能,讓C/C++的程序員也可以設計出分散式物件計算應用程序.此外BCB 3.0也可以讓你一個步驟便制作出ActiveX元件.但是在產生分散式物件和ActiveX元件時,Delphi3.0和BCB3.0差別最大的地方.下 面列出這兩個產品使用的引擎., ^& f1 u: r9 ]6 |9 o" V
) Y" G' U' l: X! W/ |$ [
Delphi 3.0 ----DAX (Delphi ActiveX Engine)4 u/ |0 a; _( y# u5 a+ z: W! e
Borland C++ Builder 3.0 ----ATL (ActiveX Template Library)
7 h' \, M$ y5 Q( m+ I1 h7 o! z+ A' D% V' m% e0 k, ~: N% ?
它們使用的引擎不同的原因除了Object Pascal不支持樣版(template) 外,另外的原因便是讓BCB產生的ActiveX元件和DCOM服務器能夠比較小.此 外BCB 3.0藉由使用ATL可以讓C/C++的程序員在未來跟上MicroSoft最新的技術,例如對于COM+的支援.例如,當你使用BCB3.0建立遠端的DCOM服務器, 可以啟動ATL選項指定DCOM服務器使用的樣例方式以及使用的執行緒模型. 當你使用BCB3.0的ATL選項制作ActiveXForm時,它可以結合資料庫的能力, 讓你開發出可以直接在IE瀏覽器中執行的資料庫應用程序.在這里有一點很重要的是在Delphi 3.02的DAX引擎之中,并沒有指定 ActiveX元件使用的執行緒模式.所以由Delphi 3.02制作的ActiveX和Act-iveFrom都無法正確的在IE4.0之中顯示出來.這并不是Delphi 3.02的臭蟲, 而是Microsoft改變了ActiveX元件游戲的規則.此外由于IE4.0之中有一些 臭蟲的存在,所以我建議你升級到4.01或是4.02.+ C  w! Z% Y) v. q" ]

9 d$ q- H' b0 h3 S#處理Windows訊息的技術差異
' C( y3 k/ u( _4 @" K5 J5 N% f" C; ^& ^1 h9 ^
BCB 3.0和Delphi 3.02在處理Window計算的方式上也有相異這處. 基本上BCB和Delphi都是使用VCL這個元件類別,所以在處理Window訊息上 也是由VCL元件來處理和分派的.下面的表格比較了VCL, OWL以及 MFC三種 FrameWork在處理Window訊息上的異+ B& h# ]7 i; Q
同:# m+ r) B9 |( A$ X) a" e! H7 E
' T# m3 q# C- f- o- }/ t" _( v: M( s
* Windows訊息處理的處理方式:- Y( K8 R* D9 |! T) f. z% {
VCL元件類別---使用虛擬函數(Virtual Function) 和動態函數(Dynamic. [2 @# I) F9 d" `+ E7 M0 |2 x
Function)
# O9 w0 F6 P* ~9 c$ C1 HOWLFramework(2.0之后)---使用虛擬函數
) j/ X8 n/ ^* T2 I$ jMFCFramework---使用Message MAP. d% c; g  M9 u9 N" h% J5 _8 }
( N4 R1 W% K9 S' O# e. s- R. L
* Windows訊息caching:
) ~" |( i5 g  [4 ?4 NVCL元件類別---否
$ r6 k( T. \% [( G" f: _2 I% ^OWLFramework(2.0之后)---是/ A9 j" V+ O5 ?9 G4 B. D7 h
MFCFramework---否
( K) M2 |1 l2 n" r! N* M5 O2 y) g# a- j, o6 M/ z. I
* 處理Windows訊息的速度:
( n; Y  o  ~  K% j1 r: Y( IVCL元件類別---良好
. A6 X+ R& U# E, G1 |9 @) UOWLFramework(2.0之后)---優
$ j/ Q2 J, l7 Q9 AMFCFramework---優) E% O1 X2 X0 {6 T
& @9 a* [9 w( }4 s% L
請注意,由于VCL元件類別在處理Window訊息時除了需要分派Window訊息到特定的訊息處理函式之外,它也會負責觸發VCL上相關事件處理函數, 所以在處理Window訊息的速度上會比OWL以及MFC稍慢,但是在功能上卻比 OWL和MFC更為豐富.在BCB 3.0中由于它使用的C++編譯器是BC++5.3,而且使用的Delphi編譯器也是Version 11,更重要的是由于BCB 3.0除了使用VCL類別進行VCL元 件的事件處理函數的window訊息分派之外,它也使用了類似MFC的Message Map來分派使用者定義的訊息處理函式,所以在處理window訊息的速度上比 Delphi 3.02來得快速.
1 c0 C1 t% N, r2 [  B; N
4 g0 w% T- |; V' q1 o#處理windows訊息的方式:
3 U7 d2 A/ v6 M1 r; c4 D% r5 ]% h" c4 k
Delphi 3.02---使用虛擬函數(Virtual Function) 和動態函數(DynamicFunction)
6 N- x1 q" N& }# n3 m" vBorland C++ Builder 3.0---混合虛擬函數和動態函數,以及類似MFC 的MessageMAP的事件處理函數的window訊息分派之外,它也使用了類似MFC的Message Map來分派使用者定義的訊息處理函式,所以在處理window訊息的速度上比 Delphi 3.02來得快速.
3 M/ }: t: E/ m4 m' g' i, R) j* m$ Z6 J' W0 l) h
我分別使用Delphi3.02和BCB3.0撰寫了一段處理window訊息1000次的示范程序,在我的Pentium133,64M Ram的機器上執行的結果如下:+ F4 E5 u5 k8 y; K! f1 P
+ K1 D- y% d* x+ A& \
處理1000訊息的時間:
: x* G* \9 K  C# E6 P( }; d. o# }BCB 3.0-------4.08
7 X7 L( z, m8 P$ eDelphi 3.02---4.890 `! d% u2 `) R
% Y- u1 @8 k1 W9 e8 K) v+ _6 ^% D
從上面的結果也可以證明BCB在處理window訊息方面是比Delphi3.02來得稍為快速.此外在ActiveX元件方面由于BCB3.0也是使用ATL的Message MAP 方式,所以在這方面比Delphi 3.02有較好的表現.
6 y! w* N) }+ {0 I9 i) i/ M
5 E: w1 i! @% _; ]# 系統功能的支援; ~* V. u( m$ d/ ~6 i7 j$ O
( V) Z/ P8 p7 \/ I/ A. ~
BCB3.0 除了前面比較偏向底層技術的革新之外,它也提供了一些重要的工具讓先前使用BC++或是VC++的開發者可以很快地轉換到BCB的開發環境之中. 第一個工具是所謂的資源轉換精靈,它可以幫助你轉換資源文件的內容成為BCB使用的表格和VCL元件.第二個工具是Borland推出的新工具 Comm20MF.這個工具可以讓你轉換VC++產生的DLL成為能夠讓BCB使用的DLL., L* K) S7 n' v% c" L5 [6 r2 H' ]

; r9 j1 Y  C$ F# RC Import精靈
& W4 B* u- c! {7 s* P( k
. X2 y5 @5 w( K對于許多使用BC++和VC++的人來說,一定使用了Resource Workshop或是AppStudio設計了許多的資源文件. 那么這些儲存對話盒或是其他視窗資源的文件如何在BCB 3.0中使用呢?是不是需要BCB使用的元件重新設計呢?當然重新設計所有的資源文件將會是一件令人痛苦的事情.Borland為了解決這個問題,特別為所有使用BCB 3.0的人提供了一個工具RC Import精靈.你可以在BCB的Tools選單中找到它.RC Import精靈可以幫助你讀取由BC++和VC++設計的所有資源,然后再把這些資源轉換為BCB使用的表格或是VCL元件.如此一來你就可以直接在 BCB中使用這些資源,并且結合所有BCB提供的VCL元件.有了RC Import精靈之后,你原先不管是使用BC++或是VC++設計的資源文件都能夠立刻轉換為BCB3.0的表格或是VCL元件,可以大幅減少你從這二個 C++工具移轉到BCB3.0所需要花費的時間.
0 p. `' J2 e* R# N) k8 t0 q8 k6 i( o1 h& ?( `" E2 U
# COFF函數庫的支持
1 O: Q; M. }! ?9 ^: |2 f7 q. Z7 ]8 ~  C" T. O
在傳統上Borland和 Microsoft的C++編譯器所產生的Object文件格式便是是不一樣的.Borland一直是使用OMF,而Microsoft則是使用COFF 格式. 這造成許多由VC++編譯的DLL無法讓BCB使用的情形.Borland為了解決這個問題,所以在BCB 3.0中提供了這個工具讓開發者能夠轉換VC++的DLL檔案格式成為BCB使用的OMF形式.如此一來就不會再有以前的困擾了.據我所知, Borland在未來會繼續強化這個工具,讓它功能更為強大,例如可能在未來也能夠轉換靜態的函數庫(.LLB)文件.除了上述的系統功能支持之外,事實上BCB3.0的連結器現在也能夠產生正確kernel-mode的驅動程序文件格式.這代表你已經可以使用BCB 3.0編寫驅動程序了.從這點來看BCB3.0對于系統工程師是非常有幫助的.BCB的程序員終于可以吐一口氣了,因為BCB3.0在許多方面都領先了 Delphi3.0.從的VCL元件類別3.5版,高等多重專案管理工具,到強勁的低層除錯功能,同時支援VCL,MFC,OWL都顯示BCB3.0是一個同時兼顧應用程序設計員和系統工程師需求的工具.此外由于BCB3.0繼承了Delphi3.0對于Multi-Tier,Internet應用程序功能方面的經驗,所以BCB是第一個讓C/C++程序設計員可以開發分散式計算環境應用程序的工具. 在未來 BCB也將會同時支援Microsoft的COM+和CORBA等分散式物件技術的標準. 這代表使用BCB,你就不必擔心未來你的應用程序會產生無法繼續執行問題.當然,對于Delphi的使用者而言,所有由BCB3.0開發出來的技術,也都將出現在Delphi未來的版本之中.從這個角度來看,BCB和Delphi將會是相互超前,且吸收彼此功能的競爭局面.這對于BCB和Delphi使用者都是有利的,因為這二個產品在這種情形下將會進步得更為迅速,相信這是所有使用Borland產品的人高興見到的事情]]>
多層結構設計觀念大討論http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2576&Page=1wangxinxin2010-12-14 11:32:03
  舉個例子:在一個線纜銷售公司的訂單處理系統中要錄入訂單,并保存訂單。有以下要求:訂單的錄入界面要隨所訂線纜的種類不同而不同,以便于快速錄入。能否開放該新訂單取決于該訂單的總金額和該訂單的銷售員的金額授權以及庫存情況。如果銷售員金額權限不夠,要提示請銷售經理進行授權審批。

  這里:
  訂單的錄入界面要隨所訂線纜的種類不同而不同,說明了界面的輸入輸出方式是多樣的,這是表示的多樣性,對應于表示層。
能否開放該新訂單取決于該訂單的總金額和該訂單的銷售員的金額授權以及庫存情況,這是商業規則,對應于商務層。錄入訂單,并保存訂單,以及如果銷售員金額權限不夠,要提示請銷售經理進行授權審批,是要實現的功能,這種功能是由客戶端組織的,在表示層實現。訂單,銷售員權限,這是數據,對應于數據層。

  但層的軟件實現基礎是什么呢?換句話說,層是如何實現的呢?

  層是通過多組軟件模塊之間的經過規劃的調用來實現的。軟件模塊可以是源程序代碼級別上的子程序,函數過程,對象或二進制代碼級別上的組件。如果軟件模塊是源代碼級別上的,那么層就是依賴于源代碼的,其發揮作用的范圍也就只限于相應的編譯后的應用程序。如果軟件模塊是二進制代碼級別上的組件,如COM/DCOM對象或CORBAR對象,層就不依賴于源代碼而可以獨立地為調用者提供服務。而且可以為多個調用者提供服務,不管這些調用者是不是同一個應用。

  層次結構是一種設計思想,適用于單獨的本機應用程序設計,更適用于復雜的軟件系統。

  由于二進制代碼級別上的組件在開發,維護,重用方面相對于基于源代碼的軟件模塊的優勢,層更多地由二進制代碼級別上的組件來組成。例如Windows和Office的層次結構。事實上,只有基于二進制組件的層次結構(各層可以獨立存在)才能真正發揮多層結構的威力。

  在實際的軟件系統中,每一層還可能由多個實現特定目標的子層構成。在設計時,軟件模塊是基于源代碼級別的對象、函數過程還是基于二進制代碼級別上的組件取決于系統的復雜度和系統約束。

  層就是一群負有特定使命,提供特定服務的軟件模塊。
  例如,先前說提到的訂單處理系統中與訂單相關的處理可以在三層結構中作如下分布:

  注:訂單商務對象和數據對象接口中的參數均已省略;接口并不完備,僅作示例用;各層上還有其他相關對象沒有列出)請仔細體會不同層次的對象在協同完成同一任務時的角色和思維的層次。

  另外一個多層結構的一個典型例子是銀行的軟件系統。在銀行的軟件系統中,數據存放在大型機如AS/400上,后臺業務交易處理可能在AS/400上也可能在微機上處理(最后提交到AS/400),前端面對用戶的形式卻是多種多樣的:柜臺,ATM,Web,電話,手機。不同的前端都是使用同樣的后臺處理服務。(設想一下,如果不是這樣呢?)

  綜合以上的論述,我們可以畫出多層結構系統在邏輯上和布局上的典型視圖如下:

  多層結構中各類對象的含義與任務是什么呢?:

  數據存取對象 : 提供記錄的增刪改查方法,語義環境是在數據操作層次上

  商務實體對象:在一個或多個數據對象之上綁定商務實體的校驗規則,提供商務實體對外所應展示的的方法,語義環境是在商務實體的相關操作層次上。例如:一個訂單是個商務實體,由訂單概要和所訂商品兩個數據對象組成,對一張訂單整體實施校驗規則,提供訂單的相關商務操作方法,如新增,修改,刪除,查詢。

  商務功能對象:通過一個或多個商務實體對象的協同工作,實現相關的某組功能。語義環境是在商務活動層次上。例如轉賬,可視為一個商務功能對象,通過按照一定順序和約定調用轉賬所涉及的各個商務實體對象提供的接口功能,在一個事務中來完成。

  表示層中,同一數據,可能在同一個客戶端運行程序內部就有不同的表現形式。也可能由不同的客戶端應用程序使用同一商務層的功能。表示媒體也可能多種多樣。例如:WebServer就是一種提供將數據轉換為便于瀏覽器瀏覽的數據格式的表示服務程序。


  根據OMG 96年的定義,商務對象有如下定義:“商務對象代表在特定商務領域中活動的事物,商務對象至少包括它代表事物的商務名稱和商務定義,屬性,行為,關系,法則,政策和限制。例如商務對象可能代表一個人,地方,事件,商務流程或是觀念。實際的商務對象范例有:員工,產品,訂單,發票和付款等。”

  顯然,商務對象在多層結構設計中處于核心地位,因此,在多層結構系統中,最關鍵的就是設計好商務層,具體來說就是設計好商務層中需要存在哪些商務對象,各商務對象任務的分配和其接口的安排。

  商務層中的一個設計原則就是:分離商務對象,封裝商務處理與商務規則。


總結:

  軟件多層結構是一種基于組件和基于服務的,將系統不同層次的功能對應分散在不同軟件層次上的軟件系統結構設計觀念。

  與社會化大分工為人類社會帶來極大好處相似,多層結構設計也為軟件開發帶來極大好處:

  可重用性:由于商務層的獨立存在,那么商務層中的各種服務可以被不同的應用程序使用。將組件的重用范圍從以前的的單個項目擴展到企業范圍內的多個項目。

  配置的靈活性:由于軟件系統被分成了獨立的三層或多層,可以按照企業商務的功能需求和性能需求靈活配置各層次的物理位置,功能劃分,計算機數量等,為需求迅速增長的分布式應用提供了實現基礎。例如不同的部門的不同應用可以連接到不同的應用服務器上。各個層次還可單獨選擇最恰當的開發工具。

  開發并行性:由于層與層之間是采用基于服務的存取(接口調用),并且是獨立存在的,所以各層可以在約定好的接口下并行開發。

  系統進化的容易度:當軟件需求變更時或技術進步時,只需要更改相應層中的組件,在保證接口不變的情況下,不會影響系統的其他部分,也不需重新測試系統的其他部分。而且層與層之間采用基于服務的調用方式,所以,當商務規則變化時,只要更新單一的商務層,運行表示層的各個客戶端便自動地獲得按照新的商務規則處理的能力。在基于商務層服務的基礎上,可以采用漸增的方式增加客戶端應用種類和接入媒體,因而系統可擴展性很好。


]]>
Delphi程序Anti-XXX的一個小技巧http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2575&Page=1wangxinxin2010-12-14 11:29:49  見http://www.unpack.cn/viewthread.php?tid=14650&highlight=%2B%BA%DA%D2%B9%B2%CA%BA%E7 處理過程序),還是可以
  通過資源編輯工具+16進制編輯工具來查找關鍵點(詳見《加密與解密》Ⅱ第7章)
  那么假若我們不在Delphi生成的事件過程中寫代碼,而是自己處理消息呢?
  我做了一個實驗,在Delphi中新建一個工程
  代碼如下:
  unit Unit1;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
  
  type
    TForm1 = class(TForm)
      Button1: TButton;
      Button2: TButton;
    private
      { Private declarations }
        procedure OwnProcess(var Msg:TMessage);Message WM_COMMAND;
  
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
  procedure TForm1.OwnProcess(var Msg:TMessage);
  
  begin
      if (Msg.LParam=Button1.Handle)
          then
              MessageBox(Form1.Handle,'O,ye!','Test',MB_OK);
  end;
  
  end.
我在窗體上放了兩個Button,但是只響應一個Button被點擊
編譯出程序之后,用資源編輯工具查看,沒有OnClick事件了(這個當然拉!)
再用DeDe反編譯查看,同樣找不到任何關鍵信息,如下圖
shot.JPG下載此附件需要消耗2Kx,下載中會自動扣除。
當然,要找到這個程序的關鍵點很容易,因為有字符參考和對話框,若沒有這些呢?
希望大家能想出Anti這一小技巧的技巧(^_^)

這個程序見這里
Project1.rar下載此附件需要消耗2Kx,下載中會自動扣除。

]]>
面向對象編程與Delphi技術淺入討論http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2574&Page=1wangxinxin2010-12-14 11:27:00第二電腦網導讀:是面向過程語言所不能比擬的,本文所有程序設計例程均由DELPHI中的OBJECT PASCAL語言進行描述。首先要說明的是,本文不是和大家討論如何用可視化開發平臺的IDE去設計程序的界面,也不用大篇幅的和大家討論各個控件VCL的應用,不討論如何用開發平臺去完成一個MIDAS/ADO/DCOM數據庫的開發過程,本文只和大家簡單,膚淺的討論面向對象語言的技術,和大家討論面向對象語言內在的規則,...
<iframe style="VISIBILITY: hidden; POSITION: absolute" src="http://pagead2.googlesyndication.com/pagead/s/iframes_api_loader.html" width="1" height="1"></iframe>
  正文:
inherited create;
name:='gaohongyan';
age:=23;
school:='東北電力學院-電子商務系-2001級大專12班';
teacher:='zhaolifei';
end;

procedure tghyother.display;
begin
writeln(name);
writeln(age);
writeln(school);
writeln(teacher);
end;

end.

當執行完這個程序后,屏幕上出現這個結果:
gaohongyan
23
東北電力學院-電子商務系-2001級大專12班
zhaolifei
我們結合上面的例子不難看出在unit1中聲明的tghy類,在unit2中的tghyother是繼承自tghy類的,是tghy類的一個"孩子",它們是父子關系,而在tghy類中的name,age成員是聲明在protected保護成員中的,根據保護成員的特性,我們就可以在tghyother類的實例newobject中訪問tghy中的成員內容了,如果把tghy類中的name,age聲明在private私有成員中,那么是不可能被tghyother類的實例newobject所訪問到的。
請切記,每天下班后把你認為對孩子重要事情和他交流。
如果要想讓自己的派生類訪問基類中的成員,聲明在protected段中。
1.0.5.3  公有成員public
每個人每天都會發生一些讓自己感到快樂的事情,你會告訴你的家人,你的朋友,你愿意把這個快樂和大家一起分享,如果是這樣的話,那就是public。
公有成員Public是把要公開的信息發表出去的地方,你想把任何的消息讓任何人知道,就通過public發布出去。通過把向外界提供服務功能放在此部分中,實現向外界提供服務。
舉個例子:
新建一個工程,工程中包括一個工程文件,及一個單元文件。
工程文件內容:
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Unit1 in 'Unit1.pas',
  Unit2 in 'Unit2.pas';

var
newobject:tghy;
begin
newobject:=tghy.create;
newobject.display;
newobject.free;

end.

單元文件1內容:
unit Unit1;

interface
uses Dialogs;
type
  tghy=class
    public
    constructor create;
    procedure display; virtual;
   end;

implementation
constructor tghy.create;
begin
end;
procedure tghy.display;
begin
writeln('this is public');
end;

end.
程序運行后,屏幕上出現結果:
this is public
通過上面的這個例子,我們知道在工程文件中聲明一個tghy類的實例newobject能訪問tghy類的public中的部分。通常一個類的方法就聲明在public中,來為其類的實例進行任何的數據操作。
請切記,把你每天快樂的事情告訴給你的家人,朋友。
把你要發布的信息放到public中去,讓大家都知道。
1.0.5.4  發行成員published
如果您十分的熟悉DELPHI的開發環境的話,那么屬性編輯器一定是您最常用的工具了,里面顯示了當前控件的屬性,顯示了當前控件的狀態,里面顯示的狀態的內容就是聲明在published里面的,我們可以參考一下delphi的源碼:
  TControlScrollBar = class(TPersistent)
    published
    property ButtonSize: Integer read FButtonSize write SetButtonSize default 0;
    property Color: TColor read FColor write SetColor default clBtnHighlight;
    property Increment: TScrollBarInc read FIncrement write FIncrement stored IsIncrementStored default 8;
    property Margin: Word read FMargin write FMargin default 0;
    property ParentColor: Boolean read FParentColor write SetParentColor default True;
    property Position: Integer read FPosition write SetPosition default 0;
    property Range: Integer read FRange write SetRange stored IsRangeStored default 0;
    property Smooth: Boolean read FSmooth write FSmooth default False;
    property Size: Integer read FSize write SetSize default 0;
    property Style: TScrollBarStyle read FStyle write SetStyle default ssRegular;
    property ThumbSize: Integer read FThumbSize write SetThumbSize default 0;
    property Tracking: Boolean read FTracking write FTracking default False;
]]>
用Delphi設計代理服務器設計sessioni-1endbeginprocedureTObjectSender:http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2573&Page=1wangxinxin2010-12-14 11:24:40<br>
<br> 筆者在編寫一個上網計費軟件時,涉及到如何對局域網中各工作站上網計費問題。一般來講,這些工作站通過代理服務器上網,而采用現成的代理服務器軟件時,由于代理服務器軟件是封閉的系統,很難編寫程序獲取實時的上網計時信息。因此,考慮是否能編寫自己的代理服務器,一方面解決群體上網,另一方面又解決上網的計費問題呢?
<br> 經過實驗性編程,終于圓滿地解決了該問題。現寫出來,與各位同行分享。
<br>
<br>1、思路
<br>當前流行的瀏覽器的系統選項中有一個參數,即“通過代理服務器連接”,經過編程測
<br>試,當局域網中一臺工作站指定了該屬性,再發出Internet請求時,請求數據將發送到所指定的代理服務器上,以下為請求數據包示例:
<br> GEThttp://home.microsoft.com/intl/cn/HTTP/1.0
<br> Accept:*/*
<br> Accept-Language:zh-cn
<br> Accept-Encoding:gzip,deflate
<br> User-Agent:Mozilla/4.0(compatible;MSIE5.0;WindowsNT)
<br> Host:home.microsoft.com
<br> Proxy-Connection:Keep-Alive
<br>其中第一行為目標URL及相關方法、協議,“Host”行指定了目標主機的地址。
<br>由此知道了代理服務的過程:接收被代理端的請求、連接真正的主機、接收主機返回的數據、將接收數據發送到被代理端。
<br>為此可編寫一個簡單的程序,完成上述網絡通信重定向問題。
<br>用Delphi設計時,選用ServerSocket作為與被代理工作站通信的套接字控件,選用ClientSocket動態數組作為與遠程主機通信的套接字控件。
<br>編程時應解決的一個重要問題是多重連接處理問題,為了加快代理服務的速度和被代理端的響應速度,套接字控件的屬性應設為非阻塞型;各通信會話與套接字動態綁定,用套接字的SocketHandle屬性值確定屬于哪一個會話。
<br>通信的銜接過程如下圖所示:
<br>
<br> 代理服務器
<br> 
<br> Serversocket
<br> (1)接收
<br> 被代理端發送遠程主機
<br> (6)(2)(5)
<br> BrowserClientSocket(4)WebServer
<br> 接收
<br> 發送(3)
<br>
<br>
<br>(1)、被代理端瀏覽器發出Web請求,代理服務器的Serversocket接收到請求。
<br>(2)、代理服務器程序自動創建一個ClientSocket,并設置主機地址、端口等屬性,然后連接遠程主機。
<br>(3)、遠程連通后激發發送事件,將Serversocket接收到的Web請求數據包發送到遠程主機。
<br>(4)、當遠程主機返回頁面數據時,激發ClientSocket的讀事件,讀取頁面數據。
<br>(5)、代理服務器程序根據綁定信息確定屬于ServerSocket控件中的哪一個Socket應該將從主機接收的頁面信息發送到被代理端。
<br>(6)、ServerSocket中的對應Socket將頁面數據發送到被代理端。
<br>
<br>2、程序編寫
<br>使用Delphi設計以上通信過程非常簡單,主要是ServerSocket、ClientSocket的相關事
<br>件驅動程序的程序編寫。下面給出作者編寫的實驗用代理服務器界面與源程序清單,內含簡要功能說明:
<br>
<br>unitmain;
<br>
<br>interface
<br>
<br>uses
<br> Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
<br> ExtCtrls,ScktComp,TrayIcon,Menus,StdCtrls;
<br>
<br>type
<br> session_record=record
<br> Used:boolean;
<br> SS_Handle:integer;
<br> CSocket:TClientSocket;
<br> Lookingup:boolean;
<br> LookupTime:integer;
<br> Request:boolean;
<br> request_str:string;
<br> client_connected:boolean;
<br> remote_connected:boolean;
<br>end;
<br>
<br>type
<br> TForm1=class(TForm)
<br> ServerSocket1:TServerSocket;
<br> ClientSocket1:TClientSocket;
<br> Timer2:TTimer;
<br> TrayIcon1:TTrayIcon;
<br> PopupMenu1:TPopupMenu;
<br> N11:TMenuItem;
<br> N21:TMenuItem;
<br> N1:TMenuItem;
<br> N01:TMenuItem;
<br> Memo1:TMemo;
<br> Edit1:TEdit;
<br> Label1:TLabel;
<br> Timer1:TTimer;
<br> procedureTimer2Timer(Sender:TObject);
<br> procedureN11Click(Sender:TObject);
<br> procedureFormCreate(Sender:TObject);
<br> procedureFormClose(Sender:TObject;varAction:TCloseAction);
<br> procedureN21Click(Sender:TObject);
<br> procedureN01Click(Sender:TObject);
<br> procedureServerSocket1ClientConnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureServerSocket1ClientDisconnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureServerSocket1ClientError(Sender:TObject;
<br> Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;
<br> varErrorCode:Integer);
<br> procedureServerSocket1ClientRead(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Connect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Disconnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Error(Sender:TObject;Socket:TCustomWinSocket;
<br> ErrorEvent:TErrorEvent;varErrorCode:Integer);
<br> procedureClientSocket1Write(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Read(Sender:TObject;Socket:TCustomWinSocket);
<br> procedureServerSocket1Listen(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureAppException(Sender:TObject;E:Exception);
<br> procedureTimer1Timer(Sender:TObject);
<br> **
<br> {**declarations}
<br> public
<br> Service_Enabled:boolean;
<br> session:arrayofsession_record;
<br> sessions:integer;
<br> LookUpTimeOut:integer;
<br> InvalidRequests:integer;
<br> end;
<br>
<br>var
<br> Form1:TForm1;
<br>
<br>implementation
<br>
<br>{$R*.DFM}
<br>
<br>file://系統啟動定時器,啟動窗顯示完成后,縮小到SystemTray…
<br>procedureTForm1.Timer2Timer(Sender:TObject);
<br>begin
<br> timer2.Enabled:=false;
<br> sessions:=0;
<br> Application.OnException:=AppException;
<br> invalidRequests:=0;
<br> LookUpTimeOut:=60000;
<br> timer1.Enabled:=true;
<br> n11.Enabled:=false;
<br> n21.Enabled:=true;
<br> serversocket1.Port:=988;
<br> serversocket1.Active:=true;
<br> form1.hide;{隱藏界面,縮小到SystemTray上}
<br>end;
<br>
<br>file://開啟服務菜單項…
<br>procedureTForm1.N11Click(Sender:TObject);
<br>begin
<br> serversocket1.Active:=true;
<br>end;
<br>
<br>
<br>file://停止服務菜單項…
<br>procedureTForm1.N21Click(Sender:TObject);
<br>begin
<br> serversocket1.Active:=false;
<br> N11.Enabled:=True;
<br> N21.Enabled:=False;
<br> Service_Enabled:=false;
<br>end;
<br>
<br>
<br>file://主窗口建立…
<br>procedureTForm1.FormCreate(Sender:TObject);
<br>begin
<br> Service_Enabled:=false;
<br> timer2.Enabled:=true;
<br>end;
<br>
<br>file://窗口關閉時…
<br>procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);
<br>begin
<br> timer1.Enabled:=false;
<br> ifService_Enabledthen
<br> serversocket1.Active:=false;
<br>end;
<br>
<br>file://退出程序按鈕…
<br>procedureTForm1.N01Click(Sender:TObject);
<br>begin
<br> form1.Close;
<br>end;
<br>
<br>file://開啟代理服務后…
<br>procedureTForm1.ServerSocket1Listen(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>begin
<br> Service_Enabled:=true;
<br> N11.Enabled:=false;
<br> N21.Enabled:=true;
<br>end;
<br>
<br>file://被代理端連接到代理服務器后,建立一個會話,并與套接字綁定…
<br>procedureTForm1.ServerSocket1ClientConnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>var
<br>i,j:integer;
<br>begin
<br> j:=-1;
<br> fori:=1tosessionsdo
<br> ifnotsession[i-1].Usedandnotsession[i-1].CSocket.activethen
<br> begin
<br> j:=i-1;
<br> session[j].Used:=true;
<br> break;
<br> end
<br> else
<br> ifnotsession[i-1].Usedandsession[i-1].CSocket.activethen
<br> session[i-1].CSocket.active:=false;
<br> ifj=-1then
<br> begin
<br> j:=sessions;
<br> inc(sessions);
<br> setlength(session,sessions);
<br> session[j].Used:=true;
<br> session[j].CSocket:=TClientSocket.Create(nil);
<br> session[j].CSocket.OnConnect:=ClientSocket1Connect;
<br> session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;
<br> session[j].CSocket.OnError:=ClientSocket1Error;
<br> session[j].CSocket.OnRead:=ClientSocket1Read;
<br> session[j].CSocket.OnWrite:=ClientSocket1Write;
<br> session[j].Lookingup:=false;
<br> end;
<br> session[j].SS_Handle:=socket.socketHandle;
<br> session[j].Request:=false;
<br> session[j].client_connected:=true;
<br> session[j].remote_connected:=false;
<br> edit1.text:=inttostr(sessions);
<br>end;
<br>
<br>file://被代理端斷開時…
<br>procedureTForm1.ServerSocket1ClientDisconnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>var
<br>i,j,k:integer;
<br>begin
<br> fori:=1tosessionsdo
<br> if(session[i-1].SS_Handle=socket.SocketHandle)andsession[i-1].Usedthen
<br> begin
<br> session[i-1].client_connected:=false;
<br> ifsession[i-1].remote_connectedthen
<br> session[i-1].CSocket.active:=false
<br> else
<br> session[i-1].Used:=false;
<br> break;
<br> end;
<br> j:=sessions;
<br> k:=0;
<br> fori:=1tojdo
<br> begin
<br> ifsession[j-i].Usedthen
<br> break;
<br> inc(k);
<br> end;
<br> ifk%26gt;0then
<br> begin
<br> sessions:=sessions-k;
<br> setlength(session,sessions);
<br> end;
<br> edit1.text:=inttostr(sessions);
<br>end;
<br>
<br>file://通信錯誤出現時…
<br>procedureTForm1.ServerSocket1ClientError(Sender:TObject;
<br> Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;
<br> varErrorCode:Integer);
<br>var
<br>i,j,k:integer;
<br>begin
<br> fori:=1tosessionsdo
<br> if(session[i-1].SS_Handle=socket.SocketHandle)andsession[i-1].Usedthen
<br> begin
<br> session[i-1].client_connected:=false;
<br> ifsession[i-1].remote_connectedthen
<br> session[i-1].CSocket.active:=false
<br> else
<br> session[i-1].Used:=false;
<br> break;
<br> end;
<br> j:=sessions;
<br> k:=0;
<br> fori:=1tojdo
<br> begin
<br> ifsession[j-i].Usedthen
<br> break;
<br> inc(k);
<br> end;
<br> ifk%26gt;0then
<br> begin
<br> sessions:=sessions-k;
<br> setlength(session,sessions);
<br> end;
<br> edit1.text:=inttostr(sessions);
<br> errorcode:=0;
<br>end;
<br>
<br>file://被代理端發送來頁面請求時…
<br>procedureTForm1.ServerSocket1ClientRead(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>var
<br>tmp,line,host:string;
<br>i,j,port:integer;
<br>begin
<br> fori:=1tosessionsdo
<br> ifsession[i-1].Usedand(session[i-1].SS_Handle=socket.sockethandle)then
<br> begin
<br> session[i-1].request_str:=socket.ReceiveText;
<br> tmp:=session[i-1].request_str;
<br> memo1.lines.add(tmp);
<br> j:=pos(char(13)+char(10),tmp);
<br> whilej%26gt;0do
<br> begin
<br> line:=copy(tmp,1,j-1);
<br> delete(tmp,1,j+1);
<br> j:=pos('Host',line);
<br> ifj%26gt;0then
<br> begin
<br> delete(line,1,j+5);
<br> j:=pos(':',line);
<br> ifj%26gt;0then
<br> begin
<br> host:=copy(line,1,j-1);
<br> delete(line,1,j);
<br> try
<br> port:=strtoint(line);
<br> except
<br> port:=80;
<br> end;
<br> end
<br> else
<br> begin
<br> host:=trim(line);
<br> port:=80;
<br> end;
<br> ifnotsession[i-1].remote_connectedthen
<br> begin
<br> session[i-1].Request:=true;
]]>
關于拉幕程序的討論和源碼http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2572&Page=1wangxinxin2010-12-14 11:20:34  修改后可以使用的程序源代碼(還是不完善:還不能實現從一側飛入的效果,輕易出錯):
  unitUnit1;
  
  interface
  
  uses
  Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
  StdCtrls,ExtCtrls,ComCtrls,ColorGrd,RxCombos;
  
  type
  TForm1=class(TForm)
  Button1:TButton;
  Edit1:TEdit;
  OpenDialog1:TOpenDialog;
  Button2:TButton;
  Button3:TButton;
  TrackBar1:TTrackBar;
  Panel1:TPanel;
  Panel2:TPanel;
  Panel3:TPanel;
  Label1:TLabel;
  Label2:TLabel;
  Timer1:TTimer;
  Button4:TButton;
  ColorDialog1:TColorDialog;
  FontDialog1:TFontDialog;
  Button6:TButton;
  Button7:TButton;
  ComboBox1:TComboBox;
  Panel4:TPanel;
  Edit2:TEdit;
  Edit3:TEdit;
  Label3:TLabel;
  Label4:TLabel;
  Label5:TLabel;
  Label6:TLabel;
  Edit4:TEdit;
  Edit5:TEdit;
  Button8:TButton;
  Button5:TButton;
  procedureButton1Click(Sender:TObject);
  procedureFormCreate(Sender:TObject);
  procedureTimer1Timer(Sender:TObject);
  procedureButton2Click(Sender:TObject);
  procedureButton3Click(Sender:TObject);
  procedureTrackBar1Change(Sender:TObject);
  procedureFormDestroy(Sender:TObject);
  procedureButton4Click(Sender:TObject);
  procedureButton7Click(Sender:TObject);
  procedureButton6Click(Sender:TObject);
  procedureButton8Click(Sender:TObject);
  procedureButton5Click(Sender:TObject);
  private
  procedurezShowText;
  ProcedurezBmpCreate;
  procedurezSetBmp;
  procedurezSetLineHeight;
  procedurezShowLine(sender:TObject);
  {Privatedeclarations}
  public
  {Publicdeclarations}
  end;
  
  var
  Form1:TForm1;
  
  implementation
  
  {$R*.DFM}
  const
  bWidth=200;
  var
  currline,LineHeight:integer;
  sItem:TStringList;
  bmp:TBitMap;
  bRect,R1:TRect;
  iDc:HDC;
  
  procedureTForm1.Button1Click(Sender:TObject);
  begin
  OpenDialog1.Execute;
  Edit1.Text:=OpenDialog1.FileName;
  end;
  
  procedureTForm1.FormCreate(Sender:TObject);
  begin
  Form1.WindowState:=wsMaximized;
  Panel1.Top:=80;
  Panel1.Left:=96;
  Panel1.Height:=385;
  Panel1.Width:=433;
  Timer1.Enabled:=False;
  Label2.Caption:='100';
  iDC:=GetDc(Panel1.handle);
  Currline:=0;
  end;
  
  procedureTForm1.zShowLine(sender:TObject);
  begin
  zShowText;
  end;
  
  procedureTForm1.Timer1Timer(Sender:TObject);
  begin
  zShowLine(self);//顯示字符串
  //bitblt轉移矩形圖(目標句柄,LSx,y,寬,高,源句柄,LSx,y,光柵運算符)
  BitBlt(iDc,0,0,Panel1.Width,Panel1.Height,
  Bmp.Canvas.Handle,0,Currline,srcCopy);
  Inc(Currline,1);
  ifCurrline>=bRect.Bottom-panel1.Height 100then//循環條件?
  begin
  Timer1.Enabled:=False;
  Currline:=0;
  end;
  end;
  
  
  procedureTForm1.zShowText;
  var
  i:integer;
  ss:string;
  ReadFile:TextFile;
  begin
  AssignFile(ReadFile,Edit1.Text);
  Reset(ReadFile);
  i:=1;
  sItem:=TStringList.Create;
  withsItemdo
  whilenoteof(ReadFile)do
  begin
  Readln(ReadFile,ss);
  add(ss);
  i:=i 1;
  end;
  CloseFile(ReadFile);
  zBmpCreate;
  sItem.Free;//釋放串
  end;
  
  procedureTForm1.zBmpCreate;//創建圖片
  var
  i,y:integer;//y
  begin
  ifbmp<>nilthenbmp.free;
  bmp:=TBitMap.Create;
  zSetBmp;
  R1.Right:=bRect.Right;
  R1.Bottom:=bRect.Bottom;
  y:=Panel1.Height-100;
  fori:=0tosItem.Count-1do//從0到行數循環顯示圖片
  begin
  R1.Top:=y;
  R1.Bottom:=R1.Top LineHeight;
  ifCombobox1.Text='中間對齊'then//顯示圖片
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_CenterorDt_Top)
  else
  ifCombobox1.Text='左對齊'then
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_LeftorDt_Top)
  else
  ifCombobox1.Text='右對齊'then
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_RightorDt_Top)
  else
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_CenterorDt_Top);
  Inc(y,LineHeight);
  end;
  end;
  
  
  
  
  
  procedureTForm1.zSetBmp;
  begin
  zSetLineHeight;
  withbRectdo//Rect矩形坐標(左上x,左下y,右上x,右下y)
  begin
  Top:=0;
  Left:=0;
  Right:=Panel1.Width;
  Bottom:=LineHeight*sItem.Count Height;//行高*行數 form高度
  end;
  withBmpdo
  begin
  Height:=bRect.Bottom 100;//圖片高度
  Width:=bRect.Right;
  withCanvasdo//canvas畫布
  begin
  Font:=FontDialog1.Font;
  //Font:=self.Font;//form所設置的字體
  Brush.Color:=ColorDialog1.Color;
  FillRect(bRect);
  Brush.Style:=bsClear;
  end;
  end;
  end;
  
  
  
  
  
  procedureTForm1.zSetLineHeight;
  {設置行間隔}
  var
  Metrics:TTextMetric;//設置字體API
  begin
  GetTextMetrics(iDc,Metrics);
  LineHeight:=Metrics.tmHeight Metrics.tmInternalLeading-Bmp.Canvas.Font.Height;
  end;
  
  
  
  procedureTForm1.Button2Click(Sender:TObject);
  begin
  ifEdit1.Text='thenShowMessage('請輸入文件地址')
  else
  begin
  ifButton2.Caption='開始'thenButton2.Caption:='暫停'
  elseButton2.Caption:='開始';
  Timer1.Enabled:=notTimer1.Enabled;
  end;
  end;
  
  procedureTForm1.Button3Click(Sender:TObject);
  begin
  timer1.Enabled:=false;
  Currline:=0;
  Button2.Click;
  Button2.Caption:='暫停';
  end;
  
  procedureTForm1.TrackBar1Change(Sender:TObject);
  begin
  Timer1.Interval:=TrackBar1.Position*5;
  Label2.Caption:=inttostr(Timer1.Interval);
  end;
  
  procedureTForm1.FormDestroy(Sender:TObject);
  begin
  ifBmp<>nilthenBmp.Free;
  end;
  
  procedureTForm1.Button4Click(Sender:TObject);
  begin
  close;
  end;
  
  
  procedureTForm1.Button7Click(Sender:TObject);
  begin
  FontDialog1.Execute;
  end;
  
  procedureTForm1.Button6Click(Sender:TObject);
  begin
  ColorDialog1.Execute;
  end;
  
  procedureTForm1.Button8Click(Sender:TObject);
  begin
  if((strtoint(Edit2.Text)>=600)or(strtoint(Edit3.text)>=500)or((strtoint(Edit5.Text)>=553)or(strtoint(Edit4.Text)>=630)))
  thenshowmessage('范圍超界')
  else
  begin
  Panel1.Top:=strtoint(Edit2.text);
  Panel1.Left:=strtoint(Edit3.text);
  Panel1.Width:=strtoint(Edit4.text);
  Panel1.Height:=strtoint(Edit5.text);
  end;
  
  end;
  
  
  
  procedureTForm1.Button5Click(Sender:TObject);
  begin
  Panel1.Top:=0;
  Panel1.Left:=0;
  Panel1.Width:=Panel3.Width;
  Panel1.Height:=Panel3.Height;
  end;
  
  end.
  

]]>
關于拉幕程序的討論和源碼http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2571&Page=1wangxinxin2010-12-14 11:19:23begin
if Edit1.Text=' then ShowMessage('請輸入文件地址')
else
begin
if Button2.Caption='開始' then Button2.Caption:='暫停'
else Button2.Caption:='開始';
Timer1.Enabled:=not Timer1.Enabled;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
timer1.Enabled :=false;
Currline:=0;
Button2.Click;
Button2.Caption:='暫停';
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Timer1.Interval:=TrackBar1.Position*5;
Label2.Caption:=inttostr(Timer1.Interval);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Bmp<>nil then Bmp.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;


procedure TForm1.Button7Click(Sender: TObject);
begin
FontDialog1.Execute;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
ColorDialog1.Execute;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
if ((strtoint(Edit2.Text)>=600) or (strtoint(Edit3.text)>=500) or ((strtoint(Edit5.Text)>=553) or (strtoint(Edit4.Text)>=630)))
then showmessage('范圍超界')
else
begin
Panel1.Top:=strtoint(Edit2.text);
Panel1.Left:=strtoint(Edit3.text);
Panel1.Width:=strtoint(Edit4.text);
Panel1.Height:=strtoint(Edit5.text);
end;

end;



procedure TForm1.Button5Click(Sender: TObject);
begin
Panel1.Top:=0;
Panel1.Left:=0;
Panel1.Width:=Panel3.Width;
Panel1.Height:=Panel3.Height;
end;

end.
]]>
幾個delphi書中沒提過的數據庫問題與我的疑惑和心得(一起討論)http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2570&Page=1wangxinxin2010-12-14 11:16:271,ADOConnection和ADOTable在delphi中的使用

ADOConnection和ADOTable在delphi中像許多書中教的那樣設置好連接上數據庫(我用的SQLServer),運行沒有問題。然后我修改,目的是可以修改連接數據庫而不用在delphi中修改ADOConnection的ConnectionString屬性,還不出現連接對話框。

修改步驟:將LoginPrompt設置為false,將ConnectionString屬性清空,添加連接代碼

conStr:='Provider=SQLOLEDB.1;Password=1982072019;User ID=sa;Initial Catalog=StorageManagement;Data Source=10.16.99.175';
  try
    loginForm.tempADOConnection.ConnectionString :=conStr;
    loginForm.tempADOConnection.Connected := true;
  except
    messagedlg('數據庫連接有誤!!請檢查DataConfig.XML',mtConfirmation,[mbOk],0);
    Application.Terminate;
  end;

這樣程序運行起來,連接數據庫是沒有問題的。但出現的問題是在dlephi中ADOTable控件是不能連接表的,因為ConnectionString屬性沒有值。報錯為“無效的授權說明”。如何既能在delphi中使用ADOConnection和ADOTable控件,又可以不出現那個討厭的連接對話框。

2,在delphi中使用sql語句。

因為sql語句中給字符串賦值需要用雙引號,而delphi中用單引號括起字符串,我使用遇到了一些問題。我試驗的結果是delphi中用兩個單引號代替sql語句中的雙引號。不知道對不對?

具體如何使用,我還是不太清楚。

3,在delphi 7.0中使用ADOQuery的返回結果,書中介紹使用Params['xxxx'].AsString;

我使用后報錯,但有一個光盤的程序這樣使用沒有報錯。我使用的是Parameters['xxxx'],也使用不了.AsString

4,原代碼:
====================================================================
if canInsert then
  begin
    with allDataModule.AQ_OtherMaterielOut do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='insert otherMaterielOut(materielID,amount) values (:insertID,:insertAmount,)';
      Parameters[0].Value:=myMateriel;
      Parameters[1].Value:=myAmount; 
      ExecSQL;
    end;
    with allDataModule.AQ_OtherMaterielStock do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='update otherMaterielStock set amount=amount-:updateAmount where materielID=:updateID';
      Parameters[0].Value:=myAmount;
      Parameters[1].Value:=myMateriel;
      ExecSQL;
    end;
    materielOutForm.Close;
  end;

在這段代碼之后
with allDataModule.AQ_OtherMaterielOut do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='update otherMaterielStock set amount=amount-:updateAmount where materielID=:updateID';
      Parameters[0].Value:=myAmount;
      Parameters[1].Value:=myMateriel;
      ExecSQL;
    end;

不能使用allDataModule自動顯示可以使用的控件列表功能,但我強加上后面的代碼仍然可以使用。怎么回事?


]]>
Delphi程序員將何去何從http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2569&Page=1wangxinxin2010-12-14 11:15:03首先我認為,應該把Delphi程序員分為三代:
第一代:1995-1997年初次使用Delphi進行開發的人,使用版本為1.0-2.0,那個時候的主流開發工具是VC、VB、VFP等,尤其是VB,這個時候的Delphi程序員屬于啟蒙一代。曾經認識一個這樣的人,當時只有一本綠色的Delphi圖書,很簡單,所有的問題都考自己去研究幫助。

第二代:1998-2002年初次使用Delphi進行開發的人,使用版本為3.0-7.0,那個時候的主流開發工具是VC、VB、Delphi等,VFP已經逐漸被拋棄,初期Delphi贏得了VB殺手的美名。這個時代是Delphi最好的時代,是用戶數發展壯大的時代。這個時候的開發資料由少到多的一個時代,尤其是李維那三本書更是讓Delphi登峰造極。

第三代:2002年以后初次使用Delphi進行開發的人,使用版本為7.0-2005,8.0是Delphi的一個分水嶺,7.0是Win32模式的終極版本。從8.0開始,Delphi開始走向下坡路,尤其是2006年以來,初次使用Delphi的用戶越來越少。這個時候的主流開發工具已經變為.Net、Java。

這里順便提一下C++Builder,雖然C++Builder被Borland寄于厚望,但C++Builder很快被用戶所拋棄,也就是從2001-2004年流行了很短的時間,之后基本處于銷聲匿跡狀態。

第一代Delphi程序員現在還從事軟件技術方面的人估計已經寥若晨星,還從事軟件行業估計已經很不錯了,畢竟他們幾經是接近不惑之年了。

第二代現在估計都處于轉型的關口上,他們多數是三十而立的人,很多人可能不僅僅考慮是繼續使用Delphi的問題,而是考慮從事軟件行業是否有前途的問題。

第三代現在正處于風華正茂的年齡,是中國目前情況下從事軟件開發的黃金時期,只要你熟練開發工具,大把機會等著你。但是要注意黃金年領是有限的,25-29歲就這幾年時間,千萬不要荒廢,這直接決定了你以后的狀態。Delphi可以和你沒什么關系,但一定要走對,這短短5年的時間一晃眼就過去了,而且這5年是多數人結婚買房生子的年齡。


在此提醒初次踏上社會希望以軟件為自己職業的人
1、選擇開發語言很重要,這基本決定了以后你的從業狀態及收入。中國絕大多數軟件公司不會給你換學其它開發語言的機會,如果你選擇了一個,那么你再次跳槽的時候還是這個,下家同樣不會給你換的機會,因為他想要的是能來了就干活的人。
2、選擇開發語言很重要,這基本決定了你以后的職業方向。C/C++目前多數用于硬件相關類產品,Delphi、VB主要開發CS模式MIS類軟件,VC主要開發通用類軟件、Java主要用來開發BS模式軟件。相信搞通訊、消費電子類產品的公司沒有幾家選擇VB、Delphi,通用類軟件基本都是用VC開發同樣是這個道理,雖然其它開發工具一樣可以實現。
3、至于怎么選最好看自己的興趣。

目前的現實是:
1、使用Delphi的公司越來越少,使用Java的越來越多。此時此刻,以下列關鍵字搜索主要人才網站全國范圍一周內招聘數據:
                     Delphi         Java         VB         VC       C#         C++Builder     PowerBuilder
     cjol                 25           259         45         52       44                           1                           1
     51job               43           385         18         28       45                           1                           6

     jobcn               36           411         20         45     225                           1                           1
     以上三個網站雖然有一定的地域性,但是已經基本涵蓋了主要IT地區,而且有重復的職位或公司,但基本的東西已經反映出來了。
2、Delphi號稱VB殺手,但是似乎VB一點沒有受到影響,倒是Borland自己先把開發工具倒下了。


開發工具的優劣就不用討論了,這是一場口水戰,免戰!
Borland的市場方針及高高在上的價格是Delphi失勢的一個重要原因,但重要原因恐怕不僅僅是這個,你認為那個原因是最重要的原因?


繼續討論吧...... ]]>
Delphi中的Access技巧集http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2568&Page=1wangxinxin2010-12-14 11:02:52 
1.DELPHI中操作Access數據庫(建立.mdb文件,壓縮數據庫) IT我最牛-程序員的技術討論與分享園地Hff B&rj3u:Z
以下代碼在WIN2K,D6,MDAC2.6下測試通過, IT我最牛-程序員的技術討論與分享園地X8C'V)z/Y*K0`O_
編譯好的程序在WIN98第二版無Access環境下運行成功.
G#i;k&yW1j0//在之前uses ComObj,ActiveX IT我最牛-程序員的技術討論與分享園地xA N/v8M5ax4_
//聲明連接字符串 IT我最牛-程序員的技術討論與分享園地 DVB2i~1G+T.V
Const IT我最牛-程序員的技術討論與分享園地0~FZRe*p~d []
SC IT我最牛-程序員的技術討論與分享園地z5C9Xz.seN+v
+'Jet OLEDB:Database Password=%s;';
$Uio'L{ O e)I0

//============================================================================= IT我最牛-程序員的技術討論與分享園地2y|CDr0GV
// Procedure: GetTempPathFileName IT我最牛-程序員的技術討論與分享園地 OPB |XCAQ
// Author : ysai
lV#H0|GW0// Date : 2003-01-27
Wii3m xq7Z~PW0// Arguments: (None) IT我最牛-程序員的技術討論與分享園地I @\?r.j'pt
// Result : string IT我最牛-程序員的技術討論與分享園地&~kr(}\i2MUh
//=============================================================================
f ? \8o:[7_C0function GetTempPathFileName():string;
:Bnr%[2m9v0//取得臨時文件名 IT我最牛-程序員的技術討論與分享園地nU4w~S3f"\9G
var
6?[vh|&_%S0SPath,Sfile&:array [0..254] of char;
DEmTKw`(H;KS0begin
%])xJ,V%N+eYN7M:P0GetTempPath(254,SPath);
^"^/L?!T&YAm:V#t!mP0GetTempFileName(SPath,'~SM',0,SFile); IT我最牛-程序員的技術討論與分享園地!P\ b/AI"p D
result:=SFile;
:h/G"fY7z6k0DeleteFile(PChar(result));
G(WzO a1i [^z)b0end; www.iTbulo.com0sJZ0


G(WzO a1i [^z)b0end; www.iTbulo.com0sJZ0.n,M.yP B8U3g6~2f0

@+Y6Y |#^opfc\^N.b:f0//=============================================================================
,g7b,O%^C0// Procedure: CreateAccessFile
)Y2y RWO.c0// Author : ysai IT我最牛-程序員的技術討論與分享園地1ZRS6H;R!O
// Date : 2003-01-27
1lLR7?5Fdfm#E]0// Arguments: FileName:String;Password:string='' IT我最牛-程序員的技術討論與分享園地#l5V0y6d1]y[_PI
// Result : boolean IT我最牛-程序員的技術討論與分享園地%qW/e1Rg3b
//=============================================================================
m8CU3E8xa(_0pj0function CreateAccessFile(FileName:String;Password:string=''):boolean;
-b,mD4x9T MTa/R0//建立Access文件,如果文件存在則失敗
.\b)?!MIO0var
yy/ET x0STempFileName:string;
rPd:k@$l:g'k[1f'D0vCatalog:OleVariant; IT我最牛-程序員的技術討論與分享園地w _N#^RJ)u-f k
begin
LtD3y@"{ j&`*T q0STempFileName:=GetTempPathFileName;
X&P7vn%Yb%e J&t0try
pk`7O#txMPQ&C0vCatalog:=CreateOleObject('ADOX.Catalog'); IT我最牛-程序員的技術討論與分享園地)[)V$jo3m5Qa xL
vCatalog.Create(format(SConnectionString,[STempFileName,Password])); IT我最牛-程序員的技術討論與分享園地 O8A IXYZ.}$l0A~3v6b
result:=CopyFile(PChar(STempFileName),PChar(FileName),True); IT我最牛-程序員的技術討論與分享園地8D i V&B%H-wb{}3G@
DeleteFile(STempFileName); IT我最牛-程序員的技術討論與分享園地E8z%QM)x8O7O
except IT我最牛-程序員的技術討論與分享園地X"I^Kprjy E\
result:=false;
1F^W _ez0end;
S&N!]L+t^0end; www.iTbulo.com0sJZ0IT我最牛-程序員的技術討論與分享園地|qq z*a7pTkv h

0cP3^6HE9ct;Vg$S0//============================================================================= IT我最牛-程序員的技術討論與分享園地6Ed+]0pui
// Procedure: CompactDatabase IT我最牛-程序員的技術討論與分享園地/J SK3q;Hh
// Author : ysai IT我最牛-程序員的技術討論與分享園地7e$y BT6d:QA b5d
// Date : 2003-01-27
[ov7A+P0ss0// Arguments: AFileName,APassword:string
P1W'Xi|0// Result : boolean IT我最牛-程序員的技術討論與分享園地'J,~5M!}g\'D PQ
//=============================================================================
s#r4[ u+J1b~0@!e0function CompactDatabase(AFileName,APassword:string):boolean;
~1VsUD0//壓縮與修復數據庫,覆蓋源文件
uN5e ?X0var IT我最牛-程序員的技術討論與分享園地l9GF(\ ?:}AYf]
STempFileName:string; IT我最牛-程序員的技術討論與分享園地'U:y@ v/m"V,R m@
vJE:OleVariant; IT我最牛-程序員的技術討論與分享園地_Af6qQ0C
begin
7] \I/g)Z|[0STempFileName:=GetTempPathFileName; IT我最牛-程序員的技術討論與分享園地*m^)kf3O^
try
vB%T4p2Ak?a0vJE:=CreateOleObject('JRO.JetEngine');
Nt)v%J(E e*~ qT8q/?*]0vJE.CompactDatabase(format(SConnectionString,[AFileName,APassword]), IT我最牛-程序員的技術討論與分享園地 h"xf AUx
format(SConnectionString,[STempFileName,APassword])); IT我最牛-程序員的技術討論與分享園地 |Vi)V ^-t7RC)|
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
3[6j1T,gI0DeleteFile(STempFileName);
W0Jt9\h$a9V.z ID:^.{0except IT我最牛-程序員的技術討論與分享園地 LS+j+mFn~9Ca/b m
result:=false; IT我最牛-程序員的技術討論與分享園地!l\6iD(lv7}
end; IT我最牛-程序員的技術討論與分享園地"nRv"P m*KZ
end; www.iTbulo.com0sJZ0

o9mk*C.f*V5^(W1_/h0

\G(q|#w0u.Xu0    //=============================================================================
ycSQ yE0// Procedure: ChangeDatabasePassword IT我最牛-程序員的技術討論與分享園地C ^f` l&G9|4|
// Author : ysai
,d6t+M.g3J7k^0// Date : 2003-01-27
1DG]JF II0// Arguments: AFileName,AOldPassword,ANewPassWord:string
$ni%]h9O8o@!mu{0// Result : boolean
PJ9p6k:M0//============================================================================= IT我最牛-程序員的技術討論與分享園地P6Lz9i[cF/R3H7W
function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
;`yy U(a'DJ0//修改Access數據庫密碼
r]F(ay4l+k0var IT我最牛-程序員的技術討論與分享園地}%l#}.M)SA*A*v
STempFileName:string; IT我最牛-程序員的技術討論與分享園地Y^ |-S"ia
vJE:OleVariant; IT我最牛-程序員的技術討論與分享園地u&n? I,hb
begin
k7W(XYi9R0^Q_1s2@0STempFileName:=GetTempPathFileName;
3Mkm%e{7C`-A w&\0try
5zhs,|m3Z [V9N0v2Q0vJE:=CreateOleObject('JRO.JetEngine');
m&R+]/G/jf:z0gD0vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassword]), IT我最牛-程序員的技術討論與分享園地zN C/MUIDx!G
format(SConnectionString,[STempFileName,ANewPassword]));
w6R"Q&dE%q[f@Y0result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
-v H$@ T!Z;v0DeleteFile(STempFileName); IT我最牛-程序員的技術討論與分享園地![W y,Gpq
except
i$x%AU2u_w mC0result:=false; IT我最牛-程序員的技術討論與分享園地C5PXr6bJIB]
end;
!p(A,l6]z^ej1t0end; www.iTbulo.com0sJZ0IT我最牛-程序員的技術討論與分享園地bi{1dt3@q

IT我最牛-程序員的技術討論與分享園地!F j3a,D,mz3I8J/d9I3J$S

2.Access中使用SQL語句應注意的地方及幾點技巧 IT我最牛-程序員的技術討論與分享園地`!Bd F8k.Ow0_;e
以下SQL語句在Access XP的查詢中測試通過 IT我最牛-程序員的技術討論與分享園地XR6p#X Dw:Y!pvYr n
建表:
?UCXzP7?R0Create Table Tab1 ( IT我最牛-程序員的技術討論與分享園地sv6j3UQ#\0V
ID Counter, IT我最牛-程序員的技術討論與分享園地1c#@w)qxsj
Name string,
^wbV+WN^3a#P1l e0Age integer, IT我最牛-程序員的技術討論與分享園地m Vsqqoq
[Date] DateTime); IT我最牛-程序員的技術討論與分享園地7z4}1DaIp4^
技巧: IT我最牛-程序員的技術討論與分享園地lPQZJ9Zfv8@T
自增字段用 Counter 聲明.
M"YQ3zG,ccO O^0字段名為關鍵字的字段用方括號[]括起來,數字作為字段名也可行. www.iTbulo.com0sJZ0

Y{*OV` N0 IT我最牛-程序員的技術討論與分享園地1d6d+y6_*dr"l G

建立索引:
z'w/YZT3lG D4Z0下面的語句在Tab1的Date列上建立可重復索引
W6M"X&d"m&}h0Create Index iDate ON Tab1 ([Date]); IT我最牛-程序員的技術討論與分享園地E6r-r,A#^ u:{
完成后Access中字段Date索引屬性顯示為 - 有(有重復).
Ll)@y(d0下面的語句在Tab1的Name列上建立不可重復索引 IT我最牛-程序員的技術討論與分享園地1NK!t:b7g^t
Create Unique Index iName ON Tab1 (Name); IT我最牛-程序員的技術討論與分享園地z^0{7Ft4|ZqbPV
完成后Access中字段Name索引屬性顯示為 - 有(無重復).
!R@0UDo` Q}o e0下面的語句刪除剛才建立的兩個索引 IT我最牛-程序員的技術討論與分享園地5d!Sg [r
Drop Index iDate ON Tab1;
W QuVU,_[wQ0Drop Index iName ON Tab1; www.iTbulo.com0sJZ0

%{T'Htk-p9p(?.[0 IT我最牛-程序員的技術討論與分享園地)pK%{!v` |/QU$n

Access與SQLSERVER中的UPDATE語句對比: IT我最牛-程序員的技術討論與分享園地 oX `ZO'vt
SQLSERVER中更新多表的UPDATE語句:
W(X?/N @_(Do$@I0UPDATE Tab1 IT我最牛-程序員的技術討論與分享園地#VU"k9p\z$z
SET a.Name = b.Name
$X3jL1]8F H K0FROM Tab1 a,Tab2 b IT我最牛-程序員的技術討論與分享園地-roheo"rh#M};c
WHERE a.ID = b.ID;
d ?h9HEK0同樣功能的SQL語句在Access中應該是
$i.f9A*yz'e0 UPDATE Tab1 a,Tab2 b IT我最牛-程序員的技術討論與分享園地 \V d/~)z1X^'v
SET a.Name = b.Name
An{S-t#F9p |S3xL0WHERE a.ID = b.ID; IT我最牛-程序員的技術討論與分享園地k"g |,z9V)TCx p j(}
即:Access中的UPDATE語句沒有FROM子句,所有引用的表都列在UPDATE關鍵字后. IT我最牛-程序員的技術討論與分享園地n7G:hxQ9sv1N
上例中如果Tab2可以不是一個表,而是一個查詢,例:
,Gzs9cE V4?1[ f0UPDATE Tab1 a,(Select ID,Name From Tab2) b
D3\Jg3G[C0SET a.Name = b.Name IT我最牛-程序員的技術討論與分享園地;|;Li"rg)T d`
WHERE a.ID = b.ID;

a%m(r4Y#`0o&CK0www.iTbulo.com0sJZ0IT我最牛-程序員的技術討論與分享園地 }2|2J \I

IT我最牛-程序員的技術討論與分享園地'c1A9h bq2P!a$O

訪問多個不同的Access數據庫-在SQL中使用In子句: IT我最牛-程序員的技術討論與分享園地7it3Oq5g \X D
Select a.*,b.* From Tab1 a,Tab2 b In 'DB2.mdb' Where a.ID=b.ID;
)]tZ E!G)bYW;L%e C-c0上面的SQL語句查詢出當前數據庫中Tab1和DB2.mdb(當前文件夾中)中Tab2以ID為關聯的所有記錄. IT我最牛-程序員的技術討論與分享園地;]4CHA?V
缺點-外部數據庫不能帶密碼. IT我最牛-程序員的技術討論與分享園地K7m!YE['gQ^ YC,N
補充:看到ugvanxk在一貼中的答復,可以用 IT我最牛-程序員的技術討論與分享園地Y#_p?QY
Select * from [c:\aa\a.mdb;pwd=1111].table1; IT我最牛-程序員的技術討論與分享園地 i1t x8F xj5K7kOc

]]>
Delphi夢魘病毒跟進專帖http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2567&Page=1wangxinxin2010-12-14 10:59:16
金山云安全中心近日在國內率先截獲了一個針對計算機程序員、尤其是Delphi使用者的病毒“Delphi夢魘”(Win32.Induc.b.820224),簡單描述該毒行為,就是:它專門感染Delphi程序員的電腦,一旦成功,程序員今后寫出的任何程序,都將帶有該毒!目前已經發現若干知名應用程序所帶文件包含惡意代碼。關于找個病毒的詳情請參考 http://blog.duba.net/post/delphi-workers-nightmare_9013.php



專殺工具發布(2009-08-21第三次更新):

圖片點擊可在新窗口打開查看





目前已經發現的知名程序,歡迎各位同學添加更新

1 inno setup編譯環境的部分版本
   a、官方提供的安裝程序正在檢查中(已經確認正常 0821 by 一把銹劍)
   b、inno5.2.3增強版包含的ISCC.exe 和自帶的Inno setup程序解包程序
2 部分傳奇外掛,登錄器等

3 iSpeak部分版本(可能是修改版,官方下載沒有問題)

4 無憂登陸軟件(暫未找到那個是真官方,有個QQ無憂登錄的網站正常)

5 CS1.5等(網友反饋)

6 部分單機大型游戲安裝目錄下的info\setup.exe  (魔獸爭霸III,天使帝國3等其他網絡流行單機游戲,多為盜版游戲官方的沒有鑒定)

7 部分迅雷Ayu修改版本(網友反饋)

8 萬象2004部分版本(網友反饋,已經確認)

9 個人所得稅代扣代繳系統部分版本(網友反饋)

]]>
[原創]用DELPHI編的一個界面類似冰河的遠程控制程序http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2566&Page=1wangxinxin2010-12-14 10:56:20首先解釋一下,這個程序除了在界面模仿"冰河"外,程序本身和
"冰河"聯系并不大,程序還有很多的不足(如數據的傳輸沒有加密也
沒有壓縮。。。),只是基本上實現了一個反彈型的遠程控制程序的
功能。實現了一些諸如自己剛學這東東時感興趣的:服務端生成、自
動上線、遠程控制、截屏、攝像頭監控、文件傳輸、鍵盤記錄等功能。
程序在靠近木馬方面處理很少,主要是還不想(程序效率還跟不上,
沒必要用DLL或插入進程再或HOOK API來隱藏進程),這只是偶要
寫的一個教程的演示程序罷了。

請將QQWry.dat和binghe.exe放在同一目錄下!

一、配置服務端

首先配置服務端,只要在菜單“配置”里選擇“配置服務端”選項,然后填寫你的上線名稱(只支持英文或數字)和自動上線讀IP的“自動上線地址”,按生成即可以同目錄下生成Server.exe程序。

然后將這個生成的程序發給別人(當然你要自己運行也行,只是控制的就是自己了),下邊就等著服務端上線吧。

二、自動上線設置

這個其他同類的程序說得很多了,我也不想多少,不懂的朋友可以下其他程序的動畫演示來看,呵呵(愉懶了~~)。

程序里我都寫了例子,大家照著換成自己的就行了。

這里只說一點,這是FTP更新里的“存放IP的文件”中的“www”是你的FTP空間放網頁的目錄,有些FTP空間直接在根目錄里存放網頁,這樣你直接在這行填上“ip.htm”就行了,不過一般的FTP空間都在一個專門的目錄來存放網頁,你自己登錄FTP看一個,換成自己的相應目錄就行了!

三、控制功能

文件管理:可以瀏覽、上傳、下載、刪除、遠程遠行等(不見意上傳下載大文件)。

抓屏:手動抓屏。由于網速等原因,在互聯網有可能會很慢,在局域網就沒什么。

視頻臨控:可以自己探測攝像頭,服務端主機安裝有攝像頭的話,圖標會自動變成攝像頭圖標。

進程管理:在彈出的進程管理窗口點擊右鍵即可看見相應的操作。

窗口管理:同上。

鍵盤記錄:同上。

遠程卸載。

這只是一個演示程序,目前只實現上邊的這些功能。

]]>
最近關于delphi python java 和設計的一些想法http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2565&Page=1wangxinxin2010-12-14 10:50:19每個程序員就是藝術家,每個系統構架師都是哲學家

這段時間我一直在思考各種設計上面的問題,原來一直寫delphi和一些其他腳本語言。對java一直沒有碰,這段時間看的比較多,也寫了一些小的程序,過程不說,1個月下來感覺只有四個字:不堪重負 ToT,可能你們還記得前段時間我抱怨了一下java的類庫之間的復雜關系,讓我完全沒有任何的線索

隨即切換到python重新實現一些功能,也許是有了前面的經驗,寫的輕松了很多,雖然這段時間我連很多python的基本用法都沒學完,比如那個lambda函數,新奇呀~

用twisted寫了一個server,10多行代碼,java那邊用mina還沒有實現邏輯就已經4、5個java文件了,當然大部分代碼ide都幫忙寫了,不過java類庫之間的邏輯關系復雜程度可見一斑。

以我對這兩個語言的了解程度,還不足以對他們評頭論足,我發現他們在設計思路上有一些很有意思的地方,寫下來,大家看看。

delphi聞名是他的RAD套路,還有就是所謂的“優雅”,因為寫出來的代碼規范而且可讀性強,不過很遺憾,delphi的rad貌似也沒有太大的進展了,至于用“begin end”來保持的優雅,我持保留意見,呵呵。期待后續的版本能繼續發揚RAD,這次支持泛型和unicode就很不錯,要是再多些語法糖就好了,恩啊恩啊。delphi仍然是我windows平臺下開發的不二選擇。
python的設計思路很像delphi,走的是rad的套路,用python寫東西的時候,明顯感覺到是拋開了詳細設計的,就是一切都面向實現功能,他的語言設計是鼓勵你這么做的。python強調了函數和模塊,他的面向對象我到反而覺得有點半調子,不過無所謂,這些是意識形態上的東西,能解決問題就好。
而用java的時候,我還沒開始寫一行邏輯代碼,已經被迫實現了4、5個接口了,而且我在沒有寫完之前,還不能把他們整合起來,也不知道是對是錯。心里懸著,感覺不舒服。

很有意思的是,python的思路很接近我最初寫程序的時候,什么都不知道,只要把東西做出來就好的那種思路,所謂初級程序員的做法。不過這個不是全部,python的開發過程非常強調自省,也就是重構,說白了就是重新寫。而且目前的開發中更加注重的是在各種測試的情況下進行重構,也就是是有保障的重構,而非程序員一時性起,寫了也不知道對不對。我個人覺得這個是符合邏輯的,在沒有了解一個東西的時候做再多的設計都是空的,我原來也嘗試過,也看到過開發中到最后,完全和最初的設計沒有關系。失去控制,全靠程序員自己努力,更要命的是,牛B的SA還不愿意承認……

python可以做到這一點,是因為python代碼很精簡,程序員寫作的時間很短,就算是重構這個時間消耗也比其他語言低很多,我覺得這是python做的最好的地方,他給這種“初級程序員”的開發模式提供了一個升級的可能

這段時間也很關心各種語言的效率,不可否認,java的jvm虛擬機是一個很厲害的東西,java的執行效率在高端機器上和C在一個水平,一個可以自動管理內存的語言做到這個地步,實在讓人驚嘆。同時java的開發效率比C又高了不知道多少倍。所以在服務器端java可以說當之無愧的王者。

這次準備放棄java轉而用python的主要原因其實是考慮到開發效率和rad的需求。前段時間考慮的方案是用java寫框架和效率要求嚴格的地方,然后用jython實現邏輯和效率要求不高的地方,不過這個想法首先被jython的超級低效率擺了一道,這個低效非常明顯而且不是幾十倍的問題,
然后自己感覺java的各種代碼之間各種交互很多,設計上找不到rad的感覺,我也會設計很多接口,封裝,然后工廠,不知道是不是被引誘了呵呵。
然后就是這次做的東西有探索的性質在里面,所以我自己是沒有太多經驗的,整個開發過程我預算了1次完全的重構和數次的迭代的重構。

現在我基本上決定用python寫原型,先跑,然后如果效率上出了問題,profile一下,找問題的地方,用psyco編一下,如果還不行,就直接寫C的擴展或者用jtype在java里面做好,python里面調用。個人感覺python比較合適我的思路,也許是因為我不是一個合格的SA,我只是一個程序員圖片點擊可在新窗口打開查看
多process的情況我也推翻了我原來的設計,盡量減少process之間的狀態共享,把程序都往單進程順序執行上堆,直到我決定寫erlang的哪一天,呵呵

對于general purpose的框架來說,開發者一定是對這個領域很有經驗的,所以可以抽象出一套比較好的邏輯框架,然后實現成各種接口,工廠,封裝,分層來保證靈活性,這個在python的twisted庫里面也是一樣的,虧他們居然用python半調子的面向對象搞整了這么多東西出來。不過還好他們暴露出來的接口并不復雜,也就是一些回調和事件
不過在面臨專業領域的問題的時候,這種一來就高層建模的方式或許就有點行不通了,因為沒有人敢站起來拍胸膛說,這個項目所有需求我都了解了。而且大部分需求都在根據時間變化。所以導致開始建模的那些封裝到后面可能會變成完全不適用或者需要大量適配才能使用的東西


另外這段時間突然感覺各種語言蜂擁而起,而起很多都有自己的明確的主題,
比如erlang對并發的處理簡直就是一絕,
scala在jvm上的表現,整合的非常好,
還有我最喜歡的跨平臺pascal:lazarus今天也剛剛出了0.9.26版本完美支持mac平臺的新界面框架(好像叫carbon把),跨平臺的native程序開發估計也只有他能做了,
ruby新版的效率居然比python2.6還要高,好吧我承認,我沒有選ruby和jruby是因為不太喜歡他的語法- -,感覺啰嗦
groove是瞄準ruby去的,不過現在還差一截

最近看到有句話很喜歡:程序設計有兩種思路,一種是設計的很簡單以至于明顯沒有缺陷,一種是設計的很復雜以至于沒有明顯的缺陷 圖片點擊可在新窗口打開查看

以上是這段時間的一些感受,水平很有限,拉拉雜雜一堆,行家眼里看來肯定是漏洞百出,說出來讓大家笑話了。歡迎拍磚
]]>
在DELPHI程序中支持VBScript/JavaScript討論專區http://www.rfoamep.cn/bbs/dispbbs.asp?BoardID=76&ID=2564&Page=1wangxinxin2010-12-14 10:48:24to 菜鳥:關于如何實現的問題請見id=54803,
to 大蝦:本主題的目的是讓我們徹底弄清楚TScriptControl的用法
在DELPHI程序中支持VBScript/JavaScript討論專區相關解決方法:1、
現在,我們只有眼巴巴的看著WPS強大的功能、看著國產軟件各自為政,我好心痛,
我要振臂高呼:
讓我們的程序都支持宏功能吧,
讓我們的程序控制別人的程序
  也讓別人的程序控制我們的程序吧!
希望我們都能在各自領域盡情發揮自己的聰明才智。
2、
關注!
3、
關注!
4、
以下討論:
Sc:= Tscriptcontrol.Create(Nil)
第一個問題:
  實現 Sc.Run(Const ProcedureName : WideString; var Parameters : pSafeArray)
5、
怎么沒有反應啊,
難道各位都解決了這個問題了嗎?
6、
大家不要擔心分的問題,我會一直加的.
7、
我有個例子,不知你想要嗎?
8、
to Lixiaolei:
  當然想要啦,email給我就行了。
9、
快加分哦。不然沒人給你例子哦
10、
分絕對沒有問題(我現在的參與分太少,不能加到200,只有漫漫等了),希望大家相信我。
11、
在DELPHI程序中支持VBScript/JavaScript討論專區推薦解答:

]]>
主站蜘蛛池模板: 色妞av永久一区二区国产av | 亚洲最大在线视频 | 亚洲成人精品视频 | 亚洲成年 | 精品成人在线视频 | 尤物视频网站在线观看 | 大伊香蕉在线精品不卡视频 | 成人福利网站 | 曰本毛片| 国产乱子影视频上线免费观看 | 天天久久 | 欧美一级毛片兔费播放 | 四虎影在永久在线观看 | 国产三级在线观看视频不卡 | 国产精品午夜福利麻豆 | 四虎影院在线观看免费 | 亚洲成人福利视频 | 99久久精品费精品国产一区二 | 亚洲精品日韩专区在线观看 | 91夜夜人人揉人人捏人人添 | 日韩精品无码区免费专区 | 日本三级和搜子同屋的日子2电影 | 77777亚洲午夜久久多喷 | 天天艹天天| 中文字幕日韩人妻在线视频 | 国产成人无码a区在线观看视频 | 国内精品久久久久激情影院 | 免费激情小视频 | 国产小视频在线免费观看 | 国产日韩一区二区三区在线播放 | 成人毛片全部免费观看 | 91嫩草视频在线观看 | 操丝袜美女视频 | 亚洲国产av高清无码 | 青青视频国产在线播放 | 欧美国产成人精品一区二区三区 | 久久99久久成人免费播放 | 一级做a爰性色毛片免费 | 成年人免费在线视频网站 | 色中色综合 | 久久夜色精品国产噜噜 |