I'm using this code to save bytes from a IntPtr buffer in unmanaged code to file. It's a simple callback function:
private void callback(IntPtr buffer, int length)
{
byte[] bytes = new byte[length];
Marshal.Copy(buffer, bytes, 0, length);
FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
file.Write(bytes, 0, length);
file.Close();
}
What I want is to store this data to file and throw it away. From what I understand there is a buffer in the unmanaged code and a 2nd one in MY code. I don't want to copy the data around I want it directly:
// bad: (unmanaged) buffer -> (managed) bytes -> file
// awesome: (unmanaged) buffer -> file
For my task I need the most quickest way to store the data to file.
C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...
Originally Answered: What is the full form of C ? C - Compiler . C is a general-purpose, high-level language that was originally developed by Dennis M. Ritchie to develop the UNIX operating system at Bell Labs. C was originally first implemented on the DEC PDP-11 computer in 1972.
The letter c was applied by French orthographists in the 12th century to represent the sound ts in English, and this sound developed into the simpler sibilant s.
What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.
Staying within the .NET framework is probably better form than using calls to kernel dlls.
I would use:
private void callback(IntPtr buffer, int length, String filename)
{
try
{
FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
UnmanagedMemoryStream ustream = new UnmanagedMemoryStream((byte*)buffer, length);
ustream.CopyTo(file);
ustream.Close();
file.Close();
}
catch{/** To do: catch code **/}
}
Well, it's called "managed" for some reason :-) What you can do though is declare WriteFile using P/Invoke, like this:
private void callback(IntPtr buffer, int length)
{
FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
int written;
WriteFile(file.Handle, buffer, length, out written, IntPtr.Zero);
file.Close();
}
[DllImport("kernel32.dll")]
private static extern bool WriteFile(IntPtr hFile, IntPtr lpBuffer, int NumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With