Windows EXE文件关联

来源:互联网 发布:mysql 加几天 编辑:程序博客网 时间:2024/06/05 04:15
1.什么是文件关联
  文件关联,是为了在Windows中实现方便的操作,将某一类数据文件与一个相关的程序建立联系,当用鼠标双击这类数据文件时,Windows操作系统就自动启动关联的程序,打开这个数据文件供操作者处理。例如,通用的ASCII码的文本文件,后缀名为TXT,Windows系统中默认的关联程序就是记事本编辑程序。当我们在Windows的文件窗口中双击TXT文件,TXT文件关联的记事本程序就自动启动,读入TXT文件的内容,以供查看和编辑。
  文件关联,简化了打开文件的过程。由于Windows中预先设置了多种文件的关联程序,初学者不必知道哪些文件必须由什么样的程序来打开,对于大部分数据文件,直接双击就可以调用相关的程序来查看和处理了。
2.关联图标
  有关联程序的文件,大都以某个特征图标来表示是一个什么类型的文件,例如,一个TXT文本文件,就是用一个简单的笔记簿图形来表示。一个文件用什么图标来显示以及关联的程序,都是由Windows来管理。要注意的是,数据文件的图标是由专门的图标文件或关联的EXE文件提供(EXE程序文件的图标可以包含在文件中)。上表列出了Windows中默认的一些文件关联。

更多详细你可以去这个网站看 www.vdisk.cn/hhhaaa


修改注册表
例子:

HKEY_CLASSES_ROOT 键下[HKEY_CLASSES_ROOT\.mp3]@="Mp3Player"[HKEY_CLASSES_ROOT\Mp3Player]@="Mp3Player"//图标[HKEY_CLASSES_ROOT\AudioDecoder\defaultIcon]@="C:\\Mp3Player.EXE,1"[HKEY_CLASSES_ROOT\AudioDecoder\Shell][HKEY_CLASSES_ROOT\AudioDecoder\Shell\open]// 打开的程序[HKEY_CLASSES_ROOT\AudioDecoder\Shell\open\command]@="Mp3Player.EXE %1"

图标你用自己的应用程序的图标即可,在你自己应用程序对应的注册表的DefaultIcon值中设置为你自己应用程序(.exe)后跟 ,0(.dll或exe对应的图标序号)即可.型如: 
C:\programme file\myprog.exe ,0

请在CMyApp::InitInstance()中加入或修改以下代码

EnableShellOpen();RegisterShellFileTypes(TRUE);CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);if (!ProcessShellCommand(cmdInfo))return FALSE;pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);pMainFrame->UpdateWindow();


==============================================================================================================

 

wince 文件关联程序


最近修改完wince上面的photoview程序,想把photoview.exe关联到所有图片上,今天花一个小时时间完成了。

为了以后方便查看,特记录下来:

 

Platform Builder for Microsoft Windows CE 7.0

 

 

在CE中我们打开一个mp3文件,会相应关联到windows media player,即跳出media player播放器。

现在我想双击图片能够调出自己的图片浏览器,这样就可以很方便的使用自己的程序。

 

下面介绍两种方法:1.修改注册表    2.修改注册文件

 

这里方便测试,使用模拟器,因此platform为Deviece emulator

1.修改注册表

下面举个例子说明:

我们要将后缀名为.jpg文件关联到photoview.exe程序。首先在HKEY_CLASSES_ROOT下建一子目录.jpg,Name为空或Default,Data为jpgfile。接着还是在HKEY_CLASSES_ROOT下建一子目录jpgfile,jpgfile下建两个子目录:DefaultIcon和Shell,如果对文件显示图标没有要求,DefaultIcon采用默认值,Shell往下再建Open目录,Open往下再建Command目录,在这里来指定文件关联到哪个程序,如"photoview.exe" "%1",注意,必须要加上引号。注意,两个引号之间必须要有空格

我们将工程makeimg之后,就可以将图片和photoview.exe程序关联起来了。

 

(现在我使用的wince7.0版makeimg之后不能使用,我就使用了sysgen编译了一下,结果ok)

 

 

2.修改注册文件

这其实和上面的方法一样,只是对于某些高手来说不屑于去直接修改注册表,直接修改文件platform.reg文件

platform文件的位置在wince7.0安装路径下面:我的工作目录为C:/WINCE700/PLATFORM/DEVICEEMULATOR/FILES/platform.reg

打开platform.reg文件,添加以下内容:

//--------------------------------------------------------------------[HKEY_CLASSES_ROOT/.jpg][HKEY_CLASSES_ROOT/.jpg]@="jpgfile"[HKEY_CLASSES_ROOT/jpgfile][HKEY_CLASSES_ROOT/jpgfile/Shell][HKEY_CLASSES_ROOT/jpgfile/Shell/Open][HKEY_CLASSES_ROOT/jpgfile/Shell/Open/Command][HKEY_CLASSES_ROOT/jpgfile/Shell/Open/Command]@="/"photoview.exe/" /"%1/""[HKEY_CLASSES_ROOT/jpgfile/DefaultIcon]@="iexplore.exe,-1005"//------------------------------------------------------------------------

上面两种方法只是能将jpg格式的图片关联到photoview.exe程序,photoview.exe文件被放置在/Windows目录下面

程序怎么知道关联到哪张图片上了呢?

这里就需要使用GetCommandLine(),函数会返回图片的路径。GetCommandLine()函数只在main入口处起作用,每点击一张个jpg格式的图片,都会打开一次新的photoview.exe程序

相关文档可以参考:

http://hi.baidu.com/wu_yuzhi/blog/item/584956d0114b5b329a50277b.html

===============================================================================================

