Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Импортирование COM type library  (Прочитано 11136 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 19-04-2007 14:10 » 

Использую BC6. Уже почитал о его кривизне в этом деле, но все же пытаюсь исправить исходники, которые он нагенерил (всего порядка 7.5МБ текста).
Импортнул библиотеки типов, нашел несколько сотен несуразностей и исправил их. Теперь следующий шаг, но я уже не понимаю, что тут сделать.

Ошибка:
Код:
E2015 Ambiguity between 'TComInterface<IUnknown,&IID_IUnknown>::TComInterface(IUnknown *,bool)' and 'TComInterface<IUnknown,&IID_IUnknown>::TComInterface(IUnknown *)'

Ошибку вызвало:
Код: (C++)
  IUnknownPtr __fastcall NewEnum(void)
  {
    return GetDefaultInterface()->NewEnum();
  }

Определение метода:
Код: (C++)
  virtual HRESULT STDMETHODCALLTYPE NewEnum(IUnknown** Param1/*[out,retval]*/) = 0; // [-4]

Кто-нибудь может помочь моим расплавленным мозгам выкристализоваться в правильном направлении?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 19-04-2007 14:58 » 

Навскидку я бы сказал что у тебя есть две ф-ции

TComInterface<IUnknown,&IID_IUnknown>::TComInterface(IUnknown *,bool)
и
TComInterface<IUnknown,&IID_IUnknown>::TComInterface(IUnknown *)

Если у первой определён стандартное значение второго параметра
то при вызове ф-ции только с первым параметром получается неувязочка.l)

Если что я ВС не знаю Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 19-04-2007 19:20 » 

Джон, возможно я плохо знаю тонкости C++, но две эти ф-ии (в твоем описании) параллельно существовать не могут, т.к. если у ф-ии с двумя параметрами второй будет иметь дефолтное значение, то это эквивалентно ее перегрузке, с образованием ф-ии с одним аргументом...

Как я понимаю, обе ф-ии определены в шаблоне TComInterface. Какое это имеет отношение к NewEnum() я не вижу и полагаю, что ошибка касаласьь GetDefaultInterface(). Или наоборот?
Бред какой то...  С ума сойти...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 19-04-2007 22:59 » 

Хмм я тоже всех тонкостей не знаю, но такие функции существовать очень даже могут. Именно как перегруженные. До поры до времени. Пока кто-нить не вызовет с одним параметром, тогда появляется именно такая ошибка как у тебя.

void F001(int *pn, bool b=true)
{
   if(b)
   {
      *pn = 1;
   }
   else
   {
      *pn=0;
   }
}

void F001(int *pn)
{
   *pn = 0;
}

...

   int n1 = 1;
   F001(&n1, true);  - всё зашибись работает
   F001(&n1);  - ошибка

Каким боком это относится к NewEnum()  я понятия не имею, это был просто анализ ошибки, которая говорит, что есть две перегруженные ф-ции с такими параметрами, что вполне допустимо. Поскольку выскакивает ошибка - единственное объяснение, которое я ей нахожу наличие стандартного значения у второго параметра.
Я не говорю, что это делается специально, такое может произойти случайно. Может поменяться область видимости например, ну или просто "не заметили", и добавили вторую ф-ю. Тем паче, что у тебя шаблоны, те когда до них дело дойдёт вобще не известно.

зы Я чего хотел сказать - ты бы проверил ф-ции, декларацию, вызов. На всякий случай. Ведь ошибка именно в двусмысленности этих ф-ций. Хотя ещё раз замечу, что с ВС опыта у меня практически 0, может он показывает ambiguity-ошибку в каких других случаях?
« Последнее редактирование: 19-04-2007 23:04 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 19-04-2007 23:15 » 

Что за ошибка у борланда E2015 я не знаю, но у МС это C2668

Compiler Error C2668
'function' : ambiguous call to overloaded function

The specified overloaded function call could not be resolved.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 20-04-2007 06:08 » 

Так и есть. Вот из документации:
Код:
// определение класса
template <class T, const IID *piid = &GUID_NULL> class TComInterface

