Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634

Не запускается файл, если в его пути содержится кириллица

12.05.2015, 13:13. Показов 8560. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Прошу помочь. Запутался в трех соснах...
Код простейший, в чем проблема не понимаю...

Visual Basic
1
2
3
4
5
6
7
8
9
 Dim intFreeFile as Integer, intRetCodes as Integer
 
 intFreeFile  = freefile 
 Open "runScript.cmd" for output as intFreeFile 
    Print #intFreeFile, "@Echo off"
    Print #intFreeFile, chr (34)  & app.path & "\Progs.exe" & chr (34)
 Close intFreeFile 
 
  intRetCodes = Shell(chr (34)  & app.path & "\runScript.cmd" & chr (34),vbNormalFocus)
Если в пути к файлу "Progs.exe" нет кириллицы, все запускается. Если есть, фонарь. Причем в режиме просмотра "runScript.cmd" вижу символы (кириллицу). Во время исполнения "runScript.cmd" вместо кириллицы "абра кадабра"
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2015, 13:13
Ответы с готовыми решениями:

Не сохраняется текстовый файл, если в его пути присутствует кириллица
Добрый день. Читаю книгу Шлее, дошел до создания блокнота. Все работает за исключением одного - если в пути есть русские буквы, то при...

Qdesktopservice::openurl - некорректная работа с файлами, в пути которых содержится кириллица
Вопрос заключается в следующем если я открываю файл полный путь которого содержит русские буквы файл не открывается ...

Fopen не видит файл, если в его пути содержатся русские символы
Здравствуйте! Столкнулся с очень неприятной проблемой. Моя программа получает путь к нужному файлу и через строковую переменную...

12
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.05.2015, 13:43
Это нормально.
Читайте тут, лучше не расскажу
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.05.2015, 13:45
Потому что стандартная кодировка в командной строке - это OEM-866.

Следовательно здесь 2 варианта:
1) Перекодировать из ANSI в OEM-866 (программа не запустится, если в пути к ней будут символы за пределами ASCII, т.е. юникод по типу китайских символов)
2) Получить короткий путь в формате 8.3 функцией GetShortPathName (не сработает, если файл был создан без 8.3-алиаса, т.е. режим создания коротких имен файлов был отключен через политики или не поддерживается файловой системой).

P.S. Вопрос: зачем это вообще нужно, хотелось бы задать, но не буду.
3
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
12.05.2015, 13:49
kreotodr, а попробуй создать заранее файл runScript.cmd с кодировкой Юникод через блокнот..
если все получится, по пустой файл в этой кодировке храни в ресурсах, и при необходимости извлекай...
это как вариант, а так да, нужно с кодировкой работать.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
12.05.2015, 13:50
Лучший ответ Сообщение было отмечено kreotodr как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Declare Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
 
Dim intFreeFile As Integer, intRetCodes As Integer
Dim str    As String
 
intFreeFile = FreeFile
Open "runScript.cmd" For Output As intFreeFile
   Print #intFreeFile, "@Echo off"
   str = Chr(34) & App.Path & "\Progs.exe" & Chr(34)
   CharToOem str, str
   Print #intFreeFile, str
Close intFreeFile
 
intRetCodes = Shell(Chr(34) & App.Path & "\runScript.cmd" & Chr(34), vbNormalFocus)
3
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
12.05.2015, 14:06
или так можно

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Dim intFreeFile as Integer, intRetCodes as Integer
 
 intFreeFile  = freefile 
 Open "runScript.cmd" for output as intFreeFile 
    Print #intFreeFile, "@Echo off"
    Print #intFreeFile, chr (34)  & app.path & "\Progs.exe" & chr (34)
 Close intFreeFile 
 
 
Dim FullName as String
FullName = "runScript.cmd"
Dim txt as String
 
With CreateObject("ADODB.Stream")
    .Type = 2
    .Charset = "windows-1251"
    .Open
    .LoadFromFile FullName
    txt = .ReadText()
    .Close
 
    .Charset = "cp866"
    .Open
    .WriteText (txt)
    .SaveToFile FullName, 2
    .Close
End with
 
intRetCodes = Shell(chr (34)  & app.path & "\runScript.cmd" & chr (34),vbNormalFocus)
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.05.2015, 14:10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Yury Komar, в принципе это возможно, если изменить кодовую страницу консоли командой chcp 65001 (UTF-8),
но тогда все равно придется писать код для конвертирования кодировки текста с ANSI уже в UTF-8.
UTF-16 не поддерживается.

Способ через преобразование в 8.3.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Option Explicit
Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal cchBuffer As Long) As Long
 
Const MAX_PATH As Long = 260&
 
Private Sub Form_Load()
    Dim intFreeFile As Integer, intRetCodes As Integer, str    As String
 
    intFreeFile = FreeFile
    Open "runScript.cmd" For Output As intFreeFile
        Print #intFreeFile, "@Echo off"
        str = Chr(34) & App.Path & "\Progs.exe" & Chr(34)
        Print #intFreeFile, PathToDOS(str)
    Close intFreeFile
    
    intRetCodes = Shell(Chr(34) & App.Path & "\runScript.cmd" & Chr(34), vbNormalFocus)
End Sub
 
Public Function PathToDOS(Path As String)
    On Error GoTo ErrorHandler:
    Dim AltName         As String
    Dim SizeOfAltName   As Long
    
    AltName = Space$(MAX_PATH + 1&)
    SizeOfAltName = GetShortPathName(StrPtr(Path), StrPtr(AltName), MAX_PATH + 1&)
    If SizeOfAltName <> 0& Then
        AltName = Left$(AltName, SizeOfAltName)
        If StrComp(AltName, Path, 1) <> 0& Then PathToDOS = AltName
    End If
    Exit Function
