Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.85.201] |
|
Сообщ.
#1
,
|
|
|
Итак есть сгенерированный по WSDL + XSD модуль с сложными типами. Все эти типы конечном итоге сливаются в некий тип назовем его TMetaType = class(TRemotable).
Также есть интерфейс к SOAP сервису который необходимо вызывать infSomeInterface = interface(IInvokable) ['{6945B78E-6D86-40EC-8C1F-147D6E2F1EC8}'] procedure opSomeNotification(const data: TMetaType); stdcall; end; В общем нужно вызвать эту процедуру используя HTTPRIO на внешнем сервисе и подсунуть ему TMetaType. Проблема в том что этот TMetaType довольно сложный и создавать его вручную довольно трудоемкое дело. А автоматически он не инициализирует свои данные. Может кто знает какой трюк как быстро проинициализировать сложный объект при создании? Заранее спасибы... P.S. Дельфи 7, такова последняя воля заказчика.... |
Сообщ.
#2
,
|
|
|
Уважаемые модераторы, вам конечно виднее...но по моему данная ситуация имеет очень далекое отношение к ActiveX/COM. Ведь интерфейсы можно использовать с обычными класами.
Тут скорее сетевое програмирование тогда уж. Больше всего тут SOAP/XSD/WSDL. |
Сообщ.
#3
,
|
|
|
Сам додумался...
Примерно вот так.... хотя на 100% точность исполнения не претендую - кто знает лучше метод - подскажите 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; |