2012-11-30 188 views
4

我有一個函數,我想從我的C++應用程序調用一個dll。該DLL也是用C++編寫的,並有一個def文件,顯示了dll中的函數。我正在使用visual studio 2010,並將其配置爲使用dll文件,方法是在鏈接器「Additional Library directories」中添加dll的目錄,然後在鏈接器的「輸入」中添加DLLname.lib。現在,dll中的所有名稱空間都可用,但是我需要的函數不可用,因爲它們不在任何名稱空間下。我如何去訪問這些功能?這些功能都在DLL從C++調用DLL函數

#include "stdafx.h" 
#include <stdio.h> 
__declspec(dllexport) int somefunction() 
{ 
...... 
      return SomeValue 
} 

我的問題是宣佈爲我怎麼通過它的dll訪問somefunction在我的C++應用程序。

回答

11

這裏似乎有些混亂。將文件添加到鏈接器輸入是用於靜態鏈接庫(Windows上的.lib)。使用靜態鏈接的庫時,代碼只會在編譯時複製到您的程序中。動態鏈接庫(Windows中的.dll)駐留在不同的文件(DLL)中,並在運行時由程序加載。要在一個dll訪問功能,有兩種主要方法:

  • 使用dllimport,類似於你如何導出的函數與DLLEXPORT

  • 負載使用LoadLibrary的DLL,然後獲得一個指向你的函數與GetProcAddress。如果你使用這種方法,你應該注意的另一件事是,你應該使用extern "C"你正在導出的函數,以避免name mangling。如果您在使用GetProcAddress時遇到問題,可以使用Dependency Walker來檢查DLL中的函數名稱 - 根據所使用的calling convention,它們可能會稍微修改。