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() );
}