试写的源码如下(不完整): 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.
我自己写了一个测试用的VCL控件,VCL里面包含了一个TADODATASET类型的公有变里还有一个MSXML2的接口其中有IXMLDOCUMENT2,IXMLELEMENT2接口类型和其它一些属性都是STRING类型一个公有的方法LOADXMLFILE(STR:STRING)接收一个文件路径生成IXMLDOCUMENT和IXMLELEMENT2.结果程序运行到LOADXMLFILE时报以上错误.
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.
"提供者的错误"?????我不能明白你的意思,能不能讲清楚一点.先谢过.
如果是对象接口返回错误,可能delphi并不知道原始错误码
转换时就会发生这样类似错误
我看看你的代码再说
如果你用的系统是WIN2K的话,到DELPHI中在PROJECT菜单选中IMPORT TYPE LIBRARY,然后会出来一堆列表找到MICROSOFT XML的合适版本选个合适的输出目录确定即可然后在工程中可以把导出的TLB文件加进来.
internet 里面有tXMLDocument
为什么还要重新加载ole库
microsoft xml里面也没有IXMLElement;
在DELHI5.0里面想把一个xml文件里的记录放到二维表里,只是一层的程序不用web application,而且xml的文档元素是自己定义的.此种情况下txmlbroker怎么用.