2013-07-09 67 views
0

假設我生成一個新的標準API。這個API由一堆C頭文件組成,但沒有實現。特定供應商負責實現我的接口,以便應用程序開發人員可以與他們的產品進行交互開始使用接口的原因很簡單:應用程序開發人員應該能夠毫無困難地與不同產品進行交互,因爲所有產品都實現了我的接口。動態鏈接和加載時間鏈接.DLL

好的。現在到困難的東西。如何實現我的API的供應商實現C代碼?我對這個問題的假設是,供應商只需將我的頭文件包含在他們的項目中,並創建一個「導出」其實現功能的.DLL。更重要的是,如果應用程序開發人員想要與我的API交互(但希望它與任何供應商的任何實現一起使用)編寫代碼以利用此優勢?

我讀this SO post有關動態與負載時鏈接。如果知道要鏈接到的.dll的名稱,並且知道要在該.dll中調用的函數,似乎加載時鏈接很有用。但是,在我的場景中,應用程序開發人員是否必須動態鏈接到實現API API函數的.dll?這個應用程序開發人員將如何知道.dll的名稱是從我的API實現函數的?

我希望我的困惑是有道理的。我來自一個學習如何用C語言編程的背景,但我們對這個東西沒有太多的瞭解。從我的回憶中,我們編寫了一堆頭文件和C文件,然後我們編譯它並將它鏈接起來,並生成一個包含該可執行文件中所有代碼的可執行文件。請幫助澄清我的誤解。

回答

3

此應用程序開發人員將如何知道.dll的名稱是從我的API實現的功能?

最簡單的辦法是選擇一個固定的名稱(例如MyInterface.dll),需要你的接口的所有執行者來命名他們的這個名字DLL。然後,該程序可以嘗試加載一個具有該名稱的DLL。

如果你想要更多的靈活性,那麼應用程序需要更復雜。例如,您可以在配置文件中指定DLL名稱。然後,應用程序將讀取您的配置文件,獲取DLL的名稱,使用LoadLibrary()加載它,然後使用GetProcAddress()加載任何所需功能。

如果您希望能夠在同一時間來加載同一個接口的多個實現,那麼很明顯,他們必須有獨立的文件名。這通常由加載DLL插件的程序完成。這樣做的通常方法是枚舉給定目錄中與給定文件名模式匹配的所有DLL,例如,與FindFirstFile()/FindNextFile()。對於找到的每個DLL,再次調用LoadLibrary()GetProcAddress()來訪問每個中的函數。

2

如您所說,您可以定義API並將其作爲一個或多個頭文件分發。

您的主機應用程序必須支持某種形式的插件文件,它可以是一個純文本文件,XML,JSON什麼的,用戶可以添加第三方的dll的名字。

第三方包括您的標題,執行和導出所需的功能。

您的應用程序使用LoadLibrary動態加載插件文件中列出的每個第三方dll,並執行GetProcAddress調用來發現入口點。

您可能會考慮編寫一個引用插件dll,並將它發佈給第三方使用源代碼,以便他們可以將其用作樣板,以實現有希望的工作。