Есть run-time package.
В нем небольшой дата модуль: XMLTransformProvider, ClientDataSet.
Читаются данные из XML-ного фаила.
Проблема в следущем:
Загружаю пакет;
Делаю ClientDataSet.Open;
Все пучком.
Выгружаю пакет;
Снова загружаю;
Снова делаю ClientDataSet.Open;
Access violation
Помогите пожалуйста, подскажите, в чем дело?
Разобраться в чем дело — можно. Но вопрос в том, что "загружаю-выгружаю-загружаю" — уже неправильная логика работы. Вернее, я знаю единственный случай, когда это удобно: я делал так при отладке, выгружал, перекомпилял, загружал подправленную версию, чтобы не перегружать каждый раз основное приложение.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Susel, Вы писали:
S>Разобраться в чем дело — можно. Но вопрос в том, что "загружаю-выгружаю-загружаю" — уже неправильная логика работы. Вернее, я знаю единственный случай, когда это удобно: я делал так при отладке, выгружал, перекомпилял, загружал подправленную версию, чтобы не перегружать каждый раз основное приложение.
Во первых дело в том, что подгружаются только те пакеты, на которые пользователь имеет права. Первому подгружается пакет, для вторго нет, третему опять подгружается. (Понятно, что это происходит крайне редко)
Во вторых, не думаю, что это не правильная логика, скоре не стандартная, немного не рациональная...
Да и если абстрагироваться от логики работы! В чем же всетаки дело?
Здравствуйте, Susel, Вы писали:
S> Во первых дело в том, что подгружаются только те пакеты, на которые пользователь имеет права. Первому подгружается пакет, для вторго нет, третему опять подгружается. (Понятно, что это происходит крайне редко)
Хм. Для таких объектов, с моей точки зрения, dll удобнее пакетов.
Согласен, в принципе при такой постановке вариант достаточно нормальный. Хотя я бы все-таки вместо перезагрузки вызывал бы переинициализацию (то есть — старую информацию сбросили, а затем вызвали инициализацию только тех пакетов, на которые имеет право второй пользователь).
S>Во вторых, не думаю, что это не правильная логика, скоре не стандартная, немного не рациональная...
К сожалению, довольно часто пытаются грузить/выгружать пакеты, например, на каждое нажатие кнопки. Поэтому я прореагировал несколько резко, прощу прощения.
S>Да и если абстрагироваться от логики работы! В чем же всетаки дело?
Очевидно, что остается невалидный указатель. А вот где именно и почему — придется искать, и вполне возможно, долго.
Ваш пакет при выгрузке подчищает за собой? Модуль данных уничтожается? Если нет — сделайте. Если да — попробуйте уничтожить/пересоздать без перезагрузки пакета. Так сузим пространство поиска.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Susel, Вы писали:
S>> Во первых дело в том, что подгружаются только те пакеты, на которые пользователь имеет права. Первому подгружается пакет, для вторго нет, третему опять подгружается. (Понятно, что это происходит крайне редко)
S>Хм. Для таких объектов, с моей точки зрения, dll удобнее пакетов.
S>Согласен, в принципе при такой постановке вариант достаточно нормальный. Хотя я бы все-таки вместо перезагрузки вызывал бы переинициализацию (то есть — старую информацию сбросили, а затем вызвали инициализацию только тех пакетов, на которые имеет право второй пользователь).
S>>Во вторых, не думаю, что это не правильная логика, скоре не стандартная, немного не рациональная...
S>К сожалению, довольно часто пытаются грузить/выгружать пакеты, например, на каждое нажатие кнопки. Поэтому я прореагировал несколько резко, прощу прощения.
S>>Да и если абстрагироваться от логики работы! В чем же всетаки дело?
S>Очевидно, что остается невалидный указатель. А вот где именно и почему — придется искать, и вполне возможно, долго.
S>Ваш пакет при выгрузке подчищает за собой? Модуль данных уничтожается? Если нет — сделайте. Если да — попробуйте уничтожить/пересоздать без перезагрузки пакета. Так сузим пространство поиска.
Да все чиститься.
Но, все равно, сейчас сделал все ручками:
Уничтожил датасет, провайдер, датамодуль.
Все заново создал, подцепил друг к другу.
Открыл датасет. Все работает.
Опять все уничтожил, выгрузил пакет, загрузил, все создал, открываю: ошибка.
У меня какое-то смутное чувство по поводу подгружаемых библиотек типа midas.dll, msxml3.dll и проч.
Не могу только понять что это чувство мне говорит Мозгов наверно не хватает
Чтото вроде: Загрузился открыл датасет, подгрузились эти библиотеки.
Выгрузился, библиотеки не выгружаются (не знаю должны выгружаться или нет).
Загружаемся снова, открываем датасет и тут вот чет эдакое хитрое происходит с указателями подгруженных библиотек
Коряво конечно изъяснился, зато именно так в голове
Здравствуйте, Susel, Вы писали:
S>Загружаемся снова, открываем датасет и тут вот чет эдакое хитрое происходит с указателями подгруженных библиотек
Скорее всего, так и есть. И искать это будет достаточно долго — поэтому я предложил бы оценить, насколько сложно здесь заменить перезагрузку менее глобальными действиями.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Susel, Вы писали:
S>>Загружаемся снова, открываем датасет и тут вот чет эдакое хитрое происходит с указателями подгруженных библиотек
S>Скорее всего, так и есть. И искать это будет достаточно долго — поэтому я предложил бы оценить, насколько сложно здесь заменить перезагрузку менее глобальными действиями.
Здравствуйте, Susel, Вы писали:
S>Здравствуйте, Softwarer, Вы писали:
S>>Здравствуйте, Susel, Вы писали:
S>>>Загружаемся снова, открываем датасет и тут вот чет эдакое хитрое происходит с указателями подгруженных библиотек
S>>Скорее всего, так и есть. И искать это будет достаточно долго — поэтому я предложил бы оценить, насколько сложно здесь заменить перезагрузку менее глобальными действиями.
S>Спасибо. Будем думать.
Тут еще такое дело, каждый пакет это отдельная маленькая задача, и задач таких по идее около 300!!!
Если их всех сразу грузануть не думаю, что это есть гуд.
Главное все уже работает и тут вдруг эти западлянские грабли с клиентдатасетом (точнее с доступом к xml).
Здравствуйте, Susel, Вы писали:
S>Если их всех сразу грузануть не думаю, что это есть гуд.
Грузить их сразу — необязательно; вполне можно и "когда потребовались". Вопрос в том, что если загрузил — "выгрузить и загрузить снова" есть трата ресурсов и ничего более.