我正在用C ++编写一个DLL用于VB6。因此,我不能在我的DLL中调用构造函数(根据this discussion)。但是,我需要在内部维护一个类的实例 - 所以我打算将对象保持为全局变量并从全局函数调用构造函数,然后使用另一个全局函数来调用对象上的方法。
我认为可能只有一个函数就足够了:它将检查一个实例是否存在于全局变量中,如果没有,则创建它,然后在该对象上调用该方法(或者,如果它存在,立即调用该方法。)
现在,我如何确定是否已创建实例?我无法在声明中为任何值分配全局变量,对吧?据我所知,它们在C ++中也没有保证的默认值。
因此,我的问题是:这有可能吗?怎么样?
或者我可以使用BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
函数初始化变量吗?如果是这样,有人可以填写ul_reason_for_call
案例究竟是什么以及当VB6加载DLL时会自动调用哪些案例,如我的链接示例所示?
答案 0 :(得分:2)
假设您希望MyClass
的实例在全局范围内可访问。
您可以拥有一个具有静态成员的类,您的全局函数将访问该成员:
class GlobalHelper {
public:
static MyClass* GetInstance() {
static MyClass inst;
return &inst;
}
};
...然后你的全局方法会调用GlobalHelper::GetInstance()->Whatever()
来完成他们的工作。
答案 1 :(得分:2)
您可以在CPP文件中使用全局静态变量或文件范围变量:
bool bInited = false;
MyClass* pClass = NULL;
这些赋值语句将在DllMain
内调用,稍后您可以测试它们是否已正确初始化。
您可以将指针声明为auto_ptr
(如果使用stl或类似的东西),以便在退出时调用析构函数。
答案 2 :(得分:1)
你甚至不需要一个功能:
class MyThingy
{
} my_global_thingy;
在执行DllMain之前, my_global_thingy
将在程序启动时实例化。