我开发了一个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,而不是整个类。
答案 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)
考虑您的问题...... Connect
和Logout
都是非静态成员函数,这意味着您需要在类型为{{1}的实例上调用它们}。现在,如果您不导出类本身,您将无法创建intense.Connect()
,并且instance
和Connect
是否导出没有任何区别,它们将无法使用
另一种方法是不导出它们中的任何一个,并提供具有相同功能的导出自由函数,这些函数适用于您的类之外的某些可见的实例。或者提供第三个函数,在库中创建句柄,其中 handle 可以是指向动态分配的类型实例的不透明(Logout
)指针,然后将句柄作为额外参数传递给void*
和Connect
的自由函数版本。您还需要添加第四个函数来释放该对象。
答案 2 :(得分:0)
你可以通过简单地创建两个函数来调用所需的类方法来导出它们。 即。
CCLientLib g_clientLib;
__declspec(dllexport) void CClientLib_LogOut()
{
g_clientLib.LogOut();
}
但我不明白为什么你需要这个,因为它足以标记你不想使用“private”修饰符访问的方法(如你的例子中所做)。