Rumah >pembangunan bahagian belakang >C++ >Bagaimana Menentukan Aplikasi Lalai Secara Pemrograman untuk Membuka Jenis Fail dalam Windows?

Bagaimana Menentukan Aplikasi Lalai Secara Pemrograman untuk Membuka Jenis Fail dalam Windows?

Susan Sarandon
Susan Sarandonasal
2025-01-05 01:26:40692semak imbas

How to Programmatically Determine the Default Application for Opening a File Type in Windows?

Menentukan Aplikasi Lalai untuk Membuka Jenis Fail pada Windows

Membuka fail dengan aplikasi lalai yang sesuai ialah tugas biasa untuk banyak aplikasi. Untuk mencapai ini dalam .NET Framework 2.0 menggunakan C#, anda boleh menggunakan kaedah System.Diagnostics.Process.Start. Walau bagaimanapun, kaedah ini memerlukan sambungan fail yang tepat untuk menentukan aplikasi lalai.

Untuk membuka fail tanpa sambungan khusus dalam aplikasi lalai yang dikehendaki, anda perlu mendapatkan semula aplikasi yang dikaitkan dengan jenis fail. Semasa menggunakan pendaftaran untuk menentukan perkaitan ini adalah pendekatan yang tidak boleh dipercayai, API Win32 menyediakan kaedah yang lebih mantap.

Fungsi AssocQueryString dalam pustaka Shlwapi.dll membolehkan anda menanyakan perkaitan untuk jenis fail tertentu. Menggunakan fungsi ini, anda boleh menentukan arahan lalai, boleh laku atau maklumat lain yang berkaitan untuk jenis fail.

Penggunaan sampel menunjukkan cara menggunakan AssocQueryString untuk mendapatkan arahan yang dikaitkan dengan sambungan fail:

using System;
using System.Runtime.InteropServices;

namespace FileAssociation
{
    class Program
    {
        [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
        public static extern uint AssocQueryString(
            AssocF flags, AssocStr str, string pszAssoc, string pszExtra, 
            [Out] StringBuilder pszOut, ref uint pcchOut);

        public enum AssocF
        {
            None = 0x00000000,
            Init_NoRemapCLSID = 0x00000001,
            Init_ByExeName = 0x00000002,
            Open_ByExeName = 0x00000002,
            Init_DefaultToStar = 0x00000004,
            Init_DefaultToFolder = 0x00000008,
            NoUserSettings = 0x00000010,
            NoTruncate = 0x00000020,
            Verify = 0x00000040,
            RemapRunDll = 0x00000080,
            NoFixUps = 0x00000100,
            IgnoreBaseClass = 0x00000200,
            Init_IgnoreUnknown = 0x00000400,
            Init_Fixed_ProgId = 0x00000800,
            Is_Protocol = 0x00001000,
            Init_For_File = 0x00002000
        }

        public enum AssocStr
        {
            Command = 1,
            Executable,
            FriendlyDocName,
            FriendlyAppName,
            NoOpen,
            ShellNewValue,
            DDECommand,
            DDEIfExec,
            DDEApplication,
            DDETopic,
            InfoTip,
            QuickTip,
            TileInfo,
            ContentType,
            DefaultIcon,
            ShellExtension,
            DropTarget,
            DelegateExecute,
            Supported_Uri_Protocols,
            ProgID,
            AppID,
            AppPublisher,
            AppIconReference,
            Max
        }

        public static string AssocQueryString(AssocStr association, string extension)
        {
            const int S_OK = 0x00000000;
            const int S_FALSE = 0x00000001;

            uint length = 0;
            uint ret = AssocQueryString(AssocF.None, association, extension, null, null, ref length);
            if (ret != S_FALSE)
            {
                throw new InvalidOperationException("Could not determine associated string");
            }

            var sb = new StringBuilder((int)length); // (length - 1) will probably work too as the marshaller adds null termination
            ret = AssocQueryString(AssocF.None, association, extension, null, sb, ref length);
            if (ret != S_OK)
            {
                throw new InvalidOperationException("Could not determine associated string");
            }

            return sb.ToString();
        }

        public static void Main(string[] args)
        {
            string extension = ".txt";
            string command = AssocQueryString(AssocStr.Command, extension);
            System.Diagnostics.Process.Start(command, "test.txt");
        }
    }
}

Atas ialah kandungan terperinci Bagaimana Menentukan Aplikasi Lalai Secara Pemrograman untuk Membuka Jenis Fail dalam Windows?. 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