Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > ERROR : Cannot emit RTTI for parameter 'list'


Автор: Fyrklod 25.7.2011, 00:42
Доброе время суток ребята!
столкнулся с проблемой которую не могу решить, нужна ваша помощь.

Создаю SOAP Service в котром описываю функцию, которая принимает параметр типа TMyXMLNodeList* 

Код

class TMyXMLNode
{
     private:
    WideString FNodeName;
    WideString FNodeValue;
     public:
          __property WideString NodeName = {read=FNodeName, write=FNodeName};
          __property WideString NodeValue = {read=FNodeValue, write=FNodeValue};

          __fastcall TMyXMLNode(WideString FNodeName, WideString FNodeValue)
          {
            this->FNodeName = FNodeName;
            this->FNodeValue = FNodeValue;
          }
};

typedef DynamicArray<TMyXMLNode *> ArrayNode;

class TMyXMLNodeList
{
     private:
      ArrayNode FList;
      int FCount;

      int __fastcall FindNode (WideString NodeName);
     public:
          __property int Count = {read=FCount};

     __fastcall TMyXMLNodeList(void) { FCount=0 ;}

          TMyXMLNode* __fastcall GetNode (int Index);
          void __fastcall SetNode (WideString NodeName, WideString NodeValue);
          void __fastcall SetNode (TMyXMLNode * node);
          void __fastcall Clear (void);
          void __fastcall Delete (int Index);
};



в простом приложении этот тип принялся и все хорошо отработало,  вот сервис даже не захотел создаваться (ошибка в моменте компиляции), сообщение 
[BCC32 Error] MySOAP.cpp(74): E2513 Cannot emit RTTI for parameter 'list' in function 'IMySOAP::echoDouble(TMyXMLNodeList *)'


так понимаю код всего моего сервиса надо?
Код


MySOAP.h

#include <System.hpp>
#include <InvokeRegistry.hpp>
#include <XSBuiltIns.hpp>
#include <Types.hpp>
#include "MyNodeCollection.h"
__interface INTERFACE_UUID("{F505DD4C-AE74-4222-9769-C56A1B22D5B8}") IMySOAP : public IInvokable
{
public:
    virtual double  echoDouble(TMyXMLNodeList* list) = 0;
};
typedef DelphiInterface<IMySOAP> _di_IMySOAP;



MySOAP.cpp
Код


#include <stdio.h>
#include <vcl.h>

#pragma hdrstop
#include "MySOAP.h"

class TMySOAPImpl : public TInvokableClass, public IMySOAP
{
public:
  double         echoDouble(TMyXMLNodeList* Value);

  HRESULT __stdcall QueryInterface(const GUID& IID, void **Obj)
                        { return GetInterface(IID, Obj) ? 0 : -1; }
  ULONG __stdcall AddRef() { return TInvokableClass::_AddRef();  }
  ULONG __stdcall Release() { return TInvokableClass::_Release();  }
};

double TMySOAPImpl::echoDouble(TMyXMLNodeList* dValue)
{
  return 5.1;   // Я СДЕЛАЛ ПРОСТО МЕТОД ЧТОБЫ ПОКАЗАТЬ
}


static void __fastcall MySOAPFactory(System::TObject* &obj)
{
  static _di_IMySOAP iInstance;
  static TMySOAPImpl *instance = 0;
  if (!instance)
  {
    instance = new TMySOAPImpl();
    instance->GetInterface(iInstance);
  }
  obj = instance;
}

static void RegTypes()
{
  InvRegistry()->RegisterInterface(__delphirtti(IMySOAP));
  InvRegistry()->RegisterInvokableClass(__classid(TMySOAPImpl), MySOAPFactory);
//  InvRegistry()->RegisterInvokableClass(__classid(TMyXMLNodeList), echoDouble);
}
#pragma startup RegTypes 32[/SRC]

Автор: artsb 25.7.2011, 07:57
Приведённый код из MySOAP.cpp урезан и теперь не понятно на какой строке возникает ошибка.

Автор: Fyrklod 25.7.2011, 09:59
в коде урезанны комментарии и несколько инклудов в остальном все на месте

ошибку кидает ниже 
Код

#pragma startup RegTypes 32


да и судя по ошибке, ему начинает не нравится уже сам интерфейс, но вот почему он тогда не на него показывает - ХЗ

Автор: artsb 25.7.2011, 12:07
Ясно. Вообще, list - это же STL'евский класс. Попробуйте переименовать свою переменную.
Цитата(Fyrklod @  25.7.2011,  09:59 Найти цитируемый пост)
но вот почему он тогда не на него показывает - ХЗ 

Для Билдера это нормально smile

Автор: Fyrklod 25.7.2011, 12:50
Цитата(artsb @  25.7.2011,  12:07 Найти цитируемый пост)
Ясно. Вообще, list - это же STL'евский класс. 


в данном случае LIST это параметр функции

Цитата(Fyrklod @  25.7.2011,  00:42 Найти цитируемый пост)
virtual double  echoDouble(TMyXMLNodeList* list) = 0;


Цитата(artsb @  25.7.2011,  12:07 Найти цитируемый пост)
Попробуйте переименовать свою переменную.

Да я уже и просто имя дела L
лажа та же 




Автор: xvr 28.7.2011, 10:08
Цитата(Fyrklod @  25.7.2011,  00:42 Найти цитируемый пост)
//  InvRegistry()->RegisterInvokableClass(__classid(TMyXMLNodeList), echoDouble);

Он у вас ругается на это (я надеюсь, что в коде это раскоментированно). 
__classid можно применять только к Delphi классам - унаследуйте ваш TMyXMLNodeList от TObject


Поправка: И в закоментаренном виде тоже может ругаться - у вас требуется RTTI от IMySOAP, а у него в интерфейсе функция, которая потребляет TMyXMLNodeList  параметром. Так что он (TMyXMLNodeList) тоже должен быть Delphi классом

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)