Тема: Загрузка *.dbx объектов, ссылающихся друг на друга

Уважаемые коллеги!
Есть несколько *.dbx объектов. В каждом были ссылки на один определенный объект A. Загрузив объект А первым, все остальные тоже нормально загрузились. Ситуация изменилась, когда потребовалось и в объкте А ввести ссылки на остальные объекты. Т.е. двухсторонние ссылки, и, естественно, AutoCAD, грузить их не хочет.
Может быть в хедерах надо доп. макросы ввести?
Как решается подобная проблема?
Спасибо

Re: Загрузка *.dbx объектов, ссылающихся друг на друга

> BS
IMHO подход изначально неверен. *.dbx-файлы не должны ссылаться друг на друга. Или их объединить все в один *.dbx или делать какой-то загрузчик, который их все будет загружать.

Re: Загрузка *.dbx объектов, ссылающихся друг на друга

Под ссылкой я имел ввиду наличие Id другого объекта.
Имея Id, можно получить, и изменить данные других
объектов при возникновении определенных событий.
Конечно, можно объединить все в один *.dbx файл, если их немного.

Re: Загрузка *.dbx объектов, ссылающихся друг на друга

Появилась идея, как можно это все несложно реализовать. Досточно использовать delayload для dbx-файлов. Например есть файл A.DBX, который зависит от B.DBX. Будем считать, что они все в одном каталоге в путях доступа AutoCAD. Прописываем в VS-проекте в опциях линкера DelayImp.lib /DELAYLOAD:"B.dbx", а в InitAppMsg() вставляем:

    // Находим каталог, в котором находится этот dbx-файл
    // и формируем путь к B.DBX
    char ModuleName[_MAX_PATH+1];
    GetModuleFileName(_hdllInstance,ModuleName,_MAX_PATH);
    char PathDBX[2*_MAX_PATH+1]; memset(PathDBX,'\0',2*_MAX_PATH+1);
    char *send = 0;
    if ((send = strrchr(ModuleName,'\\')) != NULL) {
      strncpy(PathDBX,ModuleName,send-ModuleName+1);
      strcat(PathDBX,"B.dbx");
    } else if ((send = strrchr(ModuleName,'/')) != NULL) {
      strncpy(PathDBX,ModuleName,send-ModuleName+1);
      strcat(PathDBX,"B.dbx");
    } else {
      strcpy(PathDBX,"B.dbx");
    }
    // Загружаем B.dbx. Если не удалось его загрузить
    // возвращаем AcRx::kRetError, т.е. и этот dbx-файл
    // не будет загружен
    if (!acrxLoadModule(PathDBX, true))
          return AcRx::kRetError;

Аналогично, если B.DBX зависит от A.DBX. Зависимость может быть и более сложной (т.е. A.DBX зависит от B.DBX, C.DBX и т.д., а B.DBX от B.DBX, C.DBX и т.д.). Тут главное, чтобы acrxLoadModule(...) был вызван для всех dbx-файлов до того, как они будут использованы.
Идею проверял в AutoCAD 2004-2006 для одного arx-файла и одного dbx-файла, от которого этот arx-файл зависит - все работает.

Re: Загрузка *.dbx объектов, ссылающихся друг на друга

Хорошая идея, ничего не скажешь!
Конечно, в отношении acrxLoadModule() мелькали
разные мысли, но delayload!
Я тогда объединил все в один *.dbx, и все проблемы кончились.
Но это не всегда возможно по разным причинам.
Поэтому это решение очень актуально, и очень остроумно выполнено.
Большое спасибо