2012-09-19 92 views
2

我已經開發了一個程序,我試圖讓這個程序與其他公司製造的可控光源一起工作。我通過電子郵件發送公司,他們已同意將我的外部庫作爲DLL發送給我。Qt並鏈接到一個外部DLL

我已經開發全部採用的Qt 4.8.1我的軟件,並且已經使用MSVC2008編譯。

可控光源的DLL是在Visual Studio 2008中編譯的,是用C++或C#(製造商不確定)編寫的。所有我一直在考慮是DLL和一個文本文件,說我必須:

  1. 作爲參考添加DLL到我的項目
  2. 添加using LightName;到類
  3. 頂部實例化的一個實例對象如下:LightName *ln = new LightName();
  4. 使用新創建的LightName實例調用函數void turnOn()。

首先,我覺得很奇怪,一個外部庫需要我特別的實例化對象的實例時,它的一個簡單的硬件。

其次,另一家公司沒有給我提供任何接口文件。

我的問題是: 我怎麼可能鏈接到C++ DLL和揭露嵌套在這個庫中的功能,而無需在一個Qt環境具有界面頭文件?有沒有辦法爲外部圖書館製作一個界面?


我已經使用QLibrary和做以下嘗試:

QLibrary myLib("mylib"); 
typedef void (*MyPrototype)(); 
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); 
if (myFunction) 
    myFunction(); 

然而,這並不工作,因爲我得到的DLL不是一個C DLL,我沒有接口,這樣的Qt並不知道需要解決什麼樣的符號。


我試圖使用dumpbin/EXPORTS命令顯示從我的DLL導出的所有定義。不幸的是,這是無法產生任何東西。我希望能從中得到一些破壞性的C++,然後我可以解讀它來創建自己的頭文件。


我已經嘗試使用dependency walker(非常有用的工具),但它解決不了任何符號給我一些函數定義。


+0

我不建議使用'QLibrary'來使用外部庫。只有當你事先不知道圖書館的名字時(例如,當你想支持插件時)它才需要。 我想你只需要使用你的* .pro文件鏈接一個庫。 – fasked

+0

是的,這一切都很好,也可以從.pro加載庫。無論是從QLibrary還是從.pro加載外部庫,我怎樣才能調用C++中編寫的DLL的給定庫中的函數? @fasked – stackunderflow

+0

他們給出了他們不會發送標題的原因嗎? – cmannett85

回答

1

如果函數庫具有導出爲C符號的函數,QLibrary只會幫助您。如果這是C++,則可以轉儲符號表並查看它是否足夠。名稱必須是demangled:嘗試查找dumpbin或類似名稱。但是,您可能無法這樣做,這取決於符號是如何定義的。在這種情況下,您必須要求標題:read this

1

那麼請求你「實例化它們的對象的實例」是絕對合法的。這只是他們的設計決定,使dll接口面向對象(與普通的extern "C"相反)。 QtCore.dll也只是別人的DLL,而且你始終都在實例化它們的對象。

但這也意味着您將有更難調用DLL的時間。符號不是「C」符號(你不能以這種方式導出類),所以QLibrary不能爲你做任何事情。您可以嘗試使用DLL中的dumpbin /EXPORTS,然後使用tediously unmangle them重新構建類聲明。幸運的是,有工具可以幫助你(even online

但是不提供這樣的DLL頭文件是完全愚蠢的。

+0

嗯,我真的希望網站的C/C++代碼會有所幫助。不幸的是,當我運行dumpbin時,它無法檢測到任何加擾或解擾的方法定義[(dumpbin結果的屏幕截圖)](http://www.freeimagehosting.net/gi3xx)。任何其他可能的建議?否則,我想我回到了繪圖板上,必須找到新的燈光。我同意,它真的很無聊,他們無法提供頭文件。感謝您的幫助@Pavel Zdenek。 – stackunderflow

+0

我承認對dumpbin不太熟悉。這正是每個人都在使用的。所以要100%確定,請嘗試[Dependency Walker](http://www.dependencywalker.com/)。只需將您的DLL放在'depends.exe'上,並且符號(如果有的話)應該從右上角的第二個窗口中可見。 –

+0

感謝@Pavel的建議。不幸的是,我已經給了Dependancy Walker一個嘗試,它不能解決任何符號。看起來我將不得不向組織發送電子郵件,因爲我需要頭文件。否則,我可能會用不合適的不同可控光線去。 – stackunderflow