Вопрос пользователя связан с созданием динамической библиотеки (DLL) в Delphi 2009, которая должна быть подключена к стороннему приложению, написанному на MS Visual C++. Суть задачи заключается в том, что приложение может работать без подключения DLL, но при её наличии загружает её и обращается к экспортируемым функциям. Одна из функций DLL должна вызывать методы интерфейса, переданного из C++ приложения.
Проблема заключается в том, что при попытке доступа к методам интерфейса возникает ошибка доступа к памяти (EAccessViolation). Это происходит из-за неправильной реализации доступа к методам COM-интерфейсов в Delphi DLL.
Решение проблемы
Перевод типов из C++ в Delphi: Пользователь уже перевел типы из C++ в Delphi, добавив префикс T к типам и определив соответствующие типы в отдельном модуле.
Обращение к методам интерфейса: При вызове метода интерфейса необходимо убедиться, что параметр, передаваемый в функцию DLL, корректно объявлен. В C++ интерфейсы передаются через указатели, поэтому в Delphi они должны быть объявлены как указатели на интерфейс (PIIFlowContext), а не как переменные (var pContext : IIFlowContext) или без modificator (pContext : IIFlowContext).
Корректное объявление параметра: В Delphi для параметров, представляющих COM-интерфейсы, следует использовать объявление без modificator var или const, то есть просто pContext : PIIFlowContext.
Проверка корректности VMT (Virtual Method Table): Убедитесь, что VMT корректно инициализирован и содержит указатели на методы интерфейса.
Управление ссылками: Убедитесь, что в Delphi реализовано правильное управление ссылками (AddRef и Release), так как это критично для COM-объектов.
Отладка: Используйте отладчик для шагания по коду и проверки корректности передачи параметров и вызова методов интерфейса.
Пример кода на Object Pascal (Delphi)
function FPHOOK_OnStartFlowInstance(const strSvcAppName : PTCHAR;
const strAppName : PTCHAR;
const eSectionType : TFLOW_SECTION_TYPE;
pContext : PIIFlowContext) : Int; stdcall;
var
fphookResult : HRESULT;
begin
try
fphookResult := pContext.cleanExecutionState;
except
on E: Exception do
dbg('FPHOOK_OnStartFlowInstance, pContext.cleanExecutionState: %s::%s', [E.ClassName, E.Message]);
end;
result := 0;
end;
Заключение
При создании DLL для C++ приложения на Delphi важно правильно перевести типы и корректно обращаться к методам COM-интерфейсов. Правильное объявление параметров и управление ссылками являются ключевыми моментами при работе с COM-объектами в Delphi.
Пользователь столкнулся с проблемой, вызванной неправильной реализацией доступа к методам COM-интерфейсов в динамической библиотеке (DLL), созданной на Delphi 2009, для использования в стороннем приложении, написанном на MS Visual C++.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS