Delphi 6 Ошибка доступа к памяти при доступе к методу или свойству из файла .DLL - PullRequest
0 голосов
/ 15 марта 2011

В стороннем .DLL-файле, который мы используем, есть ошибка, и мне поручили ее исправить.Библиотека была создана компанией, которую в последний раз наняли для поддержки кода, и у нас есть только часть исходного кода.Всякий раз, когда объекты, используемые для обработки, находятся в коде, который мы имеем, они имеют форму OleVariants.Мое решение состояло в том, чтобы создать подкласс класса с ошибкой и переопределить метод для исправления ошибки.Проблема заключается в том, что всякий раз, когда я пытаюсь вызвать метод из родительского класса, я получаю ошибку нарушения доступа к памяти из другого файла .DLL.

Я - полный новичок в Delphi, так как я работаю с ним уже третью неделю.,Буду признателен за любую помощь.

Спасибо.

РЕДАКТИРОВАТЬ: Я, вероятно, должен уточнить немного больше.Я заменяю исходный объект экземпляром нового класса, в котором есть исправление.Я пытаюсь привести исходный объект из OleVariant к новому классу и преобразовать его вниз или передать конструктору для нового объекта, чтобы я мог сохранить данные в объекте.Мне интересно, есть ли способ сделать это и не появиться ошибка, когда я вызываю унаследованную функцию или функцию из объекта после того, как он был приведен обратно в исходный тип.Еще раз спасибо.

РЕДАКТИРОВАТЬ 2: Чтобы ответить на один вопрос, я пытаюсь привести из OleVariant к его исходному классу или к созданному мною подклассу.

Чтобы ответить на второй вопрос:Я импортировал соответствующую библиотеку, затем написал следующее:

Subclass = class(SuperclassFromDll)

Где «Subclass» и «SuperclassFromDll» - это фактические имена классов.Если это неправильный способ сделать это, скажите, пожалуйста, как заменить данную функцию (возможно, записав исправление в модуль DllName_TLB?).Извините за отсутствие ясности, я пытаюсь быстро задать вопрос, чтобы я мог вернуться к попытке выяснить это.

РЕДАКТИРОВАТЬ 3: Я должен также отметить, что файл DLL был создан из DelphiПроект сделан предыдущей компанией.

1 Ответ

2 голосов
/ 15 марта 2011

Вы не можете сделать это.Как говорит Дэвид Хеффернан, это «нетривиально», и это хороший способ сказать, что вы должны быть гением, чтобы осуществить это.Так что вам не нужно быть новичком в Delphi, если вы собираетесь попробовать это.(OTOH, если бы ты не был новичком в Delphi, ты бы даже не подумал об этом).

С одной стороны, вы сможете преобразовать COM-объект в объект Delphi только в том случае, если COM-объект реализован в Delphi, И динамически связан, И скомпилирован с той же версией Delphi.

Лучшее, более простое решение, поскольку, как сообщается, проблема возникает при вызове метода в классе, состоит в том, чтобы изолировать обстоятельства, которые вызывают проблему, и избегать вызова метода в этих обстоятельствах.

Вы можете сделать это в классе оболочки.Поэтому вместо того, чтобы приводить OleVariant (я предполагаю COM-объект под капотом) и приводить его к классу-обертке delphi, создайте свой собственный класс CProblemObjectShim, в котором класс задачи является членом.Затем реализуйте ВСЕ методы, вызывая содержащийся объект и добавляя дополнительные проверки или шаги, необходимые для решения проблемы.

...