На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Трудности в работе с TRemotable , Как воссоздать сложный составной класс TRemotable и выгрузить его в SO
    Итак есть сгенерированный по WSDL + XSD модуль с сложными типами. Все эти типы конечном итоге сливаются в некий тип назовем его TMetaType = class(TRemotable).

    Также есть интерфейс к SOAP сервису который необходимо вызывать
    ExpandedWrap disabled
        infSomeInterface = interface(IInvokable)
        ['{6945B78E-6D86-40EC-8C1F-147D6E2F1EC8}']
          procedure opSomeNotification(const data: TMetaType); stdcall;
        end;


    В общем нужно вызвать эту процедуру используя HTTPRIO на внешнем сервисе и подсунуть ему TMetaType.

    Проблема в том что этот TMetaType довольно сложный и создавать его вручную довольно трудоемкое дело.
    А автоматически он не инициализирует свои данные.

    Может кто знает какой трюк как быстро проинициализировать сложный объект при создании?

    Заранее спасибы...

    P.S. Дельфи 7, такова последняя воля заказчика....
      Уважаемые модераторы, вам конечно виднее...но по моему данная ситуация имеет очень далекое отношение к ActiveX/COM. Ведь интерфейсы можно использовать с обычными класами.
      Тут скорее сетевое програмирование тогда уж. Больше всего тут SOAP/XSD/WSDL.
        Сам додумался...

        Примерно вот так.... хотя на 100% точность исполнения не претендую - кто знает лучше метод - подскажите

        ExpandedWrap disabled
          function TCustomSOAPServiceProvider.createObject(v:TRemotableClass): TRemotable;
          var obj:TRemotable;
           
           procedure _classSpider(p:TObject);
           var
            c,i:integer;
            lst:PPropList;
            data:PTypeData;
            pobj:TRemotable;
           begin
            c:=typInfo.GetPropList(p.ClassInfo,tkAny,nil);
            GetMem(lst,c*SizeOf(PPropInfo));
            try
             GetPropList(p.ClassInfo,tkAny,lst);
             for i:=0 to c-1 do
              begin
               if lst^[i]^.PropType^.Kind=tkClass then
                begin
                 data:=GetTypeData(lst^[i]^.PropType^);
                 if Assigned(data) then
                  begin
                   pobj:=TRemotableClass(data^.ClassType).Create;
                   if Assigned(pobj) then
                    begin
                     //MessageBox(0,Pchar(string(pobj.ClassName)),nil,0);
                     _classSpider(pobj);
                     SetObjectProp(p,lst^[i],pobj,true);
                    end;
                  end;
                end;
              end;
            finally
             FreeMem(lst,c*SizeOf(PPropInfo));
            end;
           end;
           
          begin
           Result:=nil;
           if not Assigned(v) then Exit;
           
           obj:=v.Create;
           _classSpider(obj);
           Result:=obj;
          end;
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0206 ]   [ 15 queries used ]   [ Generated: 18.05.24, 15:33 GMT ]