Replacing a Filestream with a Memorystream

K

Kai Bohli

Hi all !

This is my first day with Visual Studio and C#, and I'm trying to send "raw data" to the printer
port. I found the SendFileToPrinter example below in a knowledge base at MS site
It works, but I need to replace the filestream with a memorystream cause there's no need to write
files and then load them again just to print.

So I rewrote the procedure and the call. The problem is of course that it dosen't work. If I replace
the MemoryStream (with FileStream) in btnPrint event, and save the result to a file it's ok. I can
copy the file directly to the port, and the printer prints ok. I know that I'm doing something wrong
in my version of the SendDocToPrinter procedure, but I don't know what. Any help are greatly
appreciated.

TIA
Best wishes
Kai Bohli
Norway

<My call to the SendDocToPrinter procedure>
private void btnPrint2_Click(object sender, System.EventArgs e)
{
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
MemoryStream memStrm = new MemoryStream();
StreamWriter sw = new StreamWriter(memStrm);
sw.WriteLine("\x02L");
sw.WriteLine("H07");
sw.WriteLine("D11");
sw.WriteLine("19110080100002510K OHM 1/4 WATT");
sw.WriteLine("1a6210000000050590PCS");
sw.WriteLine("E");
sw.WriteLine("");

LabelPrint.SendDocToPrinter(pd.PrinterSettings.PrinterName,memStrm);
sw.Close();
}

</My call to the SendDocToPrinter procedure>



<My converted version>
public static bool SendDocToPrinter( string szPrinterName, MemoryStream ms)
{ // just the lines that I've changed are present here.
BinaryReader br = new BinaryReader(ms);
Byte []bytes = new Byte[ms.Length];
nLength = Convert.ToInt32(ms.Length);

</My converted version>


<Orginal kb code>
public static bool SendFileToPrinter( string szPrinterName, string szFileName )
{
// Open the file.
FileStream fs = new FileStream(szFileName, FileMode.Open);
// Create a BinaryReader on the file.
BinaryReader br = new BinaryReader(fs);
// Dim an array of bytes big enough to hold the file's contents.
Byte []bytes = new Byte[fs.Length];
bool bSuccess = false;
// Your unmanaged pointer.
IntPtr pUnmanagedBytes = new IntPtr(0);
int nLength;

nLength = Convert.ToInt32(fs.Length);
// Read the contents of the file into the array.
bytes = br.ReadBytes( nLength );
// Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
// Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
// Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
// Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes);
return bSuccess;
}
</Orginal kb codep>



Best wishes
Kai Bohli
(e-mail address removed)
Norway
 
C

Cor

Hi Kai,

did you ask this question also in the newsgroup

microsoft.public.dotnet.languages.csharp

I think that in that newsgroup you have a better change to get your anser

Cor
This is my first day with Visual Studio and C#, and I'm trying to send "raw data" to the printer
port. I found the SendFileToPrinter example below in a knowledge base at MS site
It works, but I need to replace the filestream with a memorystream cause there's no need to write
files and then load them again just to print.

So I rewrote the procedure and the call. The problem is of course that it dosen't work. If I replace
the MemoryStream (with FileStream) in btnPrint event, and save the result to a file it's ok. I can
copy the file directly to the port, and the printer prints ok. I know that I'm doing something wrong
in my version of the SendDocToPrinter procedure, but I don't know what. Any help are greatly
appreciated.

TIA
Best wishes
Kai Bohli
Norway

<My call to the SendDocToPrinter procedure>
private void btnPrint2_Click(object sender, System.EventArgs e)
{
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
MemoryStream memStrm = new MemoryStream();
StreamWriter sw = new StreamWriter(memStrm);
sw.WriteLine("\x02L");
sw.WriteLine("H07");
sw.WriteLine("D11");
sw.WriteLine("19110080100002510K OHM 1/4 WATT");
sw.WriteLine("1a6210000000050590PCS");
sw.WriteLine("E");
sw.WriteLine("");

LabelPrint.SendDocToPrinter(pd.PrinterSettings.PrinterName,memStrm);
sw.Close();
}

</My call to the SendDocToPrinter procedure>



<My converted version>
public static bool SendDocToPrinter( string szPrinterName, MemoryStream ms)
{ // just the lines that I've changed are present here.
BinaryReader br = new BinaryReader(ms);
Byte []bytes = new Byte[ms.Length];
nLength = Convert.ToInt32(ms.Length);

</My converted version>


<Orginal kb code>
public static bool SendFileToPrinter( string szPrinterName, string szFileName )
{
// Open the file.
FileStream fs = new FileStream(szFileName, FileMode.Open);
// Create a BinaryReader on the file.
BinaryReader br = new BinaryReader(fs);
// Dim an array of bytes big enough to hold the file's contents.
Byte []bytes = new Byte[fs.Length];
bool bSuccess = false;
// Your unmanaged pointer.
IntPtr pUnmanagedBytes = new IntPtr(0);
int nLength;

nLength = Convert.ToInt32(fs.Length);
// Read the contents of the file into the array.
bytes = br.ReadBytes( nLength );
// Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
// Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
// Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
// Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes);
return bSuccess;
}
</Orginal kb codep>



Best wishes
Kai Bohli
(e-mail address removed)
Norway
 
K

Kai Bohli

Hi Cor.

Thanks, I'll try that.

Hi Kai,
did you ask this question also in the newsgroup
microsoft.public.dotnet.languages.csharp
I think that in that newsgroup you have a better change to get your anser
Cor

Best wishes
Kai Bohli
(e-mail address removed)
Norway
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top