6

我开发了一个 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,而不是整个类。

4

3 回答 3

12

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

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

class CClientLib: public IClientLib {
...
};
于 2012-04-19T12:24:33.247 回答
0

考虑一下您要问的内容...ConnectLogout都是非静态成员函数,这意味着您需要在以下类型的实例上调用它们:intense.Connect()。现在,如果您不导出类本身,您将无法创建instance,并且是否导出ConnectLogout没有区别,它们将无法使用。

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

于 2012-04-19T11:56:21.223 回答
0

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

CCLientLib g_clientLib;

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

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

于 2012-04-19T12:01:55.433 回答