Интерфейсы наследники

Автор Мike, 28.04.05, 20:04:49

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

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

Мike

 Как перейти к дочерним интерфейсам(их методам, свойствам) от головного интерфейса?
Вот конкретный пример.
IKompasAPIObject --> IKompasDocument --> и т. д.
Вот кусок кода
Variant V = Variant::CreateObject("Kompas.Application.5");
Variant M;
V.OlePropertyGet("IKompasDocument ", M);

Пишет, что не находит такого имени интерфейса
Меня интресует реализация именно в C++Builder.

333

Правильно пишет.
Т.к. KompasObject и  IApplication это разные вещи
KompasObject - это Aвтоматизация  а IApplication это API 7
И зачем так сложно - через Variant-ы
Почему не писать на реальных интерфейсах:
IApplicationPtr kompasApp = (IDispatch*)CreateOleObject( "KOMPAS.Application.7" );
IKompasDocumentsPtr documents = kompasApp->Documents;
...

Kostas&Ko

Интерфейсы Компаса при использовании  COM технологи все они все вложенные. Поэтому чтобы использовать любой интерфейс его нужно создать и инициализировать. Кроме, того его нужно проверить, короче он возвращает указатель. Даю пример. Создать Архимедову спираль. Я сегодня очень добрый. Потому что День металлургов. ОАО "ММК им. Ильича" СЛАВА МЕТАЛЛУРГАМ !!!


#include
#include
#include "ldefin2d.h"
#include "Ks_TLB.h"
#include
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
KompasObject* Kompas_Obj = NULL; //компас объект
ksDocument2D* Blok_Graf = NULL;  //четеж
ksMathematic2D* math = NULL;   //математика


void Arh_spiral(const double & step,const double & n_ob,const double & r0,const double & rf );

extern "C" IDispatch* far __export WINAPI CreateKompasObject();

//новый тип - указатель на функцию
typedef void (*Param)(const double & ,const double &,const double & ,const double &);

//динамическое перемещение объектов по экрану
void Drow_obj(Param ,const double & ,const double &,const double & ,const double &);



extern "C" char * far __export __pascal LibraryName()
{
  return  "Архимедова спираль";
}

extern "C" void far __export __pascal  LibraryEntry( UINT Comm )
{
 //установка, что символ разделения дробной части - точка
DecimalSeparator = ’.’;

  Kompas_Obj =(KompasObject*)::CreateKompasObject();
  if(Kompas_Obj)
  {

   Blok_Graf = (ksDocument2D*)Kompas_Obj->ActiveDocument2D();
   math=(ksMathematic2D*)Kompas_Obj->GetMathematic2D();



    if(Blok_Graf && math  )
    {
        //шаг витка
 double step=0;
 //число витков
 double  n_ob = 0;
 //начальный радиус
 double r0=0;
 //радиус сферы
 double  rf=0;

     Kompas_Obj->ksReadDouble(StringToOleStr("Шаг спирали"),100,-1000,1000,&step);
     Kompas_Obj->ksReadDouble(StringToOleStr("Число витков спирали"),5,0.1,1000,&n_ob);
     Kompas_Obj->ksReadDouble(StringToOleStr("Начальный радиус"),10,-10000,10000,&r0);
   //  Kompas_Obj->ksReadDouble(StringToOleStr("Радиус сферы"),700,0,1000,&rf);

     Param Pointer_F;//указатель на функцию
     Pointer_F = Arh_spiral;

     Drow_obj(Pointer_F ,step,n_ob,r0,0);
    }
  }
}





//сприраль  Архимеда

