FormatMessage работает некорректно - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Мне необходимо отформатировать строку, используя Windows CE FormatMessage. Для теста использую следующий код:
        [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);
        }
Теоретически результат форматирования должен быть записан в formattedMessage, но нормального результата я получить не могу. Я пытался использовать FormatMessage с разными сигнатурами:
        [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);
Но нигде нормального результата не получил. Теоретически при входящей строке: "The operating system can not run %1" я должен получить: "The operating system can not run a". Но вместо этого получаю строку со случайными значениями или пустую строку. Подскажите, что я делаю не так?

Решение задачи: «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() );
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5