- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 DeviceIoControl
函数(Win32 API 函数)弹出我的 CDROM 驱动器,当我的 CDROM 驱动器没有磁盘时它工作正常,但是在插入磁盘后,Marshal .GetLastWin32Error()
返回32(ERROR_SHARING_VIOLATION
:进程无法访问该文件,因为它正在被另一个进程使用),DeviceIoControl
中传递的driveHandle是由 CreateFile()
函数创建。
你能帮帮我吗?我喜欢这种操作 CD ROM 相关东西的方式,我可以使用 winmm.dll 弹出我的 CDROM 但我认为这种方式值得一试。
好的,这是代码:
using System;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace DVD_ejector
{
public partial class Form1 : Form
{
const int OPENEXISTING = 3;
const int IOCTL_STORAGE_EJECT_MEDIA = 2967560;
const uint GENERICREAD = 0x80000000;
const int INVALID_HANDLE = -1;
public Form1()
{
InitializeComponent();
DriveInfo[] drs = DriveInfo.GetDrives();
List<DriveInfo> cdRoms = new List<DriveInfo>();
foreach (DriveInfo dInfo in drs)
{
if (dInfo.DriveType == DriveType.CDRom)
{
cdRoms.Add(dInfo);
}
}
comboBox1.DataSource = cdRoms;
comboBox1.DisplayMember = "Name";
if (comboBox1.Items.Count > 0) comboBox1.SelectedIndex = 0;
button1.Click += (sender, e) =>
{
Eject(@"\\.\" + ((DriveInfo)comboBox1.SelectedItem).Name[0]+":");
};
}
[DllImport("kernel32", SetLastError=true)]
static extern IntPtr CreateFile(string fileName, uint desiredAccess, uint shareMode, IntPtr attributes,uint creationDisposition, uint flagsAndAttribute, IntPtr fileTemplate);
[DllImport("kernel32")]
static extern int CloseHandle(IntPtr fileHandle);
[DllImport("kernel32")]
static extern bool DeviceIoControl(IntPtr driveHandle, int ctrlCode, IntPtr inBuffer, int inBufferSize, IntPtr outBuffer, int outBufferSize, ref int bytesReturned, IntPtr overlapped);
int bytesReturned;
private void Eject(string cdDrive)
{
IntPtr driveHandle = CreateFile(cdDrive, GENERICREAD, 0, IntPtr.Zero, OPENEXISTING, 0, IntPtr.Zero);
try
{
if((int)driveHandle != INVALID_HANDLE)
DeviceIoControl(driveHandle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned, IntPtr.Zero);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
CloseHandle(driveHandle);
}
}
}
}
最佳答案
如错误所述,该设备正在被其他东西使用,但它在 CreateFile
调用而不是 DeviceIoControl
上失败,并且您的代码未正确检查对于失败。
您遇到共享冲突的原因是因为您试图以独占方式打开设备,如果有任何东西试图打开它或其中的文件,包括防病毒、资源管理器、搜索索引器等,这将失败。
这个更新的 Eject
函数修复了共享模式和错误处理,现在在正确的地方报告错误。
private void Eject(string cdDrive) {
IntPtr driveHandle = new IntPtr(INVALID_HANDLE);
try {
// Open the device
driveHandle = CreateFile(cdDrive, GENERICREAD, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, IntPtr.Zero, OPENEXISTING, 0, IntPtr.Zero);
if ((int)driveHandle == INVALID_HANDLE) { throw new Win32Exception(); }
// Try and eject
bool ejected = DeviceIoControl(driveHandle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned, IntPtr.Zero);
if (!ejected) { throw new Win32Exception(); }
} catch (Exception ex) {
MessageBox.Show(ex.Message);
} finally {
if ((int)driveHandle != INVALID_HANDLE) { CloseHandle(driveHandle); }
}
}
关于c# - DeviceIoControl 无法弹出非空的 CDROM 驱动器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12472770/
我怎样才能让 Linux 在不弹出 CDROM 的情况下更新它对 CDROM 大小的想法?换句话说,如何在不先弹出的情况下安装新刻录的 CDROM? 我正在对 CDROM 进行无人值守的增量备份。 m
有谁知道在 Windows 2000 或更高版本上以编程方式关闭 CD 托盘的方法?打开 CD 托盘存在,但我似乎无法关闭它,尤其是在 W2k 下。 如果可能的话,我特别想从批处理文件中寻找一种方法来
我尝试使用 DeviceIoControl 函数(Win32 API 函数)弹出我的 CDROM 驱动器,当我的 CDROM 驱动器没有磁盘时它工作正常,但是在插入磁盘后,Marshal .GetLa
我需要在 Linux 上用 C 语言编写函数来访问所有安装的 CDROM 并执行一些操作。 我可以在 BSD 上使用 count = getmntinfo(&buf, 0); 并在所有设备上循环并检查
我正在构建一个 docker 镜像,其中还涉及一个小的 yum install .我目前在防火墙和访问控制使docker pull 的位置。 , yum install等非常慢。 在我的例子中,它是一
当用户在 Linux 平台上插入或取出 CD 时,是否有一种干净的方法来检测或接收事件? 最佳答案 udev 监控硬件并将事件转发给 dbus。你只需要一些 dbus 监听器。使用 dbus-moni
我正在尝试使用 Python 模块(准确地说是 python-dvdvideo)来克隆 ISO 镜像。如果我将我的计算机上已有的 ISO 文件的文件路径传递给它,所提供的类工作正常,但如果我尝试将我的
我正在寻找一个在 Linux 上运行的 C++ 中创建的函数,如果 CDRom 媒体是 DVD,则返回 true,如果是其他任何媒体(例如音频 CD),则返回 false。 我一直在使用 ioctl
在 Linux 中检测 CDROM 介质移除和插入的最简单方法是什么?我想写一些简单的代码来处理这个问题。例如,只需为媒体插入绑定(bind)一个事件并实现处理程序。 谢谢! 最佳答案 尝试man u
2017 年 10 月 4 日更新:请参阅下面我的回答。感谢 DanielB,因为如果没有 Daniel 的帮助我无法解决问题,所以我将接受他的回答而不是我自己的回答。 我是 libvirt 和系统管
我尝试使用 PyGame 在带有 python3 的 Raspberry Pi4 上播放旧的音频 cd 收藏。 据我所知,cd audio 的数据结构与声音或流媒体不同,并且音频 CD 不像数据 CD
我是一名优秀的程序员,十分优秀!