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
Lepaskan: 2025-01-19 23:46:09
asal
540 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan