我是在我的程序里生成了一各特定的后缀文件,现在想把他和我的程序关联起来,希望打开该文件的时候自动启动我的程序来打开他!并且在我的打开的时候能够获得当前是打开得那各文件,这样我就可以在我得程序启动得过程中把打开得文件得数据读到我得程序里显示出来。
   其实就是象记事本or word一样,双击txt文件就用记事本打开,并且把文件的数据显示出来。 我的程序也就是要达到那个效果。
   要实现目前有2个疑问:1).关联该后缀的文件到我的程序里应该是在我的程序安装的时候实现吧!只要用install了我的程序,在注册表里就产生了关联,但现在本人不知道应该怎么关联。
   2).在我得程序没启动得时候,双击该文件就会启动我得程序,但我得程序怎么能够获的当前双击的是那个文件,这样我才能在我的程序里读相关文件的数据出来。
   
   好象要用shell来写那方面的东西,但我不知道具体用那些函数。请教各位了!!!

解决方案 »

  1.   

    1、自己写注册表,你自己看看注册表的HKEY_CLASSES_ROOT就知道了。
    2、install shield打包的时候就可以建立文件关联。
      

  2.   

    写注册表就是了
    Google上可以找到你的答案
    DelphiBox也有的
      

  3.   

    写注册表就完了,简单示例:
    不过你的程序记得要支持参数
    //sFileExt:文件后缀,如:'.readme'
    //sFileType:文件后缀对应说明,如:'readme.files'
    procedure RegFiles(sFileExt,sFileType: String);
    var
      Reg: TRegistry;
    begin
      Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_CLASSES_ROOT;
        Reg.OpenKey(sFileExt, True);
        Reg.WriteString('', sFileType);
        Reg.CloseKey;
        Reg.OpenKey(sFileType, True);
        Reg.WriteString('', '说明文件');//说明
        Reg.CloseKey;
        Reg.OpenKey(sFileType + '\DefaultIcon', True);//显示图标
        Reg.WriteString('', Application.ExeName + ',1');
        Reg.CloseKey;
        Reg.OpenKey(sFileType + '\Shell\Open', True);//打开操作
        Reg.WriteString('', '&Open');
        Reg.CloseKey;
        Reg.OpenKey(sFileType + '\Shell\Open\Command', True);//打开文件命令
        Reg.WriteString('', '"' + Application.ExeName + '" "%1"');
        Reg.CloseKey;
        SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);//刷新一下系统
      finally
        Reg.Free;
      end;
    end;//删除关联,sKey:把前面设定的文件后缀和文件后缀对应说明都删掉
    procedure TfrmMain.DelRegFile(sKey : String);
    var
      Reg: TRegistry;
    begin
      Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_CLASSES_ROOT;
        Reg.DeleteKey(sKey);
      finally
        Reg.Free;
      end;
    end;
      

  4.   

    To exu(大脸猫):
      你好!谢谢了!用install shield打包的时候怎么建立文件关联?
      我现在就是这个问题就捆扰了,因为我想卸载我的程序后相关的关联就删除了。
      

  5.   

    现在我用installshield的主要问题就是我要安装得程序的路径是有用户选择的,也就是说路径在installshield里只是个变量。
    我现在这个用户选择的安装程序的动态路径应该怎么写到注册表里去?
    在installshield里用代码应该这么写呢?
    谢谢了!
      

  6.   

    俺写的专用来注册文件关联的单元,只要设置好TRegFileType.Ext为你要设置文件关联的扩展名,然后调用SetFileType即可,要例子的话给我邮箱地址,我寄给你。unit UntRegFileType;interfaceuses Registry,Windows, SysUtils, Forms,shlobj;type
      TRegFileType=class
      public
        ICONFileName:String;
        Command:String;
        Ext:String;
        TypeInf:String;
        ICONIndex:Integer;
        CommandName:String;
        AutoChangeNotify:Boolean;
        DefaultCommand:Boolean;
        procedure ChangeNotify;
        function SetFileType:Boolean;
        function RemoveFileType(RemoveAll:Boolean):Boolean;
        constructor Create;
      end;
    implementation{ RegFileType }procedure TRegFileType.ChangeNotify;
    begin
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
    end;constructor TRegFileType.Create;
    begin
      CommandName:='Open';
      Command:='"'+Application.ExeName+'" "%1"';
      ICONFileName:=Application.ExeName;
      ICONIndex:=0;
      AutoChangeNotify:=true;
      DefaultCommand:=false;
    end;function TRegFileType.RemoveFileType(RemoveAll:Boolean): Boolean;
    var reg:TRegistry; str,str2,AExt:String;
        label eexit;
    begin
      if (Ext='') or ((CommandName='') and (RemoveAll=false)) then
      begin
        result:=false;
        exit;
      end;
      reg:=TRegistry.Create;
    try
      reg.RootKey:=HKEY_CLASSES_ROOT;
      AExt:=Ext;
      if AExt[1]='.' then
        Delete(AExt,1,1);
      if AExt='*' then
      begin
        str:='\*\Shell\'+CommandName;
        reg.DeleteKey(str);
        if AutoChangeNotify then
          ChangeNotify;
        exit;
      end;
      str:='\.'+AExt;
      if reg.KeyExists(str)=false then
        goto eexit;
      reg.OpenKey(str,false);
      str2:=reg.ReadString('');
      reg.CloseKey;
      if RemoveAll then
        reg.DeleteKey(str);
      if str2='' then
        goto eexit;
      str:='\'+str2;
      if reg.KeyExists(str)=false then
        goto eexit;
      if RemoveAll=true then
      begin
        reg.DeleteKey(str);
        goto eexit;
      end;
      str:=str+'\Shell\'+CommandName;
      reg.DeleteKey(str);
    eexit:
      reg.Free;
      result:=true;
      if AutoChangeNotify then
        ChangeNotify;
    except
      reg.Free;
      result:=false;
    end;
    end;function TRegFileType.SetFileType: Boolean;
    var reg:TRegistry; str,AExt:String;
    begin
      if (Ext='') or (CommandName='') then
      begin
        result:=false;
        exit;
      end;
      reg:=TRegistry.Create;
    try  reg.RootKey:=HKEY_CLASSES_ROOT;
      AExt:=Ext;
      if AExt[1]='.' then
        Delete(AExt,1,1);
      if AExt='*' then
      begin
        str:= '\*\Shell\'+CommandName;
        reg.CreateKey(str);
        str:=str+'\command';
        reg.OpenKey(str,True);
        reg.WriteString('',Command);
        reg.CloseKey;
        if AutoChangeNotify then
          ChangeNotify;
        exit;
      end;
      str:='\.'+AExt;
      reg.OpenKey(str,true);
      str:=AExt+'file';
      reg.WriteString('',str);
      reg.CloseKey;
      str:='\'+AExt+'file';
      reg.OpenKey(str,true);
      reg.WriteString('',TypeInf);
      reg.CloseKey;
      str:='\'+AExt+'file\DefaultIcon';
      reg.OpenKey(str,true);
      str:=ICONFileName+' ,'+IntToStr(ICONIndex);
      reg.WriteString('',str);
      reg.CloseKey;
      str:='\'+AExt+'file\shell';
      reg.CreateKey(str);
      if DefaultCommand then
      begin
        reg.OpenKey(str,true);
        reg.WriteString('',CommandName);
      end;
      str:=str+'\'+CommandName;
      reg.CreateKey(str);
      str:=str+'\command';
      reg.OpenKey(str,true);
      str:=Command;
      reg.WriteString('',str);
      reg.CloseKey;
      reg.Free;
      if AutoChangeNotify then
        ChangeNotify;
      result:=true;
    except
      reg.Free;
      result:=false;
    end;
    end;end.
      

  7.   

    to CareYouOnly(只在乎你):
      谢谢了!我的E_Mail是:[email protected]
      希望以后能多多联系,学习交流!