Русский / Russian English / Английский

Сейчас на форуме: (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Юникодный листбокс в Вижуальном Басике (v5)
Посл.ответ Сообщение

Ранг: 433.8 (мудрец)
Статус: Участник

Создано: 03 ноября 2017 14:20 · Поправил: dosprog New!
Цитата · Личное сообщение · #1

Имеется программа на VB5 (использует MSVBVM50.DLL).
Её смысл - ищет рядом с собой файлы с расширением INI (*.INI)
и список имён найденных INI файлов выводит в ListBox, давая юзеру выбрать конфигурацию.
Примерно так (из VBDECOMpiler'а):

Code:
  1. VERSION 5.00
  2. Begin VB.Form frmNCSelect
  3.   Begin ListBox lstMachine
  4.   End
  5. End


работает так:
В цикле получает строчки с именами файлов INI, конвертирует их из ANSI в UNICODE и формирует
на основании этих строк список для отображения в басиковом листбоксе.

Code:
  1. 00409232   > 8B4D C0        MOV ECX,DWORD PTR SS:[EBP-40>
  2. 00409235   . 51             PUSH ECX
  3. 00409236   . 68 485A4000    PUSH 00405A48
  4. 0040923B   . FFD3           CALL EBX
  5. 0040923D   . 85C0           TEST EAX,EAX
  6. 0040923F   . 0F84 18070000  JE 0040995D
  7. 00409245   . 8B55 E4        MOV EDX,DWORD PTR SS:[EBP-1C>
  8. 00409248   . 8B45 C0        MOV EAX,DWORD PTR SS:[EBP-40>
  9. 0040924B   . 52             PUSH EDX
  10. 0040924C   . 50             PUSH EAX
  11. 0040924D   . FF15 2C824100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaStrCat
  12. 00409253   . 8BD0           MOV EDX,EAX
  13. 00409255   . 8D4D B8        LEA ECX,DWORD PTR SS:[EBP-48>
  14. 00409258   . FF15 88834100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaStrMove
  15. 0040925E   . 8B4D B8        MOV ECX,DWORD PTR SS:[EBP-48>
  16. 00409261   . 8D55 9C        LEA EDX,DWORD PTR SS:[EBP-64>
  17. 00409264   . 51             PUSH ECX
  18. 00409265   . 52             PUSH EDX
  19. 00409266   . FF15 64834100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaStrToAnsi
  20. 0040926C   . 50             PUSH EAX
  21. 0040926D   . 6A 00          PUSH 0
  22. 0040926F   . 8D45 A0        LEA EAX,DWORD PTR SS:[EBP-60>
  23. 00409272   . 68 EC3F4000    PUSH 00403FEC                ; UNICODE "maxnumber"
  24. 00409277   . 50             PUSH EAX
  25. 00409278   . FF15 64834100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaStrToAnsi
  26. 0040927E   . 50             PUSH EAX
  27. 0040927F   . 8D4D A4        LEA ECX,DWORD PTR SS:[EBP-5C>
  28. 00409282   . 68 2C3D4000    PUSH 00403D2C                ; UNICODE "Simulator_MachineSetting_MaxNumber"
  29. 00409287   . 51             PUSH ECX
  30. 00409288   . FF15 64834100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaStrToAnsi
  31. 0040928E   . 50             PUSH EAX
  32. 0040928F   . E8 78BDFFFF    CALL 0040500C
  33. 00409294   . 8985 24FFFFFF  MOV DWORD PTR SS:[EBP-DC],EA>
  34. 0040929A   . FF15 34824100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaSetSystemError
  35. 004092A0   . 8B55 9C        MOV EDX,DWORD PTR SS:[EBP-64>
  36. 004092A3   . 8D45 B8        LEA EAX,DWORD PTR SS:[EBP-48>
  37.  
  38. Имя найденного INI файла - из ANSI в UNICODE:
  39.  
  40. 004092A6     52             PUSH EDX
  41. 004092A7     50             PUSH EAX
  42. 004092A8     FF15 F0824100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaStrToUnicode
  43.  
  44. 004092AE   . 8B8D 24FFFFFF  MOV ECX,DWORD PTR SS:[EBP-DC>
  45. 004092B4   . FF15 A8824100  CALL DWORD PTR DS:[<&MSVBVM5>; MSVBVM50.__vbaI2I4
  46. 004092BA   . 8D4D 9C        LEA ECX,DWORD PTR SS:[EBP-64>
  47. 004092BD   . 8945 E8        MOV DWORD PTR SS:[EBP-18],EA>
  48. 004092C0   . 8D55 A0        LEA EDX,DWORD PTR SS:[EBP-60>
  49. 004092C3   . 51             PUSH ECX
  50. 004092C4   . 8D45 A4        LEA EAX,DWORD PTR SS:[EBP-5C>
  51. 004092C7   . 52             PUSH EDX
  52. 004092C8   . 50             PUSH EAX
  53. 004092C9   . 6A 03          PUSH 3
  54. 004092CB   . FFD7           CALL EDI
  55. 004092CD   . 8B45 CC        MOV EAX,DWORD PTR SS:[EBP-34>
  56. 004092D0   . 83C4 10        ADD ESP,10
  57. 004092D3   > 66:3B45 E8     CMP AX,WORD PTR SS:[EBP-18]
  58. 004092D7   . 0F8D 3F060000  JGE 0040991C
  59.  ............................................
  60.  ............................................


В общем, список в результате отображается.
Проблема не в этом, а в том, что он отображается нормально в WinXP/SP3 и более новых системах,
а в WinXP/SP2 в листбоксе вместо имён короткие по 2-3 левых символа строчки, явно как будто
при показе выводятся не в UNICOD'е (как должно быть), а в ANSI, но сами-то строчки юникодные.

Причём все строки в диалоге, кроме заголовка, тоже не отображаются корректно
- это и текст на кнопках, и другие текстбоксы.

Проблема, скорей всего, характерная - и раньше встречал похожее.
Есть ли способ как-то это поправить, чтобы и под WinXP/SP2 строчки в листбоксе отображались нормально?

--Добавлено--
..то ли это используемый дефолтный шрифт в более старых системах не имеет юникодных символов..
При этом софтина заявленно работает под Win2k+, правда, она азиатская.


 eXeL@B —› Программирование —› Юникодный листбокс в Вижуальном Басике (v5)

Видеокурс ВЗЛОМ