interface property implementation в C#
От: grani  
Дата: 08.07.16 09:36
Оценка:
День добрый
delphi help
Достался по наследству дельфийский объект
type
 TMTCMean = class(TAutoObject, ISDictionary,IOSMTClass) 
   public
     Procedure CreateInternalObj();
     procedure IOSMTClass.CreateInternalObjects= CreateInternalObj;
     property Dictionary: ISDictionary read FISDictionary implements ISDictionary;
end
Procedure TMTCMean.CreateInternalObj();
begin
  FISDictionary := CreateOLEObject.....
end;


Получение всего этого чуда под дельфи происходит следующим способом
var Dic:ISDictionary;
Var Mean:IOSMTClass;
  Mean:=IServer.CreateDictionary();
  Mean.CreateInternal();
  Dic := ISDictionary(Mean);



При портации кода в c# оказывается
что на момент создания объекта Runtime Callable Wrapper при вызове IServer.CreateDictionary поле Dictionary не инициализировано, и RCW не видит что объект имеет ISDictionary.
InvokeImplGetter при запросе интерфейса отвечает nil, поскольку нету еще интерфейса в тот момент.

                    dynamic IDClassr = SRVIntf.CreateVPAObjectViaMTID(FFields[cnum].RecType, out CLIid);
                    IOSMTClass IMCLass = (IOSMTClass)IDClassr;
                    IMCLass.Server = SRVIntf;
                    IMCLass.CreateInternalObjects();
                    iUnknownGuid = new Guid("46B8D262-A274-11D3-9B43-0090272D5A2F"); 
                    iuguid = new Guid ( "00000000-0000-0000-C000-000000000046" );
                    IntPtr rri,rro;
                    rro = Marshal.GetIUnknownForObject(IDClassr);
                    Marshal.QueryInterface(rro, ref iuguid, out rri);//
                    Marshal.QueryInterface(rri, ref iUnknownGuid, out rri);
                    IOSMTDataClass IDClass = (IOSMTDataClass)(ISDictionary)Marshal.GetObjectForIUnknown(rri);

Попытка прогнать через IUnknown не заставила RCW получить данный интерфейс, хотя после вызова IMCLass.CreateInternalObjects все поля заполнены.

Подскажите пожалуйста, как заставить RCW заново просканировать объект на наличие поддерживаемых интерфейсов?
Или как создать новый от старого инициализированного?
Re: interface property implementation в C#
От: grani  
Дата: 13.07.16 14:00
Оценка: +1
G>Подскажите пожалуйста, как заставить RCW заново просканировать объект на наличие поддерживаемых интерфейсов?
G>Или как создать новый от старого инициализированного?


Вопрос закрыт.
Прокси должен получать полностью инициализированный объект.
Проблема походу не RCW, а COM-Proxy в целом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.