Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh mengaitkan sambungan fail secara pemrograman dengan aplikasi saya dalam Windows tanpa menggunakan pemasang?

Bagaimanakah saya boleh mengaitkan sambungan fail secara pemrograman dengan aplikasi saya dalam Windows tanpa menggunakan pemasang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-19 23:46:09575semak imbas

How can I programmatically associate a file extension with my application in Windows without using an installer?

Kaitkan sambungan fail dengan aplikasi

Apabila membangunkan aplikasi yang mengedit jenis fail tertentu, selalunya perlu mengaitkannya dengan editor lalai untuk jenis fail tersebut. Berikut ialah penyelesaian yang kukuh tentang cara untuk mencapai ini tanpa menggunakan pemasang.

Pelaksanaan kaedah persatuan:

Kod yang disediakan cuba untuk mengaitkan fail dengan memanipulasi pendaftaran. Walau bagaimanapun, ia mengandungi beberapa isu:

  1. Ia membuka pendaftaran pengguna semasa tanpa menyatakan kebenaran baca dan tulis, yang mungkin menghalang pengubahsuaian kunci yang berjaya.
  2. Ia menggunakan CreateSubKey dan bukannya OpenSubKey untuk mencipta subkunci shell dan gagal jika subkunci itu sudah wujud.

Kod persatuan yang diubah suai:

Berikut ialah versi diubah suai kod yang menyelesaikan masalah ini:

<code class="language-csharp">public static void SetAssociation(string extension, string keyName, string fileDescription, string executablePath)
{
    // 以读写权限打开当前用户的注册表
    using (RegistryKey currentUser = Registry.CurrentUser.OpenSubKey(@"HKEY_CURRENT_USER", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl))
    {
        using (RegistryKey baseKey = currentUser.CreateSubKey(extension))
        {
            baseKey.SetValue("", keyName);
        }

        using (RegistryKey openMethodKey = currentUser.CreateSubKey(keyName))
        {
            openMethodKey.SetValue("", fileDescription);

            // 如果“DefaultIcon”子密钥不存在,则创建它
            if (openMethodKey.OpenSubKey("DefaultIcon") == null)
            {
                using (RegistryKey defaultIconKey = openMethodKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", "\"" + executablePath + "\",0");
                }
            }

            // 创建 Shell 子密钥并编辑和打开命令子密钥
            using (RegistryKey shellKey = openMethodKey.CreateSubKey("Shell"))
            {
                using (RegistryKey editKey = shellKey.CreateSubKey("edit"))
                {
                    using (RegistryKey editCommandKey = editKey.CreateSubKey("command"))
                    {
                        editCommandKey.SetValue("", "\"" + executablePath + "\" \"%1\"");
                    }
                }

                using (RegistryKey openKey = shellKey.CreateSubKey("open"))
                {
                    using (RegistryKey openCommandKey = openKey.CreateSubKey("command"))
                    {
                        openCommandKey.SetValue("", "\"" + executablePath + "\" \"%1\"");
                    }
                }
            }
        }

        // 在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts 中设置 ProgId
        using (RegistryKey fileExtsKey = currentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + extension))
        {
            fileExtsKey.SetValue("Progid", keyName);
        }
    }

    // 通知资源管理器更改以刷新其文件关联
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
}</code>

Contoh penggunaan:

Untuk mengaitkan sambungan fail .ucs dengan aplikasi yang dipanggil "UCS Editor" anda boleh menggunakan kod ini:

<code class="language-csharp">SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);</code>

Nota lain:

  • Pastikan executablePath menghala ke executable sebenar, bukan pintasan atau bundled executable.
  • Jika sambungan fail belum didaftarkan dalam pendaftaran, kunci sepadannya perlu dibuat sebelum menyediakan perkaitan.
  • Gunakan kaedah EnsureAssociationsSet untuk menetapkan perkaitan secara automatik untuk berbilang jenis fail.

Respons yang disemak ini mengekalkan imej asal dan menggunakan lebih banyak bahasa deskriptif sambil menyusun semula teks untuk kejelasan dan aliran yang lebih baik Kod ini juga diformatkan untuk kebolehbacaan yang lebih baik.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengaitkan sambungan fail secara pemrograman dengan aplikasi saya dalam Windows tanpa menggunakan pemasang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn