C ++, как сохранить начальное состояние программы в DLL / распознать неинициализированную переменную - PullRequest
2 голосов
/ 01 февраля 2011

Я пишу DLL на C ++ для использования с VB6.Поэтому у меня не может быть конструктора, вызванного в моей DLL (согласно этому обсуждению ).Однако мне нужно поддерживать экземпляр класса внутри, поэтому я намереваюсь сохранить объект как глобальную переменную и вызвать конструктор из глобальной функции, а после этого использовать другую глобальную функцию для вызова метода объекта.

У меня была идея, что, возможно, одной функции будет достаточно: она проверит, присутствует ли экземпляр в глобальной переменной, а если нет, создаст его, а затем вызовет метод объекта (или, еслиэто присутствует, немедленно вызовите метод.)

Теперь, как я могу узнать, уже создан ли экземпляр?Я не могу присвоить глобальной переменной какое-либо значение в объявлении, верно?И, насколько я понимаю, они также не имеют гарантированного значения по умолчанию в C ++.

Поэтому мой вопрос: возможно ли это в любом случае и как?

Или я могу использовать BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) функция для инициализации переменных?Если да, может кто-нибудь сообщить мне, что именно представляют собой ul_reason_for_call случаи, и какой из них автоматически вызывается, когда VB6 загружает DLL, как в моем связанном примере?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Вы можете использовать глобальные статические переменные или переменные области видимости в файлах CPP:

bool bInited = false;
MyClass* pClass = NULL;

Эти операторы присваивания будут вызываться внутри DllMain, позже вы сможете проверить, правильно ли они были инициализированы.

Вы можете объявить указатели как auto_ptr (если вы используете stl или что-то эквивалентное), чтобы вызывать деструкторы при выходе.

2 голосов
/ 01 февраля 2011

Предположим, вы хотите, чтобы экземпляр MyClass был доступен глобально.У вас может быть класс со статическим членом, к которому ваши глобальные функции будут иметь доступ:

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

... и тогда ваши глобальные методы будут вызывать GlobalHelper::GetInstance()->Whatever() для выполнения своей работы.

1 голос
/ 01 февраля 2011

Вам даже не нужна функция:

class MyThingy
{
} my_global_thingy;

my_global_thingy будет создан при запуске программы перед выполнением DllMain.

...