Один экземпляр класса отличается в графическом интерфейсе EXE и DLL - PullRequest
4 голосов
/ 02 декабря 2011

В моем приложении GUI (MFC) я использую DLL для отображения чего-либо на экране. У меня есть статическая библиотека, в которой есть класс синглтона для этого. например: sing.lib. Я включаю sing.lib в проект приложения (exe) и в проект dll (потому что оба используют этот класс синглтона)

Проблема в том, что экземпляр попадает в exe, а в dll отличается. Оба вызывают конструктор !! см. фрагмент кода синглтон-класса.

class A
{
private:
    A();
    virtual ~A();
    static A* m_pInstance;
public:
    static A* GetInstance()
    {
        if (NULL == m_pInstance)
        {
            m_pInstance = new A();
        }
        return m_pInstance;
    }
}

Ответы [ 3 ]

5 голосов
/ 02 декабря 2011

Если вы хотите, чтобы экземпляр синглтона использовался совместно dll и exe, поместите его определение в динамическую библиотеку вместо статической библиотеки.

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

Рассмотрим

//static lib

int CurrentCounter =0;

int getNextCounter()
{
    return CurrentCounter;
}

такой код в статической библиотеке. В вашем случае, если обе ссылки exe и dll на эту библиотеку получат свои CurrentCounter . Таким образом, exe и dll могут иметь разные значения CurrentCounter одновременно.

2 голосов
/ 02 декабря 2011

Статическая библиотека связана как с EXE, так и с DLL, и поэтому оба бинарных файла имеют «копию» вашего класса, поэтому различные синглтоны - это поведение по своему замыслу. Такого рода синглтоны «на двоичную», а не на процесс.

Вам нужна динамическая библиотека для истинного единого процесса, чтобы ваш EXE-файл использовал экспорт DLL и работал с классом, связанным с DLL.

1 голос
/ 02 декабря 2011

Каждый двоичный файл, с которым связана статическая библиотека, будет иметь свою собственную копию класса.

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