[英]How to register a windows file extension via the sdk on window 10.x
注意:这个问题不是关于 dart,而是关于 Windows 注册表。
我已经实现了一个库和工具(称为 dcli)来用 dart 语言编写 cli 应用程序。
当用户在命令行上键入 dart 脚本的名称时,我需要 Windows 来启动 dcli 并传递 dart 脚本和任何命令行参数。
例如
hellow.dart a b c
将导致运行以下命令
dcli.bat hellow.dart a b c
我需要通过“C”注册表 api 来执行此操作(我正在使用其外部函数接口 (ffi) 从 dart 调用注册表 api,该接口允许它调用 C 入口点)。 这部分问题已经解决,我可以从 dart 成功添加注册表项。
我的问题是知道要创建哪些注册表设置,因为特别是随着 Windows 10 的出现,文档变得一团糟。
到目前为止,这是我相当糟糕的尝试。
// create a ProgID for dcli 'noojee.dcli'
regSetString(HKEY_CURRENT_USER,
r'\Software\Classes\noojee.dcli',
defaultRegistryValueName, 'dcli');
// associate the .dart extension with dcli's prog id
regSetString(HKEY_CURRENT_USER, r'\Software\Classes\.dart',
defaultRegistryValueName, 'noojee.dcli');
regSetString(HKEY_CURRENT_USER,
r'SOFTWARE\Classes\.dart\OpenWithProgids',
'noojee.dcli.dart', '');
// this path doesn't look correct
regSetExpandString(
HKEY_CURRENT_USER,
r'dcli\shell\open\command',
defaultRegistryValueName,
'c:\path\to\dcli.bat %1 %2 %3 %4 %5 %6 %7 %8 %9');
regSetString(
HKEY_CURRENT_USER,
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dart\OpenWithList',
'a',
'dcli.bat');
regSetString(
HKEY_CURRENT_USER,
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dart',
'MRUList',
'a');
regSetNone(
HKEY_CURRENT_USER,
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dart\OpenWithProgids',
'noojee.dcli');
令我困惑的一件事是 HKEY_CLASSES_ROOT 的使用。 doco 似乎说它是只读的,但随后继续显示在其下创建密钥的示例。
我有一个额外的复杂性,即带有 dart-code 扩展的 vscode 喜欢添加自己的关联(这是没有意义的),如果它存在,我需要覆盖它,但理想情况下,将其作为资源管理器菜单上的替代方案。
HKEY_CLASSES_ROOT
是HKEY_CURRENT_USER\\Software\\Classes
和HKEY_LOCAL_MACHINE\\Software\\Classes
(在 Win2000 及更高版本上)的虚拟合并视图。 它不是只读的,但写入它并不是最好的主意,因为写入通常会写入机器部分,除非它不会。
FileExts
键未记录,请勿写入。
在您的代码中, r'dcli\\shell\\open\\command'
不正确, classes 键中的第一个组件应该是扩展指向的 progid,请尝试r'SOFTWARE\\Classes\\noojee.dcli\\shell\\open\\command'
.
它基本上是这样的:
HKEY_CURRENT_USER\\Software\\Classes\\.myext
= myprogid
HKEY_CURRENT_USER\\Software\\Classes\\myprogid\\shell\\verb\\command
= "c:\\path\\app.exe" "%1"
(其中 %1 替换为文件路径,%2 仅用于打印机)。感谢@Anders,我得到了以下信息:
注意:defaultRegistryValueName 只是一个空字符串 ''。
const progIdPath = r'Software\Classes\.dart\OpenWithProgids';
if (regKeyExists(HKEY_CURRENT_USER, progIdPath)) {
regDeleteKey(HKEY_CURRENT_USER, progIdPath);
}
regCreateKey(HKEY_CURRENT_USER, progIdPath);
regSetString(HKEY_CURRENT_USER, progIdPath, 'noojee.dcli', '');
const commandPath = r'Software\Classes\noojee.dcli\shell\open\command';
if (regKeyExists(HKEY_CURRENT_USER, commandPath)) {
regDeleteKey(HKEY_CURRENT_USER, commandPath);
}
regCreateKey(HKEY_CURRENT_USER, commandPath);
regSetString(
HKEY_CURRENT_USER,
commandPath,
defaultRegistryValueName,
'"${DCliPaths().pathToDCli}" '
'"%1"%*');
唯一的问题是 %* 似乎没有做任何有用的事情。 从 doco 我发现它应该扩展任何没有。 args(例如超过 9 个)但是我只得到 8 个(因为 %1 是命令本身)并且“%1”产生与“%1”相同的结果%*
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.