C ++如何在DLL中存储程序的初始状态/识别未初始化的变量

时间:2011-02-01 13:10:44

标签: c++ dll vb6 initialization com-interop

我正在用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时会自动调用哪些案例,如我的链接示例所示?

3 个答案:

答案 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将在程序启动时实例化。