![]() |
|
#1
|
|||
|
|||
![]() Помогите найти ошибку. Создаю COM ввиде DLL. в модуле где пишу реализацию методов интерфейса вызываю некоторые методы из отдельно написанного модуля. Таким образом вылетает ошибка EAccessViolation при обращении к какому-либо объекту этого модуля. Т. е. напримеркод
PHP код:
Модуль библиотеки типов PHP код:
Модуль где описываю реализацию методов интерфейса PHP код:
Отдельный модуль PHP код:
|
#2
|
|||
|
|||
![]() Ошибка здесь:
Form1.TestMtd('S'); // здесь обращаюсь к методу из отдельного модуля Кто форму-о создавать будет??? Если в обычном приложении это за тебя делает Дельфи, то в СОМ придется самому. |
#3
|
|||
|
|||
![]() А как ее создать в COM? Писать конструктор в классе реализующем интерфейс или как-то иначе (просто с COM начал разбираться только пару дней назад)?
|
#4
|
|||
|
|||
![]() Ровно точно так же, как создается форма в режиме выполнения.
Код:
Form1 := TForm1.Create(Nil); Тут интереснее вопрос в том, когда ее убивать. Вообще, формы в COM - это плохо (если, конечно, это не ActiveX-форма). Попробуй нужный тебе метод "выдернуть" из формы в просто процку, т.е. отказаться от самой формы. я не знаю, зачем такая сложность. Ктати, если ты делаешь OLE-сервер, то его надо делать в главном модуле, ане отдельной dll. |
#5
|
|||
|
|||
![]() Блин все равно что-то не так (на самом деле работаю не с формой а с DataModule'м на котором лежит IBTable и прочее). В некоторых случаях мне нужно обратиться к нему (IBTable) после чего вылетает ошибка EAccessViolation. DataModul'ь создаю в конструкторе того класса из которого обращаюсь к IBTable (DataModuleConnection := TDataModuleConnection.Create(nil)).
|
#6
|
|||
|
|||
![]() Все решил проблему. Оказывается нужно перекрывать метод Initialize, так как у предков TTypedComObject конструктор не виртуальный
|