Цитата MKN:
почему не сработал OemToChar ? »
|
У плагина System параметр t означает ANSI (однобайтную) кодировку в ANSI-сборке и юникод в юникод-сборке.
Ввод-Вывод плагина ExecDos однобайтный (в основном), поэтому нужно использовать параметр m на входе OemToChar или выходе CharToOem:
Код:
![Выделить весь код](images/misc/selectcode.png)
System::Call 'user32::OemToChar(mr0, t.r0)'
Этот вариант будет работать и в Unicode и в ANSI сборках.
Проверка на многострочном тексте показала, что этот способ портит символы \r, \n и, наверняка, другие спецсимволы.
Более корректный универсальный ansi/unicode способ в виде макроса:
Код:
![Выделить весь код](images/misc/selectcode.png)
!define OemToChar `!insertmacro OemToChar`
!macro OemToChar STR
!ifdef NSIS_UNICODE
Push $0
System::Call 'kernel32::MultiByteToWideChar(i 1, i 0, m "${STR}", i -1, i 0, i 0) i.s'
System::Call 'kernel32::MultiByteToWideChar(i 1, i 0, m "${STR}", i -1, t.r0, i s)'
Exch $0
!else
System::Call 'user32::OemToChar(m"${STR}", t.s)'
!endif
Pop ${STR}
!macroend
Пример использования:
Код:
![Выделить весь код](images/misc/selectcode.png)
SetOutPath "$DOCUMENTS"
nsExec::ExecToStack `"$SYSDIR\cmd.exe" /c "" dir /b `
Pop $0
Pop $0
StrCpy $0 $0 -2
${OemToChar} $0
MessageBox MB_OK "$0"