最新消息:想得多,做的少。一天到晚瞎鸡巴搞。

自定义文件关联与设置文件Icon

Windows编程 阿虚 569浏览 0评论

.     如果你需要给自定义文件格式关联一个特定的ICON图片与让系统支持支持双击你的文件格式打开你自己的可执行文件那么下面的代码就对你有用。

.     具体就不细说了。直接给出代码,代码比文字解释更详细。

/****************************************************
* 检测文件关联情况
* strExt: 要检测的扩展名(例如: ".txt")
* strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")
* 返回TRUE: 表示已关联,FALSE: 表示未关联

******************************************************/

BOOL CDataFileRegIcon::CheckFileRelation(const char *strExt, const char *strAppKey)
{
    int nRet=FALSE;
    HKEY hExtKey;
    char szPath[_MAX_PATH]; 
    DWORD dwSize=sizeof(szPath); 
    if(RegOpenKey(HKEY_CLASSES_ROOT,strExt,&hExtKey)==ERROR_SUCCESS)
    {
        RegQueryValueEx(hExtKey,NULL,NULL,NULL,(LPBYTE)szPath,&dwSize);
        if(_stricmp(szPath,strAppKey)==0)
        {
            nRet=TRUE;
        }
        RegCloseKey(hExtKey);
        return nRet;
    }
    return nRet;
}

/****************************************************

  * 注册文件关联
  * strExe: 要检测的扩展名(例如: ".txt")
  * strAppName: 要关联的应用程序名(例如: "C:/MyApp/MyApp.exe")
  * strAppKey: ExeName扩展名在注册表中的键值(例如: "txtfile")
  * strDefaultIcon: 扩展名为strAppName的图标文件(例如: *"C:/MyApp/MyApp.exe,0")
  * strDescribe: 文件类型描述
  
****************************************************/

void CDataFileRegIcon::RegisterFileRelation(char *strExt, char *strAppName, char *strAppKey, char *strDefaultIcon, char *strDescribe)
{
    char strTemp[_MAX_PATH];
    HKEY hKey;

    RegCreateKeyEx(HKEY_CLASSES_ROOT, strExt, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_SET_VALUE, NULL, &hKey, NULL);
    RegSetValueEx(hKey, "", NULL, REG_SZ, (UCHAR*)strAppKey, strlen(strAppKey) + 1);
    RegCloseKey(hKey);
    
    RegCreateKeyEx(HKEY_CLASSES_ROOT, strAppKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_SET_VALUE, NULL, &hKey, NULL);
    RegSetValueEx(hKey, "", 0, REG_SZ, (UCHAR*)strDescribe, strlen(strDescribe) + 1);
    RegCloseKey(hKey);
    
    sprintf(strTemp,"%s\\DefaultIcon",strAppKey);
    RegCreateKeyEx(HKEY_CLASSES_ROOT, strTemp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_SET_VALUE, NULL, &hKey, NULL);
    RegSetValueEx(hKey, "", 0, REG_SZ, (UCHAR*)strDefaultIcon, strlen(strDefaultIcon) + 1);
    RegCloseKey(hKey);
    
    sprintf(strTemp,"%s\\Shell",strAppKey);
    RegCreateKeyEx(HKEY_CLASSES_ROOT, strTemp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_SET_VALUE, NULL, &hKey, NULL);
    RegSetValueEx(hKey, "", 0, REG_SZ, (UCHAR*)"Open", strlen("Open") + 1);
    RegCloseKey(hKey);
    
    sprintf(strTemp,"%s\\Shell\\Open\\Command",strAppKey);
    RegCreateKeyEx(HKEY_CLASSES_ROOT, strTemp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_SET_VALUE, NULL, &hKey, NULL);
    sprintf(strTemp,"%s \"%%1\"",strAppName);
    RegSetValueEx(hKey, "", 0, REG_SZ, (UCHAR*)strTemp, strlen(strTemp) + 1);
    RegCloseKey(hKey);
}

int main(int argc, char* argv[])
{
    PrcoessPrivilege();

    CDataFileRegIcon f;
    int i = 0;

    if (f.CheckFileRelation(".XuWu", "XuWuFile") == FALSE)
    {
        f.RegisterFileRelation( 
            ".XuWu", 
            "C:\\Users\\xxx\\Desktop\\DDP_Setup.exe",  //这里是用打开方式来打开关联的文件,如果需要自己的EXE就写EXE文件路径
            "XuWuFile", 
            "C:/Users/xxx/Desktop/DDP_Setup.exe/xxx.ico",
            "");
    }
    else
    {
        printf("err \r\n");
    }

	return 0;
}

再在此之前你或许要提升自己的进程令牌,如果你是在VC6下测试。你还得以管理员权限打开VC6才能写入注册表。

转载请注明:虚无 » 自定义文件关联与设置文件Icon

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址