UDL的关联程序是OLE DB CORE SERVICE,所以双击会弹出DATA LINK PROPERTIES对话框,但如果你反点,选打开方式为NOTEPAD,则可以直接查看里面的内容!我在程序中使用TSTRINGLIST对象和TEXTFILE类型变量读取的UDL文件内容都是乱码,为什么,怎么解决?

解决方案 »

  1.   


    uses oledb,comobj,activex;
    {$R *.dfm}
    \\可以类似下面这样来读写。procedure TForm1.Button1Click(Sender: TObject);
    var
      DataInit:IDataInitialize;
      fname:POleStr;
      s:POleStr;
    begin
      fname:='d:\test.udl';
    //  s:='xxxx';  DataInit:=CreateComObject(CLSID_DataLinks)as IDataInitialize;
    //  DataInit.WriteStringToStorage(fname,s,CREATE_NEW);
      DataInit.LoadStringFromStorage(fname,s);
      ShowMessage(s);
      DataInit:=nil;end;
      

  2.   

    我这样写地,unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TMyStringList = class(TStringList)
      protected
        procedure SetTextStr(const Value: string); override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s: TStringList;
    begin
      s := TMyStringList.Create;
      s.LoadFromFile('E:\DBDEMOS.udl');
      Memo1.Lines.Assign(s); 
      s.Free;
    end;{ TMyStringList }procedure TMyStringList.SetTextStr(const Value: string);
    var
      P: PChar;
      PEnd: PChar;
      S: string;
    begin
      BeginUpdate;
      try
        Clear;
        P := Pointer(Value);
        PEnd := Pointer(PChar(Value) + Length(Value));
        if P <> nil then
          while P <= PEnd do
          begin
            S := '';
            while not (P^ in [#10, #13]) and (P <= PEnd) do
            begin
              if (P^ <> #0) and (P^ > #0) and (P^ <= #127) then
                S := S + P^;
              Inc(P);
            end;
            if S <> '' then  Add(S);
            if P^ = #13 then Inc(P);
            if P^ = #10 then Inc(P);
          end;
      finally
        EndUpdate;
      end;
    end;end.
      

  3.   

    To HalfDream
      你好,你的方法我看到和PromptDataSource很相似,谢谢,我已经验证可以了,谢谢!  具体内容我在研究研究,顺便你可以帮我解释一下你的代码的具体含义吗?
      

  4.   

    IDataInitialize它只是OLEDB提供的一个接口,
    通过它可以创建读写数据库连接的初始信息到指定的UDL文件。  DataInit:=CreateComObject(CLSID_DataLinks)as IDataInitialize;//创建接口。
      DataInit.LoadStringFromStorage(fname,s);//从文件中取出数据到串S中。。
      ShowMessage(s); //显示取出的连接串,
      DataInit:=nil;//释放
      

  5.   

    procedure SetConnectionStr;
    var
      DataInit:IDataInitialize;
      FName,ConnectionStr:POleStr;
      Reg:TRegistry;
    begin
      Reg:=TRegistry.Create ;
      with Reg do
      begin
        RootKey:=HKEY_LOCAL_MACHINE;
        OpenKey('SOFTWARE\HD\MAS',False);
        FName:=POleStr(ReadString('InstDir')+'\MAS_DB_INI.UDL');
        //★上面这个如果我写成FName:=ReadString('InstDir')+'\MAS_DB_INI.UDL'则报告一
        //个编译错误,但如果我按照上面的方法写,则最后写到注册表中的串是个空的,说明
        //根本没有找到我指定读取串的文件!怎么解决?
        DataInit:=CreateComObject(CLSID_DataLinks) as IDataInitialize;
        DataInit.LoadStringFromStorage(FName,ConnectionStr);
        WriteString('ConnectionStr',ConnectionStr);
        CloseKey;
        Free;
        DataInit:=Nil;
      end;
    end;
      

  6.   

    procedure SetConnectionStr;
    var
      DataInit:IDataInitialize;
      FName,ConnectionStr:POleStr;
      Reg:TRegistry;
      tmp:widestring;
    begin
    ............
      tmp:=ReadString('InstDir')+'\MAS_DB_INI.UDL';
        FName:=POleStr(tmp);
    //因为POLESTR实际上是PWideChar指针。
    //不能强制指向STRING类型,要先把STRING转为WIDESTRING,