ErrorHandler:
End Function
4
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
12.05.2015, 16:43  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Код Visual Basic
Всем. спасибо!
Проверил вариант от The trick
Анатолий Вам как всегда респектище!!!!!!

Вопрос снят
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
26.08.2015, 08:33  [ТС]
Еще раз всем привет!
Пользовался методом Анатолия Кривоуса, но заметил что не работает, когда в имени пути есть символ "—", не путать с "-".

Попробовал Способ через преобразование в 8.3., однако SizeOfAltName всегда равено "0" в результате ничего не декодирует....
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
26.08.2015, 10:14
Замените App.Path на AppFullPathW()
И добавьте в код эту функцию:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Const MAX_PATH      As Long = 260&
 
Private Declare Function GetModuleFileName Lib "kernel32.dll" Alias "GetModuleFileNameW" (ByVal hModule As Long, ByVal lpFileName As Long, ByVal nSize As Long) As Long
 
Public Function AppFullPathW() As String
    Static ProcPath As String
    Dim cnt         As Long
 
    If Len(ProcPath) <> 0 Then AppFullPathW = ProcPath: Exit Function
    'If inIDE Then AppFullPathW = App.Path & "\" & App.EXEName: Exit Function
 
    ProcPath = String$(MAX_PATH, vbNullChar)
    cnt = GetModuleFileName(0&, StrPtr(ProcPath), Len(ProcPath)) 'hproc can be 0 (mean - current process)
    
    If cnt = MAX_PATH Then 'Path > MAX_PATH -> realloc
        ProcPath = String$(32767&, vbNullChar)
        cnt = GetModuleFileName(0&, StrPtr(ProcPath), Len(ProcPath))
    End If
    If cnt = 0 Then                          'clear path
        ProcPath = App.Path & "\" & App.EXEName
    Else
        ProcPath = Left$(ProcPath, cnt)
        If StrComp("\SystemRoot\", Left$(ProcPath, 12), 1) = 0 Then ProcPath = Environ("SystemRoot") & Mid$(ProcPath, 12)
        If "\??\" = Left$(ProcPath, 4) Then ProcPath = Mid$(ProcPath, 5)
    End If
    AppFullPathW = ProcPath
End Function
Добавлено через 5 минут
kreotodr, по-хорошему: процесс, у пути (имени) к которому есть символы за пределами ASCII, нужно создавать через CreateProcessW,
а не производить всякие перекодировки вида ANSI->DOS, Unicode -> ShortPathName, чтобы запускать через батник.
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
26.08.2015, 10:25  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
нужно создавать через CreateProcessW,
Спасибо за помощь...

Примерчика с CreateProcessWпод рукой не найдется....???
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
26.08.2015, 14:25
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Option Explicit
 
Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type
 
Private Type STARTUPINFO
    cb As Long
    lpReserved As Long
    lpDesktop As Long
    lpTitle As Long
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type
 
Private Declare Function CreateProcessW Lib "kernel32.dll" (ByVal lpApplicationName As Long, ByVal lpCommandLine As Long, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoW" (lpStartupInfo As STARTUPINFO)
 
Private Sub Form_Load()
    ProcessRun App.Path & "\HijackThis.exe"
    Unload Me
End Sub
 
Public Function ProcessRun(FilePath As String) As Boolean
    On Error GoTo ErrorHandler
    
    Dim si          As STARTUPINFO
    Dim pi          As PROCESS_INFORMATION
    
    GetStartupInfo si                                   ' клонируем структуру текущего процесса
    
    If CreateProcessW(StrPtr(FilePath), _
                        0&, _
                        ByVal 0&, _
                        ByVal 0&, _
                        False, _
                        0&, _
                        0&, _
                        0&, _
                        si, _
                        pi) Then
        ProcessRun = True
    Else
        Err.Raise 51
    End If
    
    If pi.hThread <> 0 Then CloseHandle pi.hThread
    If pi.hProcess <> 0 Then CloseHandle pi.hProcess
    Exit Function
ErrorHandler:
    Debug.Print "LastDllErr: " & Err.LastDllError
End Function
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
08.05.2018, 06:53  [ТС]
Добрый день всем!
Искал решение проблемы.И нашел свою тему....)))
Все решения, перечисленные в данных примерах не всегда корректно работают...
Например с папками вида "MainForm — копия". Как оказалось, решение тривиально простое, В батник первой строкой, (как вариант) chcp 125
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2018, 06:53
Помогаю со студенческими работами здесь

Не воспроизводится файл, если соединить строку пути до него и его имя
имеется вот такой код: TListItem * ListIt; AnsiString a = stringArray; AnsiString a1 = stringArray1; ListIt =...

Даны строки S и S нулевое.Проверить, содержится ли строка S нулевое в строке S. Если содержится, то вывести TRUE, если не содержится, то FALSE.
Помогите с такой вот программой пожалуйста... Даны строки S и S нулевое.Проверить, содержится ли строка S нулевое в строке S. Если...

Если в наборе содержится число 2, то вывести сумму его элементов
Нужно решение задач перевести с паскаля на Си, сам не нарю как это сделать... 1.Даны целые числа K, N, а также K наборов целых чисел...

Скомпилированный exe файл не запускается по пути с кириллицей
В Intellij IDEA собрал проект(Build Artifacts), вроде всё хорошо, запускается. Но есть 1 проблема, стоит перенести папку или переименовать...

Имеется файл, в котором содержится размерность массива и его элементы
Имеется файл, в котором содержится размерность массива и его элементы. Вычислить: A. количество элементов массива, больших С; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru