Hi,
ich versuche gerade die Funktion DeviceIoControl (msdn.microsoft.com/en-us/libra…op/aa363216(v=vs.85).aspx) der WinAPI aufzurufen um ein Laufwerk zu steuern.
In VB lässt sich die Funktion sehr einfach verwenden:
Wenn ich die gleiche Funktion in C++ aufrufe, wird mein Prozess vom Betriebssystem "nach Erhalt eines Signales" angehalten (genaueres sagt mir der Debugger vom Qt Creator nicht). Allerdings erfüllt die Funktion trotzdem noch ihre Aufgabe, also z. B. das Laufwerk zu (ent)sperren. So falsch kann der Code also garnicht sein:
An das DeviceHandle komme ich mit der CreateFile-Funktion:
Wie gesagt, in VB funktioniert es und in C++ auch, aber die Anwendung hängt sich auf. Hat jemand eine Idee, was ich falsch mache?
ich versuche gerade die Funktion DeviceIoControl (msdn.microsoft.com/en-us/libra…op/aa363216(v=vs.85).aspx) der WinAPI aufzurufen um ein Laufwerk zu steuern.
In VB lässt sich die Funktion sehr einfach verwenden:
Wenn ich die gleiche Funktion in C++ aufrufe, wird mein Prozess vom Betriebssystem "nach Erhalt eines Signales" angehalten (genaueres sagt mir der Debugger vom Qt Creator nicht). Allerdings erfüllt die Funktion trotzdem noch ihre Aufgabe, also z. B. das Laufwerk zu (ent)sperren. So falsch kann der Code also garnicht sein:
An das DeviceHandle komme ich mit der CreateFile-Funktion:
VB.NET-Quellcode
- _DriveInfo = Drive
- _DriveHandle = CreateFile("\\.\" & _DriveInfo.Name(0) & ":", CType(&H80000000 Or &H40000000, FileAccess), FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, &H80, IntPtr.Zero)
- If _DriveHandle = IntPtr.Zero OrElse _DriveHandle.ToInt32 = -1 Then
- Throw New Win32Exception(Marshal.GetLastWin32Error(), "Couldn't create the drive handle. The drive must be a optical drive.")
- End If
Quellcode
- rootPathName = L"\\\\.\\" + rootPathName; //rootPathName enthält die richtige Zeichenfolge (mit debugger geprüft) -> daran liegt es nicht
- handle = CreateFile(rootPathName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if(handle == INVALID_HANDLE_VALUE)
- {
- IoException ex("The drive handle couldn't be created.");
- throw ex; // exception wird nicht ausgeworfen
- }
Wie gesagt, in VB funktioniert es und in C++ auch, aber die Anwendung hängt sich auf. Hat jemand eine Idee, was ich falsch mache?