with (w as IInterface) do
  begin  end;or
with IInterface(w) do
  begin  end;

解决方案 »

  1.   

    你的w是variant,跟IInterface不存在继承关系,当然不能用as
      

  2.   

    with IInterface(w) do
      begin  end;
      

  3.   

    procedure TMyImp.ShowHi(var hi: widestring);
    begin
      hi := 'hi,this is me';
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
     imp: TMyImp;
     w: variant;
     ss: IMyInterface;
    begin
      imp := TMyImp.Create;
      ss := imp;
      w := ss;
      with TObject(w) as IInterface do
      begin  end;
    end;end.
      

  4.   

    类型报错,是ss不能付给w.定义w:Olevariant;或许可以,我没有试!!
    或者,再w:=ss前,把W转换一下Iinterface(w).
      

  5.   

    to renzhm(戴尔飞):
      你提到的第一种方法和我用的方法其实是一样的。其结果编译器还是报错。第二种方法我试了,可以行得通。在此先致谢!
      只是有一个问题始终困扰着我:按照AS的语法定义当把一个interface reference放入一个variant变量以后可以用AS来动态地转换到原来的interface类型。为何在这里却不行?而且在Borland的帮助里有这么一个例子with MyConnection.AppServer as IMyAppServer do
      SpecialMethod(x,y);
    它可以用来获得early binding的效果。我的这个问题其实就是在写一个三层应用时碰到的。为了改善效率我希望能够进行early bind,但在我用上述方法后,编译报错,情况如出一辙。
      

  6.   

    to ihihonline(小小->不要再流浪!!) :
      在Dephi的帮助文档中有一段关于as的说明:
        Object as interface
      where Object is an expression of an interface or variant type or denotes an instance of a class that implements an interface.
      我想哪怕是要的类型在动态转换中不存在的,Delphi也只会抛出异常,而不会在编译时报错。
      或许是我领会错了也未可知。