如何导出类函数,但不导出DLL中的整个类

时间:2012-04-19 10:57:29

标签: c++ dll c++-cli

我开发了一个Win32 DLL,提供了下面的详细信息,并希望为Connnect和LogOut函数创建一个CLI / C ++包装器。

我知道可以从DLL导出整个类和函数。

class CClientLib
{
 public:
CClientLib (void);
// TODO: add your methods here.
__declspec(dllexport) bool Connect(char* strAccountUID,char* strAccountPWD);
__declspec(dllexport) void LogOut();

 private :

    Account::Ref UserAccount ;
void set_ActiveAccount(Account::Ref act)
{
   // Set the active account
}

Account::Ref get_ActiveAccount()
{
  return UserAccount;
    }

};

我希望将类作为导出函数,Connect和LogOut,使用函数set / get。

是否只能导出函数Connect和LogOut,而不是整个类。

3 个答案:

答案 0 :(得分:10)

我建议声明一个将被导出的接口,然后由内部类实现它。

class __declspec(dllexport) IClientLib {
 public:
    virtual bool Connect(char* strAccountUID,char* strAccountPWD) = 0;
    virtual void LogOut() = 0;
};

class CClientLib: public IClientLib {
...
};

答案 1 :(得分:0)

考虑您的问题...... ConnectLogout都是非静态成员函数,这意味着您需要在类型为{{1}的实例上调用它们}。现在,如果您不导出类本身,您将无法创建intense.Connect(),并且instanceConnect是否导出没有任何区别,它们将无法使用

另一种方法是不导出它们中的任何一个,并提供具有相同功能的导出自由函数,这些函数适用于您的类之外的某些可见的实例。或者提供第三个函数,在库中创建句柄,其中 handle 可以是指向动态分配的类型实例的不透明(Logout)指针,然后将句柄作为额外参数传递给void*Connect的自由函数版本。您还需要添加第四个函数来释放该对象。

答案 2 :(得分:0)

你可以通过简单地创建两个函数来调用所需的类方法来导出它们。 即。

CCLientLib g_clientLib;

__declspec(dllexport) void CClientLib_LogOut()
{
    g_clientLib.LogOut();
}

但我不明白为什么你需要这个,因为它足以标记你不想使用“private”修饰符访问的方法(如你的例子中所做)。