Делаю все как написано в хелпе SDK:
var
kompas: KompasObject;
app7: IApplication;
Documents: IDocuments;
begin
kompas:=KompasObject(GetActiveOleObject('Kompas.Application.5'));
app7:=IApplication(kompas.ksGetApplication7);
Documents:=IDocuments(app7.Documents); //Во время выполнения программы именно здесь выдает ошибку
end;
Выдает ошибку "First chance exception at $75F318F8. Exception class $C0000005 with message 'access violation at 0x75f318f8: write of address 0x75f32154'. Process Project1.exe (3568)". Якобы я пытаюсь обратиться к объекту, которого не существует. Как решить данную проблему?
Неужели никто не знает как решить подобную проблему? Я в шоке...
Все нормально работает.
IDocuments.png
Спасибо большое!
Оказывается у меня было две ошибки:
1) Documents:=app7.Documents; - правильно Documents:=IDocuments(app7.Documents); - неправильно
2) Здесь я в недоумении. я до сегодняшнего дня был уверен, что запись:
app7:=kompas.ksGetApplication7 as IApplication;
и
app7:=IApplication(kompas.ksGetApplication7);
имеют один и тот же смысл. Однако, при использовании второго варианта, программа вылетает.
Цитироватьapp7:=kompas.ksGetApplication7 as IApplication VS app7:=IApplication(kompas.ksGetApplication7)
Я не спец по Делфи, но эти операторы имеют совершенно разный смысл. Если рассматривать "kompas.ksGetApplication7" как некий указатель на интерфейс или объект, то первый оператор преобразует его в другой указатель на другой интерфейс того же объекта через функцию QueryInterface, что является безопасным способом приведения указателей на интерфейсы в модели СОМ, а второй - просто меняет его тип, но не меняет его значение, что может привести к небезопасной подмене одного интерфейса другим, в котором просто не быть тех функций, которые будут вызываться для нового интерфейса.
В некоторых языках нет возможности простого приведения, т.е. второго способа, указателей: даже простое их присваивание друг другу идёт по ветке запроса QueryInterface. В некоторых - преимущественно используется второй способ, и для реализации первого предлагаются шаманские бубны той или иной степени удобства.