繁体   English   中英

如何通过 windows 10.x 上的 sdk 注册 windows 文件扩展名

[英]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_ROOTHKEY_CURRENT_USER\\Software\\ClassesHKEY_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM