熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi中包的妙用

2013-11-23 17:29:18  來源: Delphi編程 

  自動化測試框架的基礎是鉤子也就是常說的HOOK機制但這在實際的應用過程中可能會遇到一些問題

  一旦要做鉤子那麼就必須獲取函數地址由於我原先設計的鉤子的目標函數都是Delphi的內部函數也就是說這些函數在編譯之後很難找到

  當然了也是有幾種方式可以找到的

  將代碼植入到系統中編譯的時候可以直接找到

  編譯的時候帶上Map文件可以通過Map找到函數地址測試框架以Dll的方式遠程注入

  Delphi中的包可以公布這些函數的地址

  前兩種方式有一個最大的缺點在於必須為自動化測試特別編譯一個版本雖然說可以接受但顯然不是最好的方案第三種方案雖然好但是前提是系統必須構建在帶包編譯的基礎上

  幸好我們目前的測試的系統就具備這樣的條件

  那麼對於自動化測試框架來說只需要隨意作為一個Dll並注入到原系統中就可以了如果原系統提供了注入的擴展那是最好因為這樣調試起來很方便否則就做成遠程注入不過調試的時候只能Attach了很麻煩

  這個時候只需要將包含自動化測試框架代碼的測試用例代碼對VCL的包帶包編譯就可以做到對包中函數的HOOK了不過這裡面還是有一些細節需要注意的原先我用的是FastCode的HOOK代碼但是在代表編譯的時候就失效了經過追查發現代表編譯和非帶包編譯的代碼不一樣由於VCL的代碼編譯到了包中那麼本Dll在調用包中的方法的時候加上了跳轉指令簡單的就是一個call操作在包裝載的時候call後的地址會更新

  經過一些探索發現中國的cnPack()中早就針對這個問題有了解決方案其實方法也很簡單就是判斷一下是否存在地址跳轉如果有的話就取跳轉後的地址否則取當前地址

  完成了鉤子後我們就會發現在我的測試用例的Dll中對Bpl中的方法進行了HOOK請注意這裡面有一個選擇就是在Dll內部HOOK還是在Bpl內部HOOK在Dll內部HOOK只需要修改跳轉地址即可鉤子的方法很簡單在Bpl中HOOK則需要修改函數代碼的前個字節這種方法復雜但是使得入口單一一處修改全面有效

  自動化測試框架就是選用的後者的HOOK方法這樣我們在Dll中對Bpl中的方法進行了HOOK所有帶著此包編譯的DLL或者EXE都會受到影響而這也正是我們想要的

  解決了這個問題後我們就可以針對已有的系統安裝程序進行測試而不需要修改任何開發代碼(包括版本構造過程)滿足這個特性非常好!


From:http://tw.wingwit.com/Article/program/Delphi/201311/24672.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.