2014-01-16 2 views
0

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

//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 ?? –

ответ

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++ жалуется на повторное использование тех же заголовков на разных заголовках. (Циклическая зависимость) – ffenix