Felix Dombek
Felix Dombek

Reputation: 14382

C++ how to store initial state of program in DLL / recognize uninitialized variable

I'm writing a DLL in C++ for use with VB6. As such, I cannot have a constructor called in my DLL (according to this discussion). However, I need to maintain an instance of a class internally -- so I intend to keep the object as a global variable and call the constructor from a global function, and after that, use another global function to call a method on the object.

I had the idea that maybe one function would be enough: It would check if an instance is present in a global variable, and if not, create it, and then call the method on the object (or, if it is present, immediately call the method.)

Now, how can I find out whether an instance is already created? I can't assign a global variable any value in the declaration, right? And they also don't have a guaranteed default value in C++, as far as I understand.

Therefore my question: Is this possible anyway and how?

Or can I use the BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) function to initialize variables? If so, can someone fill me in on what the ul_reason_for_call cases exactly are and which of these is automatically called when VB6 loads the DLL as in my linked example?

Upvotes: 2

Views: 1319

Answers (3)

John Dibling
John Dibling

Reputation: 101506

You don't even need a function:

class MyThingy
{
} my_global_thingy;

my_global_thingy will be instantiated at program startup, before DllMain is executed.

Upvotes: 1

user180326
user180326

Reputation:

You can use global static variables or file scope variables in your CPP files:

bool bInited = false;
MyClass* pClass = NULL;

These assignment statements will be called inside DllMain, later you can test if they have been initialized properly.

You could declare the pointers as auto_ptr (if you use stl or something equivalent), to have the destructors called on exit.

Upvotes: 2

Sasha Goldshtein
Sasha Goldshtein

Reputation: 3519

Suppose you want an instance of MyClass to be acessible globally. You can have a class with a static member which your global functions will access:

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

...and then your global methods would be calling GlobalHelper::GetInstance()->Whatever() to do their work.

Upvotes: 2

Related Questions