API7 & C++ Builder 10.1 & WIN32 (Automation)

Автор archiopus, 22.02.17, 08:59:49

« предыдущая - следующая »

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

archiopus

Подскажите, совсем запутался, API5 работает без проблем и компилируется все без проблем, а при вызове функции ksGetApplication7 выходит ошибка: "Exception class $C0000005 with message 'access violation at 0x759104de: read of address 0x6a2efaf7'." может я что делаю не так и есть другие варианты. Вот фрагмент кода:

#include <vcl.h>
#pragma hdrstop
#include <ComObj.hpp>
#include <utilcls.h>
#include <systobj.h>
#include <ksAPI7.cpp>
#include <ksConstants.h>
#include <ldefin2d.h>
#include <ksConstants.h>

//skip skip skip skip skip skip skip skip skip skip skip

void __fastcall TForm1::Button3Click(TObject *Sender)
{

KompasObjectPtr Kompas5;
IApplicationPtr Kompas7;

if ( !Kompas5) Kompas5.ActiveInstance( L"KOMPAS.Application.5" );
if ( !Kompas5 ) Kompas5.CreateInstance( L"KOMPAS.Application.5" );
if ( Kompas5 ){
  Kompas5->Visible = true;           // Показать диалог Компаса

                    Kompas5->ksGetApplication7();                      //вот так НЕТ exseption и команда проходит. (1й вариант вызова)
  Kompas7 =  Kompas5->ksGetApplication7();                      //а вот так exseption (2й вариант вызова)
  Kompas7 = GetActiveOleObject(L"KOMPAS.Application.7") //и так exseption (3й вариант вызова)
}
}


Вообще, потребовалась API7 только для испрользования функции ISpecificationDescription.
Если подскажите как получить имя файла спецификации, подключенной к графическому документу используя API5 буду очень благодарен.

Sabahs

Правильно вываливается, т.к. ksGetApplication7 возвращает интерфейс IDispatch и его нужно привести к IApplication.
На Delphi это выглядит так - KompasApi7:=Kompas.ksGetApplication7 as IApplication;

archiopus

Пробовал приводить, компилируется, но теперь Exception выходит и на первом варианте (даже без присваивания к переменной).
Может я, что в заголовке забыл объявить?

(IApplicationPtr) Kompas5->ksGetApplication7(); // (вариант 1)

Kompas7 = (IApplicationPtr) Kompas5->ksGetApplication7(); // (вариант 2)

Дмитрий22

А так не пробовали:

IApplicationPtr iKompasApp;

iKompasApp =  IDispatchPtr(::CreateKompasApplication(), false ) ;

IKompasDocument2DPtr pKompasDocument = (IKompasDocument2DPtr)iKompasApp->ActiveDocument;

Сделаем Компас лучше!

archiopus

Попробовал использовать и CreateKompasApplication компилируется но также вываливется с ошибкой.
Собственно если по шагам то получается так, что при присвоении IDispatchPtr->IApplicationPtr возникает exception:

IApplicationPtr iKompasApp;
IDispatchPtr iDispatch;

iDispatch = IDispatchPtr(Kompas5->ksGetApplication7(),false/*AddRef*/); //переменная iDispatch присваивается и команда проходит нормально;

iKompasApp = IApplicationPtr(iDispatch); //А тут возникает exception;
iKompasApp = (IApplicationPtr) iDispatch; //или так тоже возникает exception;

Не пойму как правильно приводить эти два типа.

Дмитрий22

В прицепе пример библиотеки с API7 для C++ Builder.
Правда под 64 bit. Для 32 поменяйте целевую платформу на 32.
Закомментируйте код
#pragma comment(lib, "kAPI5bc")
#pragma comment(lib, "kAPI7bc")
и добавьте в проект библиотеки kAPI7BC.lib и kAPI5BC.lib. В настройках проекта укажите пути к папке Компаса.
Все компилируется и и не вываливается никуда.
Мой Вам совет - переходите на программно безопасный код в C#,
Удачи!
Сделаем Компас лучше!