День добрый
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 заново просканировать объект на наличие поддерживаемых интерфейсов?
Или как создать новый от старого инициализированного?