Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


Цитата MKN:
почему не сработал OemToChar ? »
У плагина System параметр t означает ANSI (однобайтную) кодировку в ANSI-сборке и юникод в юникод-сборке.
Ввод-Вывод плагина ExecDos однобайтный (в основном), поэтому нужно использовать параметр m на входе OemToChar или выходе CharToOem:
Код: Выделить весь код
System::Call 'user32::OemToChar(mr0, t.r0)'
Этот вариант будет работать и в Unicode и в ANSI сборках.

Проверка на многострочном тексте показала, что этот способ портит символы \r, \n и, наверняка, другие спецсимволы.

Более корректный универсальный ansi/unicode способ в виде макроса:
Код: Выделить весь код
!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
Пример использования:
Код: Выделить весь код
    SetOutPath "$DOCUMENTS"
    nsExec::ExecToStack  `"$SYSDIR\cmd.exe" /c "" dir /b `
    Pop $0
    Pop $0
    StrCpy $0 $0 -2
    ${OemToChar} $0
    MessageBox MB_OK "$0"

Последний раз редактировалось iglezz, 27-02-2023 в 14:20.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:53, 27-02-2023 | #2661