C++;如何将程序的初始状态存储在DLL/recognize未初始化变量中 我在用C++编写一个DLL,用于VB6。因此,我不能在我的DLL中调用构造函数(根据)。但是,我需要在内部维护一个类的实例——因此我打算将对象保持为全局变量,并从全局函数调用构造函数,然后使用另一个全局函数调用对象上的方法

C++;如何将程序的初始状态存储在DLL/recognize未初始化变量中 我在用C++编写一个DLL,用于VB6。因此,我不能在我的DLL中调用构造函数(根据)。但是,我需要在内部维护一个类的实例——因此我打算将对象保持为全局变量,并从全局函数调用构造函数,然后使用另一个全局函数调用对象上的方法,c++,dll,vb6,initialization,com-interop,C++,Dll,Vb6,Initialization,Com Interop,我的想法是,也许一个函数就足够了:它将检查全局变量中是否存在实例,如果不存在,则创建它,然后调用对象上的方法(或者,如果存在,则立即调用该方法) 现在,如何确定实例是否已经创建?我不能在声明中为全局变量赋值,对吗?而且,在C++中,它们也没有保证的默认值,据我理解。 因此,我的问题是:这到底有可能吗?如何实现 或者我可以使用BOOL apient DllMain(HMODULE HMODULE, 德沃德·乌尔打电话的理由, LPVOID lpReserved )初始化变量的函数?如果是这样的话,

我的想法是,也许一个函数就足够了:它将检查全局变量中是否存在实例,如果不存在,则创建它,然后调用对象上的方法(或者,如果存在,则立即调用该方法)

现在,如何确定实例是否已经创建?我不能在声明中为全局变量赋值,对吗?而且,在C++中,它们也没有保证的默认值,据我理解。 因此,我的问题是:这到底有可能吗?如何实现

或者我可以使用
BOOL apient DllMain(HMODULE HMODULE,
德沃德·乌尔打电话的理由,
LPVOID lpReserved

)
初始化变量的函数?如果是这样的话,有人能告诉我调用的
ul\u原因到底是什么,以及当VB6像我的链接示例那样加载DLL时,会自动调用其中的哪一个吗?

假设您想全局访问
MyClass
的实例。 您可以拥有一个具有静态成员的类,全局函数将访问该类:

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

…然后您的全局方法将调用
GlobalHelper::GetInstance()->which()
来完成它们的工作。

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

bool bInited = false;
MyClass* pClass = NULL;
这些赋值语句将在
DllMain
中调用,稍后您可以测试它们是否已正确初始化


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

您甚至不需要函数:

class MyThingy
{
} my_global_thingy;

my_global\u thingy
将在程序启动时实例化,然后再执行DllMain。

我不会在DllMain中执行。但是为什么不使用一个封装类的静态成员的helper类,并且所有全局函数(由VB6调用)都可以使用该实例?@Sasha:但这是否仍然意味着我需要创建一些实例,然后才能访问其方法?请说得具体一点,我不太明白!你的老板想让你写一个COM服务器。你需要学习ATL。@Hans:这是一个相当简单的项目,我认为使用COM会有些过分。将DLL放在系统文件夹中,并执行
声明函数foo Lib“bar.DLL”
对于本项目来说应该完全足够了。但如果我使用COM是不可避免的,我会在以后这样做。。。这可能会导致很多问题,所以,哦,谢谢,有趣的是,到现在为止我还没有使用C++中的静态变量。这样可以确保在第一次调用
GetInstance()
时只创建一次实例
inst
,然后在以后的每次调用中重复使用?它是否也与传递给构造函数的参数一起工作?如果参数改变会发生什么?然后创建一个新实例,但如果它们在两次调用中保持不变,则旧实例将被重用?如果每次都需要不同的参数,则无法使用。但是您可以通过将对象存储在一个由参数tuple索引的
std::map
中来进一步扩展这个想法!也很有趣。我猜使用了默认构造函数?我能换一个名为的吗?@Felix:是的,默认的ctor被称为。不,你不能像我写的那样给别人打电话。在德尔曼被处决之前?我认为您对C/C++main()函数感到困惑。加载DLL/EXE时,操作系统会先调用DllMain/WinMain,然后再调用其他任何操作。