当打开一个文件时,系统会自动找到打开它的程序。我一直对此有点兴趣,今天终于在自己的程序中也实现了。步骤是这样的,首先在注册表中注册我的程序和哪些文件格式(后缀名)关联,然后在程序中响应双击打开文件,因为启动程序的时候,MFC默认的是命令是FileNew。不够以前我的程序是改成FileNothing,因为我的是MDI程序。所以今天加了如果命令行传来文件路径就要把它打开。也即是cmdInfo.m_strFileName不为空。可是刚开始遇到一点小问题,因为路径会截断空格,比如"C:/Documents and Settings/桌面/draw1.sch"变成了"C:/Documents"空格之后被截断了。后来我用::GetCommandLine()自己获取命令行中的文件路径。那么就是在程序中添加如下语句。

1.注册关联文件

BOOL CDesignSysApp::InitApplication() {        /*..............           你的语句         ................*/         // 注册文件关联       // strExe: 要检测的扩展名(例如: ".txt")       // strAppName: 要关联的应用程序名(例如: "C:/MyApp/MyApp.exe")       // strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")       // strDefaultIcon: 扩展名为strAppName的图标文件(例如: "C:/MyApp/MyApp.exe,0")       // strDescribe: 文件类型描述       char strAppName[MAXLEN];       ::GetModuleFileName(NULL, strAppName, MAXLEN);       char *strExt = ".sch";       char *strAppKey = "schfile";       char strDefaultIcon[MAXLEN];       // char *strDescribe = "sch";       HKEY hKey;       char strTemp[1024];       if(ERROR_SUCCESS == RegCreateKey(HKEY_CLASSES_ROOT,strExt,&hKey))      {              RegSetValue(hKey,"",REG_SZ,strAppKey,strlen(strAppKey)+1);              RegCloseKey(hKey);      }      sprintf(strTemp,"%s//DefaultIcon",strAppKey);      if(ERROR_SUCCESS == RegCreateKey(HKEY_CLASSES_ROOT,strTemp,&hKey))      {              sprintf(strDefaultIcon, "%s%s", strAppName, ", 0");              RegSetValue(hKey,"",REG_SZ,strDefaultIcon,strlen(strDefaultIcon)+1);              RegCloseKey(hKey);      }          sprintf(strTemp,"%s//Shell",strAppKey);      if(ERROR_SUCCESS == RegCreateKey(HKEY_CLASSES_ROOT,strTemp,&hKey))      {              RegSetValue(hKey,"",REG_SZ,"Open",strlen("Open")+1);              RegCloseKey(hKey);      }          sprintf(strTemp,"%s//Shell//Open//Command",strAppKey);      if(ERROR_SUCCESS == RegCreateKey(HKEY_CLASSES_ROOT,strTemp,&hKey))     {             sprintf(strTemp,"%s %s",strAppName, "%1");             RegSetValue(hKey,"",REG_SZ,strTemp,strlen(strTemp)+1);             RegCloseKey(hKey);     }}
2.打开文件

BOOL CDesignSysApp::InitInstance(){          /*.............           你的程序           ..............*/               CCommandLineInfo cmdInfo;          cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;          ParseCommandLine(cmdInfo);          if(cmdInfo.m_strFileName != _T(""))          {                   CString str = ::GetCommandLine();                   int nPos = str.ReverseFind('//');                   if(nPos != -1)                  {                          str = str.Right(str.GetLength() - nPos - 1);                  }                   if(str != _T(""))                  {                          cmdInfo.m_strFileName = str;                          cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;                  }          }          if (!ProcessShellCommand(cmdInfo))          return FALSE;}

================================================================================================

文件类型关联的文件图标

得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标?
    这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如C:/MyFile/SomeFile.zzp。那你可以调用ExtractAssociatedIcon函数获得于特定文件关联的图标。但这个函数只适用于磁盘上存在实际的文件(或某处可存取)。
    如果你想查找与一般文件类型关联的图标,那你就必须读注册表。例如,为了查找出.cpp文件使用的图标,你就要察看注册表的HKEY_CLASSES_ROOT/.cpp入口,在我的机器上,其第一行的值是“cppfile”,然后继续察看HKEY_CLASSES_ROOT/cppfile的DefaultIcon键值,在我的机器上是:

HKEY_CLASSES_ROOT/cppfile/DefaultIcon =
"C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe,-20209"

    所以.cpp文件的图标在C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe文件中的图标资源ID号为20209。一般情况下,HKCR/.foo有一个类似foofile的入口值,并在HKCR /foofile/DefaultIcon中指定了cpp文件的图标。
    但是,有的时候.foo的入口值不是foofile,而是象“SuperApp.Document.5”,它的意思是SuperApp文档的第五个版本,在HKEY_CLASSES_ROOT/ SuperApp.Document.5中没有DefaultIcon键值,但有键值CLSID={又长又丑的十六进制GUID},这就告诉你.foo是COM对象,其类的ID值就是那又长又丑的十六进制GUID。要得到关联的图标,必须到/CLSID/{又长又丑的十六进制GUID}/ DefaultIcon查找。哭吧!太痛苦了。但是还没完呢!因为foofile还可能有一个定制的以外壳扩展形式实现的图标处理器。为此你还要检查一下,加载这个图标处理器,调用IShellIcon或者IExtractIcon 并且继续哭吧,这真是太荒唐啦!
    所幸的是,有一个更好的方法来避开令人厌恶的注册表,那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.txt。即便文件不存在,SHGetFileInfo也能获得你要的信息。

SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo("foo.bmp", 
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);

为了展示它的使用方法,我写了一个小应用程序,FileType(参见图一),




原创粉丝点击