Как получить список открытых файлов?

Автор Простой_инженер, 14.05.21, 11:56:04

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Простой_инженер

Делаю все как написано в хелпе 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)". Якобы я пытаюсь обратиться к объекту, которого не существует. Как решить данную проблему?

Простой_инженер

Неужели никто не знает как решить подобную проблему? Я в шоке...


Простой_инженер

Спасибо большое!

Оказывается у меня было две ошибки:

1) Documents:=app7.Documents; - правильно  Documents:=IDocuments(app7.Documents); - неправильно

2) Здесь я в недоумении. я до сегодняшнего дня был уверен, что запись:

app7:=kompas.ksGetApplication7 as IApplication;
и
app7:=IApplication(kompas.ksGetApplication7);

имеют один и тот же смысл. Однако, при использовании второго варианта, программа вылетает.

Vi2

Цитироватьapp7:=kompas.ksGetApplication7 as IApplication VS app7:=IApplication(kompas.ksGetApplication7)
Я не спец по Делфи, но эти операторы имеют совершенно разный смысл. Если рассматривать "kompas.ksGetApplication7" как некий указатель на интерфейс или объект, то первый оператор преобразует его в другой указатель на другой интерфейс того же объекта через функцию QueryInterface, что является безопасным способом приведения указателей на интерфейсы в модели СОМ, а второй - просто меняет его тип, но не меняет его значение, что может привести к небезопасной подмене одного интерфейса другим, в котором просто не быть тех функций, которые будут вызываться для нового интерфейса.

В некоторых языках нет возможности простого приведения, т.е. второго способа, указателей: даже простое их присваивание друг другу идёт по ветке запроса QueryInterface. В некоторых - преимущественно используется второй способ, и для реализации первого предлагаются шаманские бубны той или иной степени удобства.