получить доступ к статическим переменным / функциям в статически связанной библиотеке из динамической библиотеки DLL - PullRequest
2 голосов
/ 25 апреля 2011

Я пытаюсь использовать переменные и функции статического класса в динамически загружаемой dll, которые являются подклассами исходного класса. Эти статические члены используются в статически связанном классе; этот класс загружает библиотеки DLL с использованием фабрики, и эти библиотеки должны иметь доступ к статическим функциям и переменным. Вот краткий пример простой демонстрации (то есть не ожидайте, что он скомпилируется; фактические классы имеют более 1000 строк в каждой):

//GenericBase.h-------------------------
#include "GenericDll.h"
class GenericBase{
public:
   GenericBase()
   {
      mClassA.addInstance(this);
   }
   static int mNumInstances;
   static void DoSomething();
   static void Foo();
   static void LoadDlls();
   set<GenericDll*> mPlugins;
};
//--------------------------------------

//GenericDll.h--------------------------
class GenericDll : public GenericBase
{
    void Function();
};
extern "C" __declspec (dllexport) GenericDll* CreateModule()
{
    GenericDll * module = new GenericDll();
    return module;
}
//--------------------------------------

//GenericBase.cpp-----------------------
void GenericBase::DoSomething()
{
    for (it = mPlugins.begin(); it != mPlugins.end(); it++)
        it->Function();
}
//--------------------------------------

//GenericDll.cpp------------------------
void GenericDll::Function()
{
    mNumInstances++; // mNumInstancesin GenericDll and mNumInstances in
                    // the static linked GenericBase have different
                    // addresses
    cout << &mNumInstances<<endl;

    Foo();          // again, the address Foo() is different in the dll
}
//--------------------------------------

//main.cpp
int main(){
    GenericBase g;
    GenericBase::LoadDlls(); //not shown
    GenericBase::DoSomething();
    cout << &mNumInstances << endl;
}

//Output: these are the addresses of the mNumInstances
>> 00FAC3B0
>> 0F753398
>> 004D3398

Итак, общий вопрос или цель: как сделать адрес mNumInstances одинаковым для статически связанного объекта и динамически загружаемых классов dll, которые подклассируют этот объект?

Надеюсь, это достаточно ясно и имеет смысл!

1 Ответ

0 голосов
/ 14 июня 2011

Чтобы достичь того, что вы хотите сделать, вам нужно сделать общую (скопированную на DLL) статическую библиотеку самой DLL.

Думайте о библиотеке как об EXE.

Кроме того, будьте очень осторожны с версиями библиотеки и настройками компилятора и компоновщика при возврате таких вещей, как set <> (что бы это ни было), поскольку такие вещи, как выравнивание, размеры типов данных и различные реализации библиотек (отладка до выпуска) могут означать время выполнения ошибки (вылетает, если вам повезет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...