明确链接DLL和类方法

时间:2017-06-15 12:00:54

标签: c++ visual-studio dll

我想通过创建DLL并将其导入我的主程序来创建动态库。 但是,由于我从LIB切换到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 个答案:

答案 0 :(得分: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. 的项目
  3. 右键点击References,然后选择Add Reference...
  4. 在对话框中,选择左侧列表中的Solution
  5. 选择DLL项目旁边的复选框,然后按确定。
  6. 如果你最终为你的程序创建多个DLL,你需要更改定义的名称,以便它们不会发生冲突(我通常在每个定义的名称中包含DLL的名称) )。