Передача объекта класса из одной dll в другую dll Переполнение стека

Я пытаюсь для ситуации, как показано ниже

Мой A.dll загружает B.dll и вызывает его функцию с указателем объекта класса, который присутствует в A.dll в качестве параметра для функции загрузки

Используя эту ссылку на объект, я могу вызвать функцию A.dll из B.dll ??

Моя функция B.dll заключается в следующем,

bool LogManagerThread::StartLogThread(void* AObj)
{
A* pobj;
pobj = (A*)AObj;
pobj->PrintTestMsg();
return true;
}

«A» — это класс в A.dll

Если я так называю, я получаю ошибку связывания как «неразрешенный внешний символ» .. где PrintTestMsg () — это метод в «классе A» файла A.dll.

Error 11 error LNK2001: unresolved external symbol "public: void __thiscall A::PrintTestMsg(void)" (?PrintTestMsg@A@@QAEXXZ) D:\ilrewrite2\ConsoleApplication1\LogManager.obj LogMa‌​nager

1

Решение

Исходя из вашего описания: «Мой A.dll загружает B.dll и вызывает его функцию со ссылкой», поэтому A зависит от B, теперь вы хотите использовать классы A dll в DLL B, это означает, что вы позволили B зависеть на A, поэтому он создает цикл, вы не можете реализовать библиотеки DLL таким образом.

Один из способов сделать это: реализовать набор интерфейсов в B DLL, в то время как в A DLL, A реализует эти интерфейсы, поэтому это выглядит так:

//in B DLL

class BInterface
{
public:
virtual void PrintTestMsg() = 0;
};

//in A DLL,

class AChild : public BInterface
{
public:
virtual void PrintTestMsg()
{
//do stuff
}
};

как функция в B DLL:

bool LogManagerThread::StartLogThread(BInterface* AObj)
{
if (!AObj)
return false;

AObj->PrintTestMsg();
return true;
}

Эти виды должны решаться с помощью дизайна, вместо зависимости от класса, вы должны позволить классам зависеть от интерфейсов, чтобы сломать зависимости. инверсия контроля шаблон для решения этих проблем.

1

Другие решения


По вопросам рекламы [email protected]