Как создать FileStream из необработанной ручки Intptr? (Dtwain)C#

Место общения программистов C#
Ответить
Anonymous
 Как создать FileStream из необработанной ручки Intptr? (Dtwain)

Сообщение Anonymous »

Я использую DLL, который извлекает изображение из сканера и возвращает его мне как intptr , который представляет собой ручку. Я пытался создать FileStream , используя необработанное указатель и сначала обернув его в SafeFileHandle , но в обоих случаях я получаю ошибку: System.io.ioException: Руководство недействительна. Как я могу прочитать данные из этой ручки? Все, что я хочу сделать, это написать байты в файл на диске. Возвращенный DIB - это разблокированный тип ручки, и пользовательское приложение должно нести ответственность за обработку DIB, вызывая функцию API Windows Globallock (), а затем в конечном итоге освободив память, вызывая функции Windows API GlobalUnlock () и GlobalFree ().

это то, что я все еще есть, чтобы использовать, даже если мы все еще есть, что -то, что я могу использовать. FileStream ? Если да, то как?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

Подробнее здесь: https://stackoverflow.com/questions/797 ... dle-dtwain
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»