2014-02-17 47 views
0

我有一些關於C++的初學者問題。 我已經下載了Windows SDK,並根據文檔,所有藍牙流量使用winsock。如果我想編程藍牙接口,Windows SDK包含頭文件(.h)。反向頭文件/鏈接

a)這是一個普通的C++問題:頭文件winsock.h如何鏈接到特定的dll?我沒有指定任何鏈接。如何檢測與此標頭鏈接的所有.dll文件? 是不是頭文件假設只包含函數的名稱和dll中的實際實現?我有點困惑。

我的第二個目標是用修改後的版本替換windows winsock函數。我想保留原有的功能,除非由其他應用程序設置的某個標誌設置爲true。在這種情況下,我想修改一些功能。 我的方法是創建一個新的DLL,它將具有相同的函數名稱,如頭文件winsock.h中所示。

b)假設在原始的winsock中存在函數fff。我將用一個新函數替換它,除非該標誌爲真,否則調用相同的函數fff,但在未修改的dll中,也就是說,我希望在這種情況下從未修改的dll「包含」原始函數和「過載」我修改過的fff函數,具有原始的fff函數。這兩個函數具有相同的參數和相同的名稱。我怎麼樣?有更好的方法來實現相同的目標嗎?

c)允許應用程序設置的標誌在dll中可訪問的最佳方式(或簡單方法)是什麼?

d)Winsocket是一個非常重要的組件。如果我爲其中的每個函數添加一個命令,我是否應該預期性能會大幅下降?

謝謝!

回答

0

a)頭文件簡單地定義了要在別處找到的東西(類型,函數,類) - 它沒有指定位置。當您鏈接程序時,您將包含(除其他外)連接的.lib文件包含到正確的DLL中。當程序運行時,lib代碼會將DLL加載到內存中並連接到它。

b)生成第二個DLL,其中包含與winsock中所有相同的函數,但在函數名稱的開頭添加了(比如說)ELI_。然後在ELI_函數內查看標誌,如果沒有設置,調用基本的winsock函數,否則做任何你想到的特殊事情。

c)使該標誌變量您ELI_ DLL的代碼中的全局靜態變量,然後添加額外的功能,以設置標誌(和回讀其狀態,可能)

d)我不知道,但一個人如果不花很多時間。我會更擔心你的特殊代碼的作用。

+0

不同意a)。在MS(和兼容)編譯器中,有一些用於定義使用哪個庫的編譯指示。例如。 '#pragma comment(lib,「foo.lib」)'可以被添加到頭文件中。 –

+0

@Mats我明白你的觀點 - 編譯指示允許.h指定庫文件 - 但是我覺得它並沒有改變我試圖對什麼頭文件和.lib文件(通常)做的基本點。 –

+0

是的,我明白你在說什麼,通常它適用。但是,特別是MS有向這些頭文件添加這些編譯指示的傾向。對於某些人來說,這可能會讓人感到困惑,因爲「它自動地起作用」,然後在另一個平臺上,「你需要做一些事情來使圖書館工作」> –