Подход зависимости

0

Ну, я делаю загрузчик PE на C++ (не мой основной язык), и у меня есть следующие классы:

//Main builder of PE file format
class PEC
{
   HMODULE mapTo(char* fullpath);
}

//Build the imports
class ImportBuilder
{
    //This func needs PEC::MapTo
    bool buildImports(HMODULE module) 
}

//Find the exports
class ExportFinder
{
   //This func needs PEC::MapTo
   void* findExport(int ordinal, HMODULE module);
}

Проблема заключается в том, что классу PEC нужен класс ImportBuilder для восстановления импорта, но также для класса ImportBuilder требуется класс PEC для загрузки модулей импорта, которые не основаны внутри текущего процесса. То же самое касается ExportBuilder, ему нужна функция PEC :: MapTo для загрузки некоторых передовых модулей экспорта, которые не основаны.

Это приводит меня к циклической зависимости... любому методу решения этого вопроса.

Благодарю.

  • 0
    Вы просите предварительные декларации и идиома pimpl?
Теги:
oop

1 ответ

0
Лучший ответ

Проблема в основном заключается в косвенной рекурсии.

Вы загружаете файл. Затем вы пытаетесь разрешить импорт.

Для этого вы (рекурсивно) загружаете больше файлов и пытаетесь разрешить их импорт.

Вы закончите, когда достигнете одного из двух пунктов:

  1. все импортные услуги выполнены, и загрузка выполнена успешно
  2. вы не можете разрешить импорт, а загрузка не выполняется

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

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

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

class PEC;

class ImportBuilder { 
   // function declarations, but not definitions here
   // functions can use references or pointers to a PEC, but not
   //     actual PEC objects.
};

class PEC { 
    // function declarations, but not definitions here
};

// Definitions of member functions for PEC and ImportBuilder here
  • 0
    Благодаря тому, что у меня уже есть все, что связано со структурой PE-заголовка, проблема в том, что C ++ жалуется на использование одних и тех же заголовков на разных заголовках. (Циклическая зависимость)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню