双击打开有问题?

  关于文件的双击打开,软件本来好像已经做过了,但是好像一直以来都没有起到很好的作用。文件关联一定是做了,因为双击能打开软件,而打开了软件并没有打开对应的文件。而且在软件安装后只能重启之后才能使关联的文件才能有对应的图标,当然这样看似破烂的工作又安排到了我的身上了。
    经过一番研究什么时候不能打开文件呢?一般是有空格的的情况,最后发现时一个dll出的问题,所以把dll中的程序调整了以后就没什么问题了。当然我自己调试的时候是通过修改文件的默认打开项来实现文件关联的,因为用的不是安装文件,只是自己的调试程序。本来觉得已经完事了,没想到等同事把安装文件做好后还是有问题,问题同样的出现。所以自己不得不自己也安装了一份程序来试验,把自己的调试exe覆盖掉软件中的exe来通过showmessage不断调试show出来自己想要的结果。同事一直认为我的ParamStr(1)得到的路径是错误的。
    我明明觉得好好的为什么是错误的呢?经过调试得出来的路径果然是出乎意料的,因为桌面上得到的文件的路径类似于“C:\Docume~1\Admini~1\...”这样的路径,由于自己对文件系统的一些了解很明显的知道这得到的是文件的短文件形式,当然这样也可以直接打开文件,但是软件中有一些分析路径的过程是按照预想长文件名格式来的,所以会失败。然而如果是在文件路径中没有空格的路径中得到的就是长文件名的形式的,并能正确打开。
    这样倒是也有办法就是通过GetLongPathName把短文件名转换成长文件名,但是觉得这样很蹩脚。难道真的是必须这样吗?那操作系统也太有问题了吧!所以不如自己试验了一下文件关联,在网上找了段代码,自己修改了一下:

//   注册文件关联
//   ExeName:   要检测的扩展名(例如:   .txt)   
//   AppName:   要关联的应用程序名(例如:   C:\StarTask\StarTask.exe)
//   AppKey:   ExeName扩展名在注册表中的键值(例如:   txtfile)   
//   Icon:   扩展名为ExeName的图标文件(例如:   C:\StarTask\Task.ico)   
//   Describe:   文件类型描述

RegisterFileRelation(ExtName, AppName,AppKey,Icon, Describe:string):boolean;
var
    Reg : TRegistry;
begin
    try
        Reg := TRegistry.Create;
        Reg.RootKey := HKEY_CLASSES_ROOT;
        Reg.OpenKey(ExtName,true);
        Reg.WriteString('',AppKey);
        Reg.CloseKey;

        Reg.OpenKey(AppKey,true);
        Reg.WriteString('',Describe);
        Reg.CloseKey;

        Reg.OpenKey(AppKey   +   '\DefaultIcon',true);
        Reg.WriteString('',Icon );
        Reg.CloseKey;

        Reg.OpenKey(AppKey   +   '\Shell',true);
        Reg.WriteString('','Open' );
        Reg.CloseKey;

        Reg.OpenKey(AppKey   +   '\Shell\Open\Command',true);
        Reg.WriteString('',AppName + ' "%1"');
        Reg.CloseKey;

        reg.free;

        Result := True;
    except
       Reg.Free;
       Result := false;
    end;
end;


    通过自己调试通过了,在路径中有空格的情况下得到的文件路径也是长文件名形式的,所以我觉得还是应该是同事在文件关联的地方出了问题,最后硬要来代码仔细观察了以后发现‘ %1’的问题, 在delphi中 ‘ %1’ 写成 ' "%1"'这种形式的话在得到文件的路径的时候才不会因为空格什么出问题。
    上面的那段代码,是在http://hi.baidu.com/piaoliuxia/blog/item/924bae22cafd55fbd6cae271.html这篇博客中得到的,修改了一点内容。同时也在这篇博客里找到了SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);  (uses ShlObj)这样一个方法可以轻松的实现在文件关联后立刻更新文件图标等内容。

你可能感兴趣的:(C++,c,Blog,C#,Delphi)