Вопрос по dll и com-интерфейсах

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
Аватара пользователя
Hastur
Сообщения: 18
Зарегистрирован: 05 авг 2007, 18:09

27 авг 2007, 19:43

Всем привет!

try
result:=true;
h:=LoadLibrary(PAnsiChar(path));
addr:=GetProcAddress(h,PChar('GetObject'));
dllobject:=addr;
TComponent(dllobject^).GetInterface(IUnitsInformation,intr);

new(info);
info^.name:=intr.GetName;
info^.version:=intr.GetVersion;
info^.path:=path;

addr1:=GetProcAddress(h,PChar('CloseModule'));
addr1;
FreeLibrary(h);
InfoList.Add(info);
except
result:=false;
exit;
end;

Этот код вылетает на строке InfoList.Add(info);(вообще говоря он вылетает после закрытия библиотеки) с ошибкой

---------------------------
Debugger Exception Notification
---------------------------
Project Monopolia.exe raised exception class EAccessViolation with message 'Access violation at address 004046DE in module 'Monopolia.exe'. Read of address 02B1F054'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Все переменные созданы интерфейс получается, длл нормальная(этот код неработает даже если 2 вызываемые из длл процедуры пустые). Что собствненно за нафиг такой?
Аватара пользователя
Hastur
Сообщения: 18
Зарегистрирован: 05 авг 2007, 18:09

29 авг 2007, 09:33

Немного поэксперементировал, конкретезирую вопрос. Когда я запаковывал в длл формы проблем не возникало, но когда я попробовал в длл положить свой класс ничего не получилось. Как видно из кода прошлой мессаги я из длл получаю указатель на объект(на мой класс который наследуется от TComponent) и получаю от него интерфейс, всё проходит нормально до закрытия дллки, вылетает выше приведённая ошибка.
Пробовал передавать в длл апликейшен(как в случае с формами), вызывать в конструкторе и деструкторе класса соответствующие методы предка. Но что-то бубен и пляски не помогли.
Ещё оказалось что если убрать получения интерфейса то всё работает. Но интерфейс нужен.
Чтож всётаки за нафиг-то такой?
Ответить