Доброго времени суток!
Никак не могу понять как в C# передать массив array1.
Сколько я понял в C# работа с адресами не приветствуется.
Подскажите как это лучше сделать..
public static bool SendFileToPrinter(string szPrinterName)
{
bool bSuccess = false;
char[] array1 = new char[64];
bSuccess = SendBytesToPrinter(szPrinterName, array1, 64);
return bSuccess;
}
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
// How many characters are in the string?
dwCount = szString.Length;
// Assume that the printer is expecting ANSI text, and then convert
// the string to ANSI text.
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
// Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
-------------------------------------------------------------------------------------
Error 1 The best overloaded method match for 'Project.MainWnd.RawPrinterHelper.SendBytesToPrinter(string, System.IntPtr, int)' has some invalid arguments C:\Project\MainWnd.cs 220 28 Project
Error 2 Argument '2': cannot convert from 'char[]' to 'System.IntPtr' C:\Project\MainWnd.cs 220 62 Project
Спасибо!
Здравствуйте, alexparser, Вы писали:
A>A>public static bool SendFileToPrinter(string szPrinterName)
A> {
A> bool bSuccess = false;
A> char[] array1 = new char[64];
A> bSuccess = SendBytesToPrinter(szPrinterName, array1, 64); <<--- (1)
A> return bSuccess;
A> }
A>public static bool SendStringToPrinter(string szPrinterName, string szString)
A> {
A> IntPtr pBytes;
A> Int32 dwCount;
A> // How many characters are in the string?
A> dwCount = szString.Length;
A> // Assume that the printer is expecting ANSI text, and then convert
A> // the string to ANSI text.
A> pBytes = Marshal.StringToCoTaskMemAnsi(szString);
A> // Send the converted ANSI string to the printer.
A> SendBytesToPrinter(szPrinterName, pBytes, dwCount); <<--- (2)
A> Marshal.FreeCoTaskMem(pBytes);
A> return true;
A> }
A>
A>-------------------------------------------------------------------------------------
A>Error 1 The best overloaded method match for 'Project.MainWnd.RawPrinterHelper.SendBytesToPrinter(string, System.IntPtr, int)' has some invalid arguments C:\Project\MainWnd.cs 220 28 Project
A>Error 2 Argument '2': cannot convert from 'char[]' to 'System.IntPtr' C:\Project\MainWnd.cs 220 62 Project
Это так и должно быть, что в одном случае вы вызываете SendBytesToPrinter с char[] в кач-ве 2-го параметра, а во втором случае — с IntPtr ?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, alexparser, Вы писали:
A>>A>>public static bool SendFileToPrinter(string szPrinterName)
A>> {
A>> bool bSuccess = false;
A>> char[] array1 = new char[64];
A>> bSuccess = SendBytesToPrinter(szPrinterName, array1, 64); <<--- (1)
A>> return bSuccess;
A>> }
A>>public static bool SendStringToPrinter(string szPrinterName, string szString)
A>> {
A>> IntPtr pBytes;
A>> Int32 dwCount;
A>> // How many characters are in the string?
A>> dwCount = szString.Length;
A>> // Assume that the printer is expecting ANSI text, and then convert
A>> // the string to ANSI text.
A>> pBytes = Marshal.StringToCoTaskMemAnsi(szString);
A>> // Send the converted ANSI string to the printer.
A>> SendBytesToPrinter(szPrinterName, pBytes, dwCount); <<--- (2)
A>> Marshal.FreeCoTaskMem(pBytes);
A>> return true;
A>> }
A>>
A>>-------------------------------------------------------------------------------------
A>>Error 1 The best overloaded method match for 'Project.MainWnd.RawPrinterHelper.SendBytesToPrinter(string, System.IntPtr, int)' has some invalid arguments C:\Project\MainWnd.cs 220 28 Project
A>>Error 2 Argument '2': cannot convert from 'char[]' to 'System.IntPtr' C:\Project\MainWnd.cs 220 62 Project
L>Это так и должно быть, что в одном случае вы вызываете SendBytesToPrinter с char[] в кач-ве 2-го параметра, а во втором случае — с IntPtr ?
Это кусок сэмпла, посему точно сказать не могу.
Думаю что совсем не обязательно char[], но что тогда..?
Пардон, коррекция по коду:
public static bool SendFileToPrinter(string szPrinterName)
{
bool bSuccess = false;
char[] array1 = new char[64];
bSuccess = SendBytesToPrinter(szPrinterName, array1, 64); <<--- (1)
return bSuccess;
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
Здравствуйте, alexparser, Вы писали:
A>Никак не могу понять как в C# передать массив array1.
Как я понял, речь идет о передаче указателя на массив в unmanaged code. В это случае нужен
fixed statement.
Здравствуйте, alexparser, Вы писали:
A>Пардон, коррекция по коду:
A>A>public static bool SendFileToPrinter(string szPrinterName)
A> {
A> bool bSuccess = false;
A> char[] array1 = new char[64];
A> bSuccess = SendBytesToPrinter(szPrinterName, array1, 64); <<--- (1)
A> return bSuccess;
A> public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
A> {
A> Int32 dwError = 0, dwWritten = 0;
A> IntPtr hPrinter = new IntPtr(0);
A> DOCINFOA di = new DOCINFOA();
A> bool bSuccess = false; // Assume failure unless you specifically succeed.
A> di.pDocName = "My C#.NET RAW Document";
A> di.pDataType = "RAW";
A> // Open the printer.
A> if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
A> {
A> // Start a document.
A> if (StartDocPrinter(hPrinter, 1, di))
A> {
A> // Start a page.
A> if (StartPagePrinter(hPrinter))
A> {
A> // Write your bytes.
A> bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
A> EndPagePrinter(hPrinter);
A> }
A> EndDocPrinter(hPrinter);
A> }
A> ClosePrinter(hPrinter);
A> }
A> // If you did not succeed, GetLastError may give more information
A> // about why not.
A> if (bSuccess == false)
A> {
A> dwError = Marshal.GetLastWin32Error();
A> }
A> return bSuccess;
A> }
A>
array1 — это char[]
pBytes — это IntPtr
В итоге у тебя типы не совпадают. Поэтому и на уровне компиляции и ошибка.
Я не понимаю почему ты так пишешь код. Логики не вижу. Но допустим у тебя есть скрытый смысл, даже очень скрытый))) Тогда продолжаем твою идею следующим образом.
за место
char[] array1 = new char[64];
пишем
IntPtr array1 = Marshal.AllocHGlobal(64);
И конечно не забываем освободить память
Marshal.FreeHGlobal();