单步调试程序,出现如下错误提示:
'variant does not reference an automation object'
什么意思?是哪里出错了?请哪位大侠指点一二!

解决方案 »

  1.   

    TO:STANELY
    我自己写了一个测试用的VCL控件,VCL里面包含了一个TADODATASET类型的公有变里还有一个MSXML2的接口其中有IXMLDOCUMENT2,IXMLELEMENT2接口类型和其它一些属性都是STRING类型一个公有的方法LOADXMLFILE(STR:STRING)接收一个文件路径生成IXMLDOCUMENT和IXMLELEMENT2.结果程序运行到LOADXMLFILE时报以上错误.
      

  2.   

    试写的源码如下(不完整):
    unit XMLDOC;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ADOdb,DB,MSXML2_TLB;
    type
      TDBType=(dbOracle,dbSQLServer,dbDBaseIII,dbAccess2k,dbTxtfile);
      TActive=(true,false);
      TXMLDOC = class(TComponent)
      private
        { Private declarations }
        //----------private data fields-----------------    FXMLrootelement:IXMLElement2;
        //FXMLinterface:IXMLDocument2;
        FXMLfile:string;
        FXMLfilepath:string;
        FXMLDocument: IXMLDocument2;
        FDBtype: TDBType;
        FXMLfilesize: string;
        FIXMLDocument: IXMLDocument2;
        FXMLcollumns: integer;
        FActive: TActive;
        FXMLrows: integer;    //------------property methode------------------
        procedure setxmldocument(const Value: IXMLDocument2);
        procedure setxmlfile(const Value: string);
        procedure setxmlrootelement(const Value: IXMLElement2);
        procedure setdbtype(const Value: TDBType);
        procedure setactive(const Value: TActive);
        function mapfieldtype(str:string):TFieldtype;
        procedure setxmlfilepath(const Value: string);
      protected
        { Protected declarations }
      public
        { Public declarations }
        FXMLdataset:TADODataset;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure loadxmlfile(filename:string);
        procedure inidataset;  published
        { Published declarations }
        //-------------------property-------------------
        property xmldocument: IXMLDocument2 read FIXMLDocument write setxmldocument;
        property xmlrootelement: IXMLElement2 read  FXMLrootelement write setxmlrootelement;
        property xmlfile: string read FXMLfile write setxmlfile;
        property xmlfilepath: string read FXMLfilepath write setxmlfilepath;
        property dbtype: TDBtype read FDBtype write setdbtype;
        property xmlfilesize:string read FXMLfilesize;
        property xmlcollumns:integer read FXMLcollumns;
        property xmlrows:integer read FXMLrows;
        property active:TActive read FActive write setactive;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TXMLDOC]);
    end;{ TXMLDOC }constructor TXMLDOC.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      //----add your code here ------
      FXMLdataset:=TADODataset.Create(self);
      FXMLdataset.Close;
      FXMLdocument:=CoXMLDocument.Create;end;destructor TXMLDOC.Destroy;
    begin
      //---- add your code here ------
      with  FXMLdataset do
      begin
        Close;
        Free;
      end;  FXMLdocument:=nil;  inherited;
    end;procedure TXMLDOC.inidataset;
    var
      fieldname:string;
      fieldtype:TFieldtype;
      fieldwidth:integer;
      required:boolean;
      temp:string;
      tempface:array of IXMLElement2;
      tmpface:IXMLElement2;
      i,j:integer;
    begin
      setlength(tempface,FXMLcollumns);
      for i:=0 to FXMLcollumns-1 do
      begin
        tempface[i]:=(FXMLrootelement.children.item(i,NULL)) as IXMLElement2;
        fieldname:=tempface[i].getAttribute('name').asstring;
        required:=tempface[i].getAttribute('required').asboolean;
        fieldwidth:=tempface[i].getAttribute('width').asinteger;
        temp:=tempface[i].getAttribute('datatype').asstring;
        fieldtype:=mapfieldtype(temp);
        FXMLdataset.FieldDefs.Add(fieldname,fieldtype,fieldwidth, required);
      end;  for j:=0 to FXMLrows-1 do
      begin
        for i:=0 to FXMLcollumns-1 do
        begin
           tmpface:=(tempface[i].children.item(j,NULL)) as IXMLElement2;
           FXMLdataset.append;
           FXMLdataset.fields[i].value:=tmpface.getAttribute('value');
        end;
      end;end;procedure TXMLDOC.loadxmlfile(filename: string);
    var
      tmpface:IXMLElement2;
      str:widestring;
    begin
       FXMLfile:=filename;
       FXMLdocument.Set_url(filename);
       FXMLdocument.Get_root(FXMLrootelement);
       FDBtype:=FXMLrootelement.getAttribute('dbtype').asstring;
       FXMLdocument.Get_fileSize(str);
       FXMLfilesize:=widechartostring(pwidechar(str));
       FXMLcollumns:=FXMLrootelement.children.Get_length;
       tmpface:=(FXMLrootelement.children.item(0,NULL)) as IXMLElement2;
       FXMLrows:=tmpface.children.Get_length;end;function TXMLDOC.mapfieldtype(str: string): TFieldtype;
    begin
      if uppercase(trim(str))='FTUNKNOWN' then
        result:=ftUnknown
      else if uppercase(trim(str))='FTSTRING' then
        result:=ftString
      else if uppercase(trim(str))='FTSMALLINT' then
        result:=ftSmallint
      else if uppercase(trim(str))='FTINTEGER' then
        result:=ftInteger
      else if uppercase(trim(str))='FTWORD' then
        result:=ftWord
      else if uppercase(trim(str))='FTBOOLEAN' then
        result:=ftBoolean
      else if uppercase(trim(str))='FTFLOAT' then
        result:=ftFloat
      else if uppercase(trim(str))='FTCURRENCY' then
        result:=ftCurrency
      else if uppercase(trim(str))='FTBCD' then
        result:=ftBCD
      else if uppercase(trim(str))='FTDATE' then
        result:=ftDate
      else if uppercase(trim(str))='FTTIME' then
        result:=ftTime
      else if uppercase(trim(str))='FTDATETIME' then
        result:=ftDateTime
      else if uppercase(trim(str))='FTBYTES' then
        result:=ftBytes
      else if uppercase(trim(str))='FTVARBYTES' then
        result:=ftVarBytes
      else if uppercase(trim(str))='FTAUTOINC' then
        result:=ftAutoInc
      else if uppercase(trim(str))='FTBLOB' then
        result:=ftBlob
      else if uppercase(trim(str))='FTMEMO' then
        result:=ftMemo
      else if uppercase(trim(str))='FTGRAPHIC' then
        result:=ftGraphic
      else if uppercase(trim(str))='FTFMTMEMO' then
        result:=ftFmtMemo
      else if uppercase(trim(str))='FTPARADOXOLE' then
        result:=ftParadoxOle
      else if uppercase(trim(str))='FTDBASEOLE' then
        result:=ftDBaseOle
      else if uppercase(trim(str))='FTTYPEDBINARY' then
        result:=ftTypedBinary
      else if uppercase(trim(str))='FTCURSOR' then
        result:=ftCursor
      else if uppercase(trim(str))='FTFIXEDCHAR' then
        result:=ftFixedChar
      else if uppercase(trim(str))='FTWIDESTRING' then
        result:=ftWideString
      else if uppercase(trim(str))='FTLARGEINT' then
        result:=ftLargeint
      else if uppercase(trim(str))='FTADT' then
        result:=ftADT
      else if uppercase(trim(str))='FTARRAY' then
        result:=ftArray
      else if uppercase(trim(str))='FTREFERENCE' then
        result:=ftReference
      else if uppercase(trim(str))='FTDATASET' then
        result:=ftDataSet
      else if uppercase(trim(str))='FTORABLOB' then
        result:=ftOraBlob
      else if uppercase(trim(str))='FTORACLOB' then
        result:=ftOraClob
      else if uppercase(trim(str))='FTVARIANT' then
        result:=ftVariant
      else if uppercase(trim(str))='FTINTERFACE' then
        result:=ftInterface
      else if uppercase(trim(str))='FTIDISPATCH' then
        result:=ftIDispatch
      else if uppercase(trim(str))='FTGUID' then
        result:=ftGuid
      else
        result:=ftString;end;procedure TXMLDOC.setactive(const Value: TActive);
    begin
      FActive := Value;
    end;procedure TXMLDOC.setdbtype(const Value: TDBtype);
    begin
      FDBtype := Value;
    end;procedure TXMLDOC.setxmldocument(const Value: IXMLDocument2);
    begin
      FIXMLDocument := Value;
    end;procedure TXMLDOC.setxmlfile(const Value: string);
    begin
      FXMLfile := Value;
    end;procedure TXMLDOC.setxmlfilepath(const Value: string);
    begin
      FXMLfilepath := Value;
    end;procedure TXMLDOC.setxmlrootelement(const Value: IXMLElement2);
    begin
      FXMLrootelement := Value;
    end;end.
      

  3.   

    to:befree
    "提供者的错误"?????我不能明白你的意思,能不能讲清楚一点.先谢过.
      

  4.   

    delphi封装的对象是automation object
    如果是对象接口返回错误,可能delphi并不知道原始错误码
    转换时就会发生这样类似错误
    我看看你的代码再说
      

  5.   

    to befree:
    如果你用的系统是WIN2K的话,到DELPHI中在PROJECT菜单选中IMPORT TYPE LIBRARY,然后会出来一堆列表找到MICROSOFT XML的合适版本选个合适的输出目录确定即可然后在工程中可以把导出的TLB文件加进来.
      

  6.   

    delphi的internetexpress里面有tXMLBroker和tInetXPageProducer
    internet 里面有tXMLDocument
    为什么还要重新加载ole库
    microsoft xml里面也没有IXMLElement;
      

  7.   

    to befree:
    在DELHI5.0里面想把一个xml文件里的记录放到二维表里,只是一层的程序不用web application,而且xml的文档元素是自己定义的.此种情况下txmlbroker怎么用.