Маршаллинг интерфейса в Delphi
Я хочу отправить ссылку на интерфейс IVApplication из надстройки Visio на другой COM-сервер. Но у меня есть оле исключение. Теперь я делаю это:
Код в надстройке Visio:
var
IStrm: IStream;
hres: HResult;
rhglobal: HGLOBAL;
VisioAppl: IVApplication;
begin
hres := CreateStreamOnHGlobal(0, TRUE, IStrm);
if Succeeded(hres) then
hres := CoMarshalInterface(IStrm, IID_IVApplication, VisioAppl,
MSHCTX_LOCAL, 0,
MSHLFLAGS_NORMAL);
if (Succeeded(hres)) then
begin
hres := GetHGlobalFromStream(IStrm, rhglobal);
if Succeeded(hres) then
Result := rhglobal;
IStrm := nil;
end;
end;
После этого я создаю экземпляр моего COM-сервера и передаю ему rhglobal.
Код моего COM-сервера:
procedure (AHGlobal: HGlobal);
var
VisioAppl: Visio_TLB.IVApplication;
iStrm: IStream;
hres: HResult;
begin
iStrm := Nil;
VisioAppl:= nil;
hres := CreateStreamOnHGlobal(AHGlobal, FALSE, iStrm);
if (SUCCEEDED(hres)) then
begin
hres := CoUnmarshalInterface(iStrm, Visio_TLB.IVApplication, VisioAppl);
iStrm := nil;
ShowMessage('Result:' + BoolToStr(SUCCEEDED(hres))); <-- result 0
ShowMessage(VisioAppl.ProductName); <---- Error
end;
end;
1 ответ
Решение
Почему бы вам просто не определить метод на вашем COM-сервере и сделать параметр VARIANT? (или IDispatch* или IUknown*).
Затем вы можете просто передать приложение VisioApplication на свой COM-сервер и на стороне сервера отвести его обратно в интерфейс Visio_TLB.IVApplication.
Так это будет выглядеть так:
Добавить в:
procedure SendAppToComServer(aIntf: Visio_TLB.IVApplication);
begin
MyComServer.PassVisioApp(aIntf);
end;
COMSERVER:
procedure TMyComServer.PassVisioApp(VisioApp: OleVariant);
var
VisioAppIntf: Visio_TLB.IVApplication;
begin
VisioAppIntf := VisioApp;
ShowMessage(VisioAppIntf.ProductName);
end;