FormatMessage работает некорректно - C#
Формулировка задачи:
Всем доброго времени суток.
Мне необходимо отформатировать строку, используя Windows CE FormatMessage.
Для теста использую следующий код:
Теоретически результат форматирования должен быть записан в formattedMessage, но нормального результата я получить не могу. Я пытался использовать FormatMessage с разными сигнатурами:
Но нигде нормального результата не получил.
Теоретически при входящей строке:
"The operating system can not run %1"
я должен получить:
"The operating system can not run a".
Но вместо этого получаю строку со случайными значениями или пустую строку.
Подскажите, что я делаю не так?
[Test] public void Test() { String sourceMessage = "Операционная система не может запустить %1"; 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); }
[DllImport("kernel32.dll")] static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, uint nSize, IntPtr Arguments); // the version, the sample is built upon: [DllImport("Kernel32.dll", SetLastError = true)] static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, ref IntPtr lpBuffer, uint nSize, IntPtr pArguments); // the parameters can also be passed as a string array: [DllImport("Kernel32.dll", SetLastError = true)] static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, ref IntPtr lpBuffer, uint nSize, string[] Arguments);
Решение задачи: «FormatMessage работает некорректно»
textual
Листинг программы
[DllImport( "kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode )] static extern int FormatMessage ( uint dwFlags, string lpSource, uint dwMessageId, uint dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr[] vaList ); static void Main ( ) { var sb = new StringBuilder( 256 ); var pParamArray = new IntPtr[3]; pParamArray[0] = Marshal.StringToHGlobalUni( "test" ); pParamArray[1] = (IntPtr)'F'; pParamArray[2] = (IntPtr)1024; int a = FormatMessage( 0x00000400 | 0x00002000, "Formatted message:\r\n\tstring: '%1'\r\n\tint32: '%3!i!'\r\n\tchar: '%2!c!'", 0, 0, sb, sb.Capacity, pParamArray ); Marshal.FreeHGlobal( pParamArray[0] ); Console.WriteLine( sb.ToString() ); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д