void Arh_spiral(const double & step,const double & n_ob,const double & r0,const double & rf )
{

 bool flag=true;
 //дискретности
 double  ang_s,ang_nnn,   ang_step=0.5;

 //промежуточные переменные
 double x1,x2,y1,y2,z1,z2,r,r1;


 ang_nnn=360.0*r0/step;
 ang_s=ang_nnn;
 x1= r0*math->ksCosD(ang_nnn);
 y1= r0*math->ksSinD(ang_nnn);
 r1=x1;


 double ang_all ;

 ang_all = 360.0* n_ob+ang_nnn;




 ang_s+=ang_step;
   while(flag)
   {

      if(ang_s >= ang_all)
     {
     ang_s=ang_all;
     flag= false;
     }
     r= step*ang_s/360.0;
     x2= r*math->ksCosD(ang_s);
     y2= r*math->ksSinD(ang_s);
     Blok_Graf->ksLineSeg(x1,y1,x2,y2,1);
     x1=x2; y1=y2; z1=z2; r1=r;
     ang_s+=ang_step;
    // ang_step*=0.9999;
     }




}
//=============================================================================
//динамическое перемещение объектов по экрану
//в функцию передаеться указатель на функцию
void Drow_obj(Param FDrow, const double & step,
const double & n_ob,const double & r0,const double & rf )
 {



    int j = 1;

   ksPhantom* phan( (ksPhantom*)Kompas_Obj->GetParamStruct(ko_Phantom) );
   if ( phan )
        {
      phan->Init();
      phan->phantom = 1;
      ksType1* t1( (ksType1*)phan->GetPhantomParam() );
      if ( t1 )
                 {
         t1->Init();
         t1->scale_ = 1;
         t1->gr = 0;   // временная группа

         double x, y, ang;
                ksRequestInfo* info( (ksRequestInfo*)Kompas_Obj->GetParamStruct(ko_RequestInfo) );
               if ( info )
                        {
                info->Init();
           while ( j )
                          {
                             if ( t1->gr )Blok_Graf->ksDeleteOb

Kostas&Ko

ЦитироватьИнтерфейсы Компаса при использовании  COM технологи все они все вложенные. Поэтому чтобы использовать любой интерфейс его нужно создать и инициализировать. Кроме, того его нужно проверить, короче он возвращает указатель. Даю пример. Создать Архимедову спираль. Я сегодня очень добрый. Потому что День металлургов. ОАО "ММК им. Ильича" СЛАВА МЕТАЛЛУРГАМ !!!


#include
#include
#include "ldefin2d.h"
#include "Ks_TLB.h"
#include
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
KompasObject* Kompas_Obj = NULL; //компас объект
ksDocument2D* Blok_Graf = NULL;  //четеж
ksMathematic2D* math = NULL;   //математика


void Arh_spiral(const double & step,const double & n_ob,const double & r0,const double & rf );

extern "C" IDispatch* far __export WINAPI CreateKompasObject();

//новый тип - указатель на функцию
typedef void (*Param)(const double & ,const double &,const double & ,const double &);

//динамическое перемещение объектов по экрану
void Drow_obj(Param ,const double & ,const double &,const double & ,const double &);



extern "C" char * far __export __pascal LibraryName()
{
  return  "Архимедова спираль";
}

extern "C" void far __export __pascal  LibraryEntry( UINT Comm )
{
 //установка, что символ разделения дробной части - точка
DecimalSeparator = '.';

  Kompas_Obj =(KompasObject*)::CreateKompasObject();
  if(Kompas_Obj)
  {

   Blok_Graf = (ksDocument2D*)Kompas_Obj->ActiveDocument2D();
   math=(ksMathematic2D*)Kompas_Obj->GetMathematic2D();



    if(Blok_Graf && math  )
    {
        //шаг витка
 double step=0;
 //число витков
 double  n_ob = 0;
 //начальный радиус
 double r0=0;
 //радиус сферы
 double  rf=0;

     Kompas_Obj->ksReadDouble(StringToOleStr("Шаг спирали"),100,-1000,1000,&step);
     Kompas_Obj->ksReadDouble(StringToOleStr("Число витков спирали"),5,0.1,1000,&n_ob);
     Kompas_Obj->ksReadDouble(StringToOleStr("Начальный радиус"),10,-10000,10000,&r0);
   //  Kompas_Obj->ksReadDouble(StringToOleStr("Радиус сферы"),700,0,1000,&rf);

     Param Pointer_F;//указатель на функцию
     Pointer_F = Arh_spiral;

     Drow_obj(Pointer_F ,step,n_ob,r0,0);
    }
  }
}





//сприраль  Архимеда

void Arh_spiral(const double & step,const double & n_ob,const double & r0,const double & rf )
{

 bool flag=true;
 //дискретности
 double  ang_s,ang_nnn,   ang_step=0.5;

 //промежуточные переменные
 double x1,x2,y1,y2,z1,z2,r,r1;


 ang_nnn=360.0*r0/step;
 ang_s=ang_nnn;
 x1= r0*math->ksCosD(ang_nnn);
 y1= r0*math->ksSinD(ang_nnn);
 r1=x1;


 double ang_all ;

 ang_all = 360.0* n_ob+ang_nnn;




 ang_s+=ang_step;
   while(flag)
   {

      if(ang_s >= ang_all)
     {
     ang_s=ang_all;
     flag= false;
     }
     r= step*ang_s/360.0;
     x2= r*math->ksCosD(ang_s);
     y2= r*math->ksSinD(ang_s);
     Blok_Graf->ksLineSeg(x1,y1,x2,y2,1);
     x1=x2; y1=y2; z1=z2; r1=r;
     ang_s+=ang_step;
    // ang_step*=0.9999;
     }




}
//=============================================================================
//динамическое перемещение объектов по экрану
//в функцию передаеться указатель на функцию
void Drow_obj(Param FDrow, const double & step,
const double & n_ob,const double & r0,const double & rf )
 {



    int j = 1;

   ksPhantom* phan( (ksPhantom*)Kompas_Obj->GetParamStruct(ko_Phantom) );
   if ( phan )
        {
      phan->Init();
      phan->phantom = 1;
      ksType1* t1( (ksType1*)phan->GetPhantomParam() );
      if ( t1 )
                 {
         t1->Init();
         t1->scale_ = 1;
         t1->gr = 0;   // временная группа

         double x, y, ang;
                ksRequestInfo* info( (ksRequestInfo*)Kompas_Obj->GetParamStruct(ko_RequestInfo) );
               if ( info )
                        {
                info->Init();
           while ( j )
                          {
                             if ( t1->gr )Blok_Graf->ksDeleteObj( t1->gr