2011-02-01 83 views
2

我正在用C++编写一个用于VB6的DLL。因此,我不能在我的DLL中调用构造函数(根据this discussion)。但是,我需要在内部维护一个类的实例 - 所以我打算将该对象保留为全局变量并从全局函数中调用构造函数,然后使用另一个全局函数在对象上调用方法。我有这样的想法,也许一个函数就足够了:它会检查一个实例是否存在于一个全局变量中,如果不存在,创建它,然后调用该对象上的方法(或者,如果它是目前,立即调用该方法。)C++如何在DLL中存储程序的初始状态/识别未初始化的变量

现在,我该如何找出一个实例是否已经创建?我不能在声明中为全局变量赋值任何值,对吗?就我所知,它们在C++中也没有保证的默认值。

因此,我的问题:无论如何这是可能的,以及如何?

或者我可以使用BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )函数来初始化变量吗?如果是这样,有人可以填写我正在做什么ul_reason_for_call案件,以及当我的链接的例子中VB6加载DLL时自动调用哪些?

+0

我不会在DllMain中做到这一点。但是,为什么不使用包装类的静态成员的助手类,并且所有全局函数(由VB6调用)都可以使用该实例? – 2011-02-01 13:17:30

+0

@Sasha:但是这并不意味着我需要创建一些实例才能访问它的方法?请稍微具体一点,我不太明白! – 2011-02-01 13:21:44

+0

请参阅下面的答案。 – 2011-02-01 13:24:26

回答

2

您可以使用全局静态变量或在你的CPP文件的文件范围变量:

bool bInited = false; 
MyClass* pClass = NULL; 

这些赋值语句将被称为内DllMain,以后你可以测试他们是否已正确初始化。

您可以将指针指定为auto_ptr(如果您使用stl或其他类似的东西),可以在退出时调用析构函数。

2

假设您想要一个MyClass的实例在全局可访问。 你可以有一个静态成员的类,你的全球职能将访问:

class GlobalHelper { 
public: 
    static MyClass* GetInstance() { 
     static MyClass inst; 
     return &inst; 
    } 
}; 

...然后你的全局方法将被调用GlobalHelper::GetInstance()->Whatever()做好自己的工作。

1

你甚至都不需要一个函数:

class MyThingy 
{ 
} my_global_thingy; 

my_global_thingy将在程序启动时被实例化,执行的DllMain之前。