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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Вопрос по dll и com-интерфейсах

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

Hastur » 29 авг 2007, 09:33

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

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

Hastur » 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 вызываемые из длл процедуры пустые). Что собствненно за нафиг такой?

Вернуться к началу