-----

// список констукторов
TComInterface();
TComInterface(T* p, bool addRef = false);
TComInterface(IUnknown* p);
TComInterface(IDispatch* p);
TComInterface(TVariant var);
TComInterface(const TComInterface<T, piid>& src);
template <class ANOTHERINTF, const IID* ANOTHERIID> TComInterface(const TComInterface<ANOTHERINTF, ANOTHERIID>& src);

Т.е. видимо в качестве class T использовалось IUnknown.
« Последнее редактирование: 20-04-2007 06:11 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-04-2007 07:23 » 

У меня такой дурацкий вопрос: я взял и грубо поправил в заголовках:
Код: (C++)
  TComInterface(T* p, bool addRef/* = false*/)

Вот код класса с констукторами:
Код: (C++)
class TComInterface
{
public:
  TComInterface() : intf(0)
  {}

  // NOTE: The default behaviour of the constructor is to not AddRef the interface
  //       pointer parameter. This is appropriate if the interface was obtained
  //       has already been addRef'ed - as when retrieving a Font property.
  //

  TComInterface(T* p, bool addRef/* = false*/)
  {
    if (((intf = p) != 0) && addRef)
      intf->AddRef();
  }

  #if 0
  TComInterface(int /*ToAllowNull*/) : intf(0)
  {
    /* OLECHECK(ToAllowNull == 0); */
  }
  #endif

  TComInterface(IUnknown* p) : intf(0)
  {
    *this = p;
  }

  TComInterface(IDispatch* p) : intf(0)
  {
    *this = p;
  }

  TComInterface(TVariant var) : intf(0)
  {
    *this = var;
  }

  TComInterface(const TComInterface<T, piid>& src)
  {
    if ((intf = src.intf) != 0)
      intf->AddRef();
  }

  template <class ANOTHERINTF, const IID* ANOTHERIID>
  TComInterface(const TComInterface<ANOTHERINTF, ANOTHERIID>& src) : intf(0)
  {
    _ASSERTE_(/* Need have valid IID to invoke this */GetIID() != GUID_NULL);
    if (src)
    {
      OLECHECK(src->QueryInterface(GetIID(), (LPVOID*)(&intf)));
    }
  }

// ...............
}

Я прав или не прав?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 20-04-2007 10:19 » 

А так это у тебя конструкторы. Я как-то не сразу понял. Тогда и ошибку в NewEnum можно понять, если в ней создаётся объект такого типа.
Насчёт решения... Сложно сказать. Думаю так просто не отелаешься. Главное, что причина не ясна - упущение автора или что другое. Сделать так конечно можно. Только если где-то в программе существует вызов с стандартным параметром, теперь этого не будет происходить. Лучше всего просмотреть такие места и, если надо, однозначно определить второй параметр как false. После этого убрать его в декларации конструктора.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-04-2007 10:24 » 

Джон, дело на самом деле хуже, т.к. этот шаблон входит в стандартный набор Борланда - vcl/utilcls.h .
Пробная сборка прошла. Попробую собрать окончательно и сделать тесты на работоспособность.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 20-04-2007 10:30 » 

Уиии. Это уже больно. Ну попробуй. Я думаю компилиться будет. А вот насчёт функциональности...

просто идея - а не может быть так что там какие-нить ключи стоят (#ifdef) и просто надо определить нужную комбинацию в проекте? Я пару раз с таким сталкивался. Обычно такие вещи не программируются специально, ибо не имеет смысла - компилятор отловит такую ошибку. А вот случайность не исключена.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 24-04-2007 11:46 » 

В общем, вопрос решается так:

1. Берется Delphi (я взял 7-ю версию), создается package, импортируется библиотека типов и все сохраняется.
2. Берем Builder (BC6), создаем package, добавляем туда паскалевские файлы, созданные на первом шаге, собираем и инсталим. Заголовочные файлы (hpp) Builder создает сам.

Исходники получаются в двое короче, чем при импорте в BC.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 24-04-2007 12:01 » 

Я так думаю темка достойна ЧАВО. Наверняка ещё кто-нить наступит.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines