App.Path, App.EXEName вопросительные знаки в англоязычных ОС

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

App.Path, App.EXEName вопросительные знаки в англоязычных ОС

Сообщение Adam Smith » 11.02.2022 (Пт) 2:35

Перепроверял в
    Windows XP x64 En
    Windows 2008 x64 En
    Windows 2012 x64 En
ОС с интерфейсом на английском нормально отображает пути и имена файлов в национальных кодировках, и кириллические в т.ч.
В таких ОС App.Path и App.EXEName вместо русских названий папки и файла возвращают только вопросительные знаки и латиницу.

В таких ОС попытки получить например App.Comments вызывают краш приложения с ошибкой чтения ресурса VERSIONINFO.
Вот такое решение нормально работает:
Код: Выделить всё
Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameW" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Код: Выделить всё
    Const MAX_PATH = 32000 '260

    Dim ModuleName As String, sNameTXT As String
    ModuleName = String$(MAX_PATH, vbNullChar)
    GetModuleFileName App.hInstance, ModuleName, MAX_PATH
    ModuleName = StrConv(ModuleName, vbFromUnicode)
    ModuleName = Left$(ModuleName, InStr(ModuleName, vbNullChar) - 1)
    sNameTXT = Right$(ModuleName, Len(ModuleName) - InStrRev(ModuleName, "\"))
Последний раз редактировалось Adam Smith 12.02.2022 (Сб) 3:59, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение Хакер » 11.02.2022 (Пт) 6:20

Adam Smith писал(а):WshFSO.GetFolder(".").Path

Но это совершенно не App.Path, это CurDir.

MsgBox WshShell.CurrentDirectory

То же самое: это CurDir, а не App.Path

CurDir и App.Path только в редких случаях совпадают. Если программа запущена из командной строки и там текущая директория была другой, или если програма запущена через ярлык, и в свойствах ярлыка указана другая рабочая директория, то она будет другой изначально. Кроме того, рабочая директория (CurDir) может легко и многократно меняться по ход работы программы. Во-первых явно: ChDrive+ChDir, во-вторых неявно, например, насколько я помню, диалог выбора/сохранения папки её меняет.

попробовал вот так, но это не работает

Дурацкий код. Коль уж мы работаем с юникодом, то и не должны закладываться на ограничение MAX_PATH, ибо для юникода ограничение существенно большее. Где объвление GetModuleFileName-то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение Adam Smith » 12.02.2022 (Сб) 2:18

Хакер писал(а):Но это совершенно не App.Path, это CurDir.
MsgBox WshShell.CurrentDirectory

То же самое: это CurDir, а не App.Path
CurDir и App.Path только в редких случаях совпадают. Если программа запущена из командной строки и там текущая директория была другой, или если программа запущена через ярлык, и в свойствах ярлыка указана другая рабочая директория, то она будет другой изначально. Кроме того, рабочая директория (CurDir) может легко и многократно меняться по ход работы программы. Во-первых явно: ChDrive+ChDir, во-вторых неявно, например, насколько я помню, диалог выбора/сохранения папки её меняет.
попробовал вот так, но это не работает

Дурацкий код. Коль уж мы работаем с юникодом, то и не должны закладываться на ограничение MAX_PATH, ибо для юникода ограничение существенно большее. Где объявление GetModuleFileName-то?

Ты прав, как обычно. Только я не понял, неужели я отредактировал свой первый пост после твоего комментария в 6 утра?
К сожалению до настоящего момента я не видел твой коммент. Кое-как нашел нормальный, рабочий вариант.

Тебе лучше, чем мне понятна суть проблемы App.Path, App.EXEName в аглоязычных виндусах.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение Adam Smith » 12.02.2022 (Сб) 2:43

В англоязычных ОСях, где в консолях OEM кодировка CP437 консольные утилиты могут выдавать вот такую дичь:
?? ??? ??? ??? ??? ??

??? ??? ??? ?? ??: mrinfo [-n?] [-i ??? ??] [-t ??? ?? ??] [-r ??? ??? ??] ??? ??? ??? ??? ??

-n ??? ??? ?? ?? IP-??? ??? ? ??? ??? ?? ??? ?? ??
-i ??? ?? ??? ?? ?? ??? ?? ??? ??? ?? ?? ??? ??? ?? ?? ? ??? ??? ?? ??? ??? ?? ?? ??? ?? ??
-t ??? ?? ?? ??? ?? ?? ??? IGMP-??? ??? ?? (? ???). ?? ??? ??? ??? ??? ?? 3 ???.
-r ??? ??? ?? ??? ?? ??? ??? ?? ??? ??? ?? SNMP-??? ??? ??. ?? ??? ??? ??? ??? ?? 0.
-? ??? ?? ?? ?? ??? ?? ??

??? ??? ??? ??? ?? ??? ??? ??? ?? ?? ?? ??? ??? ?? ??
Прикол в том, что это не какой-то голимый индус быдлокодинг, это Микрософтовская утилита mrinfo
Последний раз редактировалось Adam Smith 12.02.2022 (Сб) 2:48, всего редактировалось 1 раз.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение The trick » 12.02.2022 (Сб) 2:47

Adam Smith, отличный вывод :lol:
UA6527P

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение Adam Smith » 12.02.2022 (Сб) 2:49

The trick писал(а):Adam Smith, отличный вывод :lol:
Отлично - это описание моей жизни :) страничку обнови
И вообще я нихрена не понял о чём ты пишешь, яш тупой капец.
Так что объясняй как школьнику, что именно Отлично.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение Adam Smith » 12.02.2022 (Сб) 12:41

Код: Выделить всё
Private Declare Function OemToChar Lib "user32" Alias "OemToCharW" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
вот так объявил функцию и преобразую:
Код: Выделить всё
    sTextANSI = String$(Len(sText, vbNullChar)
    If OemToChar(sText, sTextANSI) = 1 Then sText = StrConv(sTextANSI, vbFromUnicode)
потом пишу в файл
Код: Выделить всё
    Set oStream = WshFSO.OpenTextFile(sFileTXT, ForWriting, CreateTrue, TristateUnicode)
    oStream.Write sText
в результате вот такой бред в Unicode-файле вместо переводов строки Cr Lf:
Не был указан адрес♪♪◙♪♪◙♪♪◙Использование: mrinfo [-n?] [-i Адрес] [-t Таймаут] [-r Повторов] УзелНазначения♪♪◙ ♪♪◙ -n Отображать IP-адреса в числовом формате♪♪◙ -i Адрес Указать адрес локального интерфейса с которого отправлять
Неужели обязательно построчно читать текстовик CP866, преобразовывать и записывать построчно?

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: App.Path, App.EXEName вопросительные знаки в англоязычны

Сообщение Adam Smith » 20.05.2022 (Пт) 23:16

Хакер писал(а):Дурацкий код. Коль уж мы работаем с юникодом, то и не должны закладываться на ограничение MAX_PATH, ибо для юникода ограничение существенно большее. Где объвление GetModuleFileName-то?

Нормальный код написать я не способен в принципе :cyclops:, вот например, зацени, ато я так и не ответил где объвление

Код: Выделить всё
Private Declare Function SendMessage Lib "user32.dll" _
                Alias "SendMessageA" (ByVal hWnd As Long, _
                                      ByVal wMsg As Long, _
                                      ByVal wParam As Long, _
                                      ByVal lParam As Long) As Long

Private Declare Function GetModuleFileName Lib "kernel32.dll" _
                Alias "GetModuleFileNameW" (ByVal hModule As Long, _
                                            ByVal lpFileName As String, _
                                            ByVal nSize As Long) As Long

Private Declare Function ExtractIconEx Lib "shell32.dll" _
                Alias "ExtractIconExW" (ByVal lpszFile As String, _
                                        ByVal nIconIndex As Long, _
                                        ByRef phiconLarge As Long, _
                                        ByRef phiconSmall As Long, ByVal nIcons As Long) As Long

With Me
    .Caption = LoadResString(1&)

'32х битные иконки
    .Icon = Nothing                     ' удаляем корявую иконку если она была
'Unicode App.Path\App.EXEName в первозданном национальном алфавите
    Const MAX_PATH = 32000&
    Dim UnicodeEXE As String

    UnicodeEXE = String$(MAX_PATH, vbNullChar)
    UnicodeEXE = Left$(UnicodeEXE, GetModuleFileName(App.hInstance, UnicodeEXE, MAX_PATH) * 2&)

    Const WM_SETICON As Long = 128& ' &H80
    Const ICON_SMALL As Long = 0&   ' значок в уголке окна
    Const ICON_BIG As Long = 1&     ' значок в окне alt-tab
    Dim lIcoB As Long
    Dim lIcoS As Long
    ExtractIconEx UnicodeEXE, 0&, lIcoB, lIcoS, 1&
'    lIcoB = LoadResPicture(2&, vbResIcon)
    SendMessage .hWnd, WM_SETICON, ICON_BIG, ByVal lIcoB
    SendMessage .hWnd, WM_SETICON, ICON_SMALL, ByVal lIcoS


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList