OK,我得到了它的工作,我会分享我的教训。
1)决定一个ProgID。根据文档,它应该是vender.app.versionnumber,但注册表显示实际上没有任何供应商遵循该规则。但我做到了。
2)大多数关于这个主题谈创建下HKEY_CLASSES_ROOT项MSFT文档的,但我发现重要的信息上http://msdn.microsoft.com/en-us/library/cc144148(v=vs.85).aspx:
有关文件类型的重要考虑因素包括:该 HKEY_CLASSES_ROOT子树形成一个视图通过合并 HKEY_CURRENT_USER \ Software \ Classes和 HKEY_LOCAL_MACHINE \ Software \ Classes一般来说,HKEY_CLASSES_ROOT是 打算从中读取但不写入。有关更多信息,请参阅 HKEY_CLASSES_ROOT文章。
3)在不重新启动的情况下显示关联,您必须调用SHChangeNotify()。 (这扔了我,因为即使当我有正确的代码,结果没有正确显示在资源管理器中。)
这是我结束了代码。如果我使用REGEDIT并删除.moselle(我的扩展名)和MoselleIDE(我的应用程序)的所有提及,然后手动运行我的程序,我会得到点击打开行为,文件图标变得与应用程序相同,等等。注意代码使用日志记录功能,并且它还详细报告了它具有哪种类型的成功:1)变量已经正确,2)变量已更改,3)变量不存在。
void RegSet(HKEY hkeyHive, const char* pszVar, const char* pszVa
lue) {
HKEY hkey;
char szValueCurrent[1000];
DWORD dwType;
DWORD dwSize = sizeof(szValueCurrent);
int iRC = RegGetValue(hkeyHive, pszVar, NULL, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize);
bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND;
if (iRC != ERROR_SUCCESS && !bDidntExist)
AKS(AKSFatal, "RegGetValue(%s): %s", pszVar, strerror(iRC));
if (!bDidntExist) {
if (dwType != REG_SZ)
AKS(AKSFatal, "RegGetValue(%s) found type unhandled %d", pszVar, dwType);
if (strcmp(szValueCurrent, pszValue) == 0) {
AKS(AKSTrace, "RegSet(\"%s\" \"%s\"): already correct", pszVar, pszValue);
return;
}
}
DWORD dwDisposition;
iRC = RegCreateKeyEx(hkeyHive, pszVar, 0, 0, 0, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition);
if (iRC != ERROR_SUCCESS)
AKS(AKSFatal, "RegCreateKeyEx(%s): %s", pszVar, strerror(iRC));
iRC = RegSetValueEx(hkey, "", 0, REG_SZ, (BYTE*) pszValue, strlen(pszValue) + 1);
if (iRC != ERROR_SUCCESS)
AKS(AKSFatal, "RegSetValueEx(%s): %s", pszVar, strerror(iRC));
if (bDidntExist)
AKS(AKSTrace, "RegSet(%s): set to \"%s\"", pszVar, pszValue);
else
AKS(AKSTrace, "RegSet(%s): changed \"%s\" to \"%s\"", pszVar, szValueCurrent, pszValue);
RegCloseKey(hkey);
}
int SetUpRegistry() {
//app doesn't have permission for this when run as normal user, but may for Admin? Anyway, not needed.
//RegSet(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\MoselleIDE.exe", "C:\\Moselle\\bin\\MoselleIDE.exe");
RegSet(HKEY_CURRENT_USER, "Software\\Classes\\.moselle", "Moselle.MoselleIDE.1");
// Not needed.
RegSet(HKEY_CURRENT_USER, "Software\\Classes\\.moselle\\Content Type", "text/plain");
RegSet(HKEY_CURRENT_USER, "Software\\Classes\\.moselle\\PerceivedType", "text");
//Not needed, but may be be a way to have wordpad show up on the default list.
//RegSet(HKEY_CURRENT_USER, "Software\\Classes\\.moselle\\OpenWithProgIds\\Moselle.MoselleIDE.1", "");
RegSet(HKEY_CURRENT_USER, "Software\\Classes\\Moselle.MoselleIDE.1", "Moselle IDE");
RegSet(HKEY_CURRENT_USER, "Software\\Classes\\Moselle.MoselleIDE.1\\Shell\\Open\\Command", "C:\\Moselle\\bin\\MoselleIDE.exe %1");
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
return 0;
}
最后,是的,我知道我应该找出一个安装程序,但我是一个C++高手,而不是Windows配置和术语专家和很多更容易为我写的比上述50条线甚至开始了解如何配置安装程序。这是一个alpha版本,我会观看这个话题,以获得更好的未来版本的想法。
如何以root身份执行程序?安装人员通常必须这样做。还有一些功能允许程序请求扩展权限(使黄色窗口弹出)。 – Paranaix
谢谢Paranaix。事实证明,建议在HKEY_CURRENT_USER中进行更改,并且不需要root。就个人而言,如果选择安装不是非常值得信赖的软件作为root用户,并以普通用户身份运行某些软件,我宁愿选择后者。 –