好库网 好库网首页 | 我的好库
好饱的专栏

C#使用ICDBurn实现CD刻录

发布者:好饱
发布日期:2013/1/20 16:05:04   更新日期:2013/1/20 16:05:04
阅读次数:4026
评分:4.80
介绍:新版本的Windows,如Windows XP、Windows 2003都提供刻录光盘的功能,这事实上就是将刻录功能内嵌到系统中了。使用起来虽然方便,但是比起专业的刻录软件,它就显得不够灵活。 事实上, Windows提供了一个名为ICDBurn的对象方便编程工具调用。如果只是复制文件和目录,可以用 shell's ICDBurn 接口,使用起来非常方便。本文提供一个简单的例子教你如何利用ICDBurn来编写属于自己的刻录工具。
正文:

 

作者:prajwal rao

 

[译者按] 新版本的Windows,如Windows XP、Windows 2003都提供刻录光盘的功能,这事实上就是将刻录功能内嵌到系统中了。使用起来虽然方便,但是比起专业的刻录软件,它就显得不够灵活。 

    事实上, Windows提供了一个名为ICDBurn的对象方便编程工具调用。如果只是复制文件和目录,可以用 shell's ICDBurn 接口,使用起来非常方便。本文提供一个简单的例子教你如何利用ICDBurn来编写属于自己的刻录工具。

 

介绍

相对于C和C++,在C#里使用ICDBrun不涉及COM接口(CLR中的一部分,允许COM和.NET对象相互交互)。该技术细节参见清单3的csburnd.cs源代码,命名空间为System.Runtime.InteropServices,ICDBurn接口定义等更多细节。

 

代码使用

 

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

class CSburnD
{
    [DllImport("shfolder.dll")]
    static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder,
                                      IntPtr hToken, int dwFlags,
                                      StringBuilder pszPath);

    const int CSIDL_CDBURN_AREA = 0x3B;

    const int SHGFP_TYPE_CURRENT = 0;

    public static void Main(string[] args)
    {
        StringBuilder szPath = new StringBuilder(1024);
        if (SHGetFolderPath((IntPtr)0, CSIDL_CDBURN_AREA, (IntPtr)0,
            SHGFP_TYPE_CURRENT, szPath) != 0)
            Console.WriteLine("SHGetFolderPath() failure");
        else
            Console.WriteLine("SHGetFolderPath return value = " + szPath);

        Guid CLSID_CDBurn = new Guid("fbeb8a05-beee-4442-804e-409d6c4515e9");

        Type t = Type.GetTypeFromCLSID(CLSID_CDBurn);
        if (t == null)
        {
            Console.WriteLine("ICDBurn not supported by OS");
            return;
        }

        ICDBurn iface = (ICDBurn)Activator.CreateInstance(t);
        if (iface == null)
        {
            Console.WriteLine("Unable to obtain interface");
            return;
        }

        bool hasRecorder = false;
        iface.HasRecordableDrive(ref hasRecorder);
        Console.WriteLine("HasRecordableDrive return value = " + hasRecorder);

        if (hasRecorder)
        {
            StringBuilder driveLetter = new StringBuilder(4);
            iface.GetRecorderDriveLetter(driveLetter, 4);
            Console.WriteLine("GetRecorderDriveLetter return value = " +
                              driveLetter);
            iface.Burn((IntPtr)0);
        }
    }
}

[ComImport]
[Guid("3d73a659-e5d0-4d42-afc0-5121ba425c8d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICDBurn
{
    void GetRecorderDriveLetter([MarshalAs(UnmanagedType.LPWStr)]
                                StringBuilder pszDrive, uint cch);
    void Burn(IntPtr hwnd);
    void HasRecordableDrive(ref bool HasRecorder);
}

下载源代码

 

 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。