Wie erstelle ich einen filestream aus einem Roh -INTPTR -Handle? (Dtwain)C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie erstelle ich einen filestream aus einem Roh -INTPTR -Handle? (Dtwain)

Post by Anonymous »

Ich verwende eine DLL, die ein Bild von einem Scanner abruft und es mir als INTPTR zurückgibt, das einen Griff darstellt. Ich habe versucht, einen fileStream mit dem Rohzeiger zu erstellen und ihn zuerst in einen Safefilehandle zu wickeln. In beiden Fällen erhalte ich jedoch einen Fehler: System.io.ioException: Das Handle ist ungültig. Wie lese ich die Daten aus diesem Handle? Alles, was ich tun möchte, ist, die Bytes in eine Datei auf der Festplatte zu schreiben. Der zurückgegebene DIB ist ein entsperrter Handy -Typ, und die Benutzeranwendung muss für den Umgang mit der DIB verantwortlich sein, indem die Windows -API -Funktion GlobalLock () aufgerufen wird und letztendlich den Speicher befreit wird, indem die Windows -API -Funktionen GlobalUnLock () und globalFree () aufgerufen werden. FileStream ? Wenn ja, wie?static void Main(string[] args)
{
// Initialize DTWAIN
var TwainHandle = TwainAPI.DTWAIN_SysInitialize();
if (TwainHandle == IntPtr.Zero)
Console.WriteLine("TWAIN Failed to be initialized. Exiting...");
else
{
// Select a TWAIN Source from the TWAIN Dialog
var SelectedSource = TwainAPI.DTWAIN_SelectSource();
if (SelectedSource != IntPtr.Zero)
{
Console.WriteLine("Selected source");

// Display the product name of the Source
StringBuilder szInfo = new StringBuilder(256);
TwainAPI.DTWAIN_GetSourceProductNameA(SelectedSource, szInfo, 256);
Console.WriteLine("The source product name is " + szInfo.ToString());

// Start scanning
int status = -1;
var images = TwainAPI.DTWAIN_AcquireNative(SelectedSource, TwainAPI.DTWAIN_PT_DEFAULT, 1, 1, 1, ref status);
Console.WriteLine($"Return status: {status}"); // 1000 is success

// Get image handle
var dibHandle = TwainAPI.DTWAIN_GetAcquiredImage(images, 0, 0);
Console.WriteLine($"Handle: {dibHandle} - {dibHandle.ToInt64():X}");

var safeHandle = new SafeFileHandle(dibHandle, true);
if (safeHandle.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}

Console.WriteLine($"Invalid: {safeHandle.IsInvalid}, Closed: {safeHandle.IsClosed}");

// Save image
using (var sourceStream = new FileStream(safeHandle, FileAccess.Read))
{
using (var destinationStream = File.OpenWrite(@"C:\Users\ckeller\Downloads\testImage.bmp"))
{
sourceStream.CopyTo(destinationStream);
}
}

}
Console.WriteLine("Complete");
TwainAPI.DTWAIN_SysDestroy();
}
}
< /code>
Selected source
The source product name is KODAK Scanner: i5000
Return status: 1000
Handle: 89196236 - 55106CC
Invalid: False, Closed: False

Unhandled Exception: System.IO.IOException: The handle is invalid.

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.VerifyHandleIsSync()
at System.IO.FileStream..ctor(SafeFileHandle handle, FileAccess access, Int32 bufferSize, Boolean isAsync)
at System.IO.FileStream..ctor(SafeFileHandle handle, FileAccess access)
at DTwain_Test.Program.Main(String[] args) in C:\Users\ckeller\Downloads\DTwain Test\DTwain Test\Program.cs:line 95
< /code>
The library I'm using on GitHub: https://github.com/dynarithmic/twain_library

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post