2017-06-15 69 views
0

我想创建一个动态库,并将其导入到我的主程序中。 但是我不能正确运行我的程序,因为我从LIB切换到DLL。链接DLL和类方法明确

这是我的DLL .h文件中:

class Connector 
{ 
public: 
    Connector(std::string _apiKey, 
       std::string _masterCode, 
       std::string _masterSystem, 
       std::string _masterVersion, 
       int INTERNAL_PARAMETER = -1); 
    virtual ~Connector(); 
    std::string query(std::string method, 
         std::map<std::string, 
         std::string> params); 
    [...] 
} 

这是我mainApp链接代码:

typedef std::string (CALLBACK* kcDLLFUNC_QUERY)(
     std::string, std::map<std::string, std::string>, std::string); 

HINSTANCE kcDLL = LoadLibrary(_T("Connect")); 
kcDLLFUNC_QUERY kcDLLFUNC_query = (kcDLLFUNC_QUERY)GetProcAddress(kcDLL, "query"); 

std::map<std::string, std::string> params; 
params["amount"] = "50"; 
std::string RES = kcDLLFUNC_query("de", params, ""); 
std::cout << RES << std::endl; 
FreeLibrary(kcDLL); 

没有忘记什么了吗?

回答

1

主要问题是GetProcAddress()只适用于extern "C"函数。您要调用的函数是类的成员,并且您尚未导出函数或整个类。

我通常通过向DLL项目添加一个定义来实现此目的,然后在DLL项目中创建一个标头,该标头定义了一个指示函数/类是否被导出或导出的宏。事情是这样的:

// Assumes IS_DLL is defined somewhere in the project for your DLL 
// (such as in the project's Properties: C/C++ -> Preprocessor) 
#ifdef IS_DLL 
    #define DLL_API __declspec(dllexport) 
#else 
    #define DLL_API __declspec(dllimport) 
#endif 

然后修改你的类是这样的:

#include "DllExport.h" // name of the header file defined above 

class DLL_API Connector 
{ 
public: 
    Connector(std::string _apiKey, std::string _masterCode, std::string _masterSystem, std::string _masterVersion, int INTERNAL_PARAMETER = -1); 
    virtual ~Connector(); 
    std::string query(std::string method, std::map<std::string, std::string> params); 
    [...] 
} 

在您的.exe,包括对你的类的头,并使用它像往常一样。您还需要链接到DLL。在Visual Studio的最新版本中,按如下方式完成:

  1. 在解决方案资源管理器中,展开.exe的项目。
  2. 右键单击References,然后选择Add Reference...
  3. 在对话框中,在左侧的列表中选择Solution
  4. 选中DLL项目旁边的复选框,然后按OK。

如果最终为您的程序创建多个DLL,您需要更改定义的名称以避免冲突(我通常在每个定义的名称中包含DLL的名称) 。

+0

我该如何切换DLL_API的定义?当我尝试它时,我得到一些未解析令牌 –

+0

'DLL_API'因为它将被定义为DLL项目中的所有文件,并且不会为EXE项目中的文件定义。我忘了提到的一个步骤是EXE项目必须链接到DLL的项目。我将通过如何添加参考来更新我的答案。 – Andy

+0

我试过了,效果很好!但我需要.lib文件来做到这一点。有没有.lib文件链接的方法? –