powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# - Не могу разобраться с FormatMessage
16 сообщений из 16, страница 1 из 1
C# - Не могу разобраться с FormatMessage
    #38773643
Aleks Eustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.
Пытаюсь разобраться с FormatMessage(Windows CE).
Пытаюсь отформатировать строку, но результат, который должен быть записан в formattedMessage, некорректный.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
[DllImport("kernel32.dll", SetLastError = true)]
        static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, uint nSize, string[] Arguments);
       
        [Test]
        public void Test()
        {
            try
            {
                throw new Win32Exception(0x000000B6);
            }
            catch (Win32Exception e)
            {
                String sourceMessage = e.Message;
                StringBuilder formattedMessage = new StringBuilder();
                string[] args = new string[] {"a"};
                const uint FORMAT_MESSAGE_FROM_STRING = 0x00000400;
 
                IntPtr lpSource = Marshal.StringToHGlobalUni(sourceMessage);
                String res = Marshal.PtrToStringAuto(lpSource);
                uint dwChars = FormatMessage(
                    FORMAT_MESSAGE_FROM_STRING,
                    lpSource,
                    0,
                    0, 
                    formattedMessage,
                    256 * 256,
                    args);
                int a = 0;
            }
        }


Есть идеи, что я делаю не так?
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38773944
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Aleks Eustasчто я делаю не так?
Самое главное, что вы делаете не так - тащите в C# DllImport("kernel32.dll")
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38773959
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Самое главное, что вы делаете не так - тащите в C# DllImport("kernel32.dll")
Ну-ну. И pinvoke - тоже ересь, да?
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774015
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры ПавловныCat2Самое главное, что вы делаете не так - тащите в C# DllImport("kernel32.dll")
Ну-ну. И pinvoke - тоже ересь, да?
Нет, это кривой костыль. Понятно, что сишникам при переходе на Нет проще пользоваться до боли знакомыми вызовами функций API, чем найти в мануале класс, который это делает, но это не говорит о том, что такой подход правильный.

Если бы ТС в вопросе указал зачем это ему надо, то, возможно, можно бы было дать ответ как это сделать на чистом Нет
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774032
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Нет, это кривой костыль.
Скажите, а как вы на чистом .Net сделаете отображение консоли без смены типа проекта ни Console Application?
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774053
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры Павловны,

На извращенные требования - извращенный ответ

Код: c#
1.
2.
3.
4.
5.
string f = Path.GetTempFileName();

File.WriteAllText(f,"static extern uint FormatMessage");

Process.Start("cmd",String.Format(@"/k type {0}",f));
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774060
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2На извращенные требования - извращенный ответ
Ну а теперь выводите туда Console.WriteLine. В любом произвольном месте проекта.
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774074
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры ПавловныCat2На извращенные требования - извращенный ответ
Ну а теперь выводите туда Console.WriteLine. В любом произвольном месте проекта.
Сами выводите, если нее в курсе чем это закончится
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774076
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Сами выводите, если нее в курсе чем это закончится
В случае вами предложенного кода - ничем, разумеется. А у меня всё выводится:
Код: c#
1.
2.
3.
4.
5.
6.
[DllImport("kernel32.dll",
    EntryPoint = "AllocConsole",
    SetLastError = true,
    CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774083
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры ПавловныCat2Сами выводите, если нее в курсе чем это закончится
В случае вами предложенного кода - ничем, разумеется. А у меня всё выводится:
Код: c#
1.
2.
3.
4.
5.
6.
[DllImport("kernel32.dll",
    EntryPoint = "AllocConsole",
    SetLastError = true,
    CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();


Объясните мне, пожалуйста, зачем нужен консольный вывод из приложения WinForms?
Ввод с консоли там тоже нужен?
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774096
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Объясните мне, пожалуйста, зачем нужен консольный вывод из приложения WinForms?
Ввод с консоли там тоже нужен?
А вы не задумывались, зачем вообще нужен Console.WriteLine? Такие слова, как логирование, отладочный вывод вам ни о чем не говорят?
Ну, в любом случае консоль - это частный пример. Применение пинвоков уже разбирали тут . .Net FW не всемогущ, и время от времени возникают задачи, которые выходят за границы возможностей стандартного набора классов. Здесь и появляется p/invoke - который есть неотъемлемая часть языка, и который никак не может быть костылем.
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774101
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры ПавловныА вы не задумывались, зачем вообще нужен Console.WriteLine? Такие слова, как логирование, отладочный вывод вам ни о чем не говорят?
Задумывался. Не нужен он для винформс. Логировать можно и нужно в журналы, отладочный вывод делать в текстовые логи
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774103
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры ПавловныNet FW не всемогущ, и время от времени возникают задачи, которые выходят за границы возможностей стандартного набора классов.
Да. Наверняка есть такие задачи. Так пишите их на С++.
С# для прикладных задач, а не для написания своей ОС.

Еще раз. Расскажите мне для чего в приложении ВинФормс может понадобится консольный вывод? Это тоже, частный пример
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774148
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныТакие слова, как логирование, отладочный вывод вам ни о чем не говорят?
говорят, что инструмент должен быть адекватен задаче

Если даже приспичит для логирования использовать Console - Console.SetOut в помощь

PS P/Invoke если что меня лично никак не напрягает
...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774203
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks Eustas,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern uint FormatMessage(
            uint dwFlags,
            IntPtr lpSource,
            uint dwMessageId,
            uint dwLanguageId,
            [Out] StringBuilder lpBuffer,
            uint nSize,
            string[] arguments);

        private const uint FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000;
        private const uint FORMAT_MESSAGE_FROM_STRING = 0x00000400;

        private static string FormatCoreMessage(string formatExpression, string[] formatArgs)
        {
            const uint size = 101;
            var msgBuilder = new StringBuilder((int)size);
            var formatPtr = Marshal.StringToHGlobalAnsi(formatExpression);
            FormatMessage(
                FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                formatPtr,
                0,
                0,
                msgBuilder,
                size,
                formatArgs);
            return msgBuilder.ToString();
        }

        private static void Main(string[] args)
        {
            const string formatExpression = "%1,%2%!";
            string[] formatArgs = { "Hello", "World" };
            Console.WriteLine("The  message is {0}", FormatCoreMessage(formatExpression, formatArgs));
            Console.Read();
        }

    }


...
Рейтинг: 0 / 0
C# - Не могу разобраться с FormatMessage
    #38774225
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Так пишите их на С++.
Зачем, если C# тоже позволяет это сделать в две строчки кода?
Cat2Расскажите мне для чего в приложении ВинФормс может понадобится консольный вывод? Это тоже, частный пример
Еще раз - для логирования. Логировать можно хоть в таблицы БД - но консоль один из способов, и почему бы им не пользоваться, если это делается очень просто? Вот хочется мне видеть глазами, и именно в процессе выполнения, что происходит. И эта хотелка не особенно затратна.
И далее. Пример с логированием - это просто пример. В реальной жизни поводов применения p/invoke куда больше. И они не сложнее в реализации по сранению с плюсами. А ТС вообще работает с WinCE, и, сильно подозреваю, это какая-то эбеддщина, где пинвоки приходится применять через раз. Человек вполне может не знать C++ - но если он в ладах с C#, то почему бы не использовать вполне нативную технологию?
И P.S. Такая боязнь пинвоков - это от плохого знания того, что за ними?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# - Не могу разобраться с FormatMessage
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]