小编Ale*_*der的帖子

在单线程应用程序中调用WMI函数时,DisconnectedContext MDA

我在VS2005的C#,.NET 3.0中编写了一个应用程序,其功能是监视各种可移动驱动器(USB闪存盘,CD-ROM等)的插入/弹出.我不想使用WMI,因为它可以有时会产生歧义(例如,它可以生成一个单一的USB驱动器插入多个事件),所以我干脆重写我的MainForm赶上WM_DEVICECHANGE消息的WndProc,因为建议在这里.昨天我遇到了一个问题,结果发现我将不得不使用WMI来检索一些模糊的磁盘细节,如序列号.事实证明,从WndProc内部调用WMI例程会抛出DisconnectedContext MDA.

经过一番挖掘后,我结束了一个尴尬的解决方法.代码如下:

    // the function for calling WMI 
    private void GetDrives()
    {
        ManagementClass diskDriveClass = new ManagementClass("Win32_DiskDrive");
        // THIS is the line I get DisconnectedContext MDA on when it happens:
        ManagementObjectCollection diskDriveList = diskDriveClass.GetInstances();
        foreach (ManagementObject dsk in diskDriveList)
        {
            // ...
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // here it works perfectly fine
        GetDrives();
    }


    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg == WM_DEVICECHANGE)
        {
            // here it …
Run Code Online (Sandbox Code Playgroud)

c# wmi visual-studio-2005 mda

10
推荐指数
1
解决办法
3949
查看次数

标签 统计

c# ×1

mda ×1

visual-studio-2005 ×1

wmi ×1