我想从Visio外接程序将IVApplication的Interface Ref发送到我的另一个COM服务器。但我有Ole例外。现在我这样做:
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;
答案 0 :(得分:0)
为什么不在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;