C# как передать массив?
От: alexparser  
Дата: 31.10.10 23:47
Оценка:
Доброго времени суток!

Никак не могу понять как в 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

Спасибо!
Re: C# как передать массив?
От: Lloyd Россия  
Дата: 31.10.10 23:57
Оценка:
Здравствуйте, 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 ?
Re[2]: C# как передать массив?
От: alexparser  
Дата: 01.11.10 00:04
Оценка:
Здравствуйте, 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[], но что тогда..?
Re[3]: C# как передать массив?
От: alexparser  
Дата: 01.11.10 00:11
Оценка:
Пардон, коррекция по коду:

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;
            }
Re: C# как передать массив?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.11.10 00:58
Оценка:
Здравствуйте, alexparser, Вы писали:

A>Никак не могу понять как в C# передать массив array1.


Как я понял, речь идет о передаче указателя на массив в unmanaged code. В это случае нужен fixed statement.
Re[4]: C# как передать массив?
От: SanyaVB  
Дата: 01.11.10 13:07
Оценка:
Здравствуйте, 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();

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.