Парсинг коммандной строки

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Парсинг коммандной строки

Сообщение xolod » 09.04.2005 (Сб) 19:52

При запуске программы мне требуется распарсить коммандную строку на параметры, к примеру "C:\MyProgram\Program.exe /getch /command:p c:\some file.mp3".
Для этого есть, как и положено, специальная функция API CommandLineToArgv. И она великолепно справляется со своей задачей, если ей передавать в качестве коммандной строки результат работы другой API GetCommandLine. И все бы хорошо. Но иногда мне надо распарсивать строку, приходящую из вне (то есть получить ее GetCommandLine'ом я не могу. Вот тут и начинаются проблемы. CommandLineToArgv напрочь теряет все функции. Во первых не определяет, где что в кавычках, во вторых возвращает не правильные кол-во параметров. Вообщем - ведет себя очень странно.
Что по советуете.

ps: Старался изъясняться как можно более ясно, но если отдельные моменты не понятны, вы спросите. У меня уже просто башка кругом идет, не все толково объяснить могу.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Re: Парсинг коммандной строки

Сообщение Sedge » 09.04.2005 (Сб) 20:46

xolod писал(а):Но иногда мне надо распарсивать строку, приходящую из вне

Это как? А когда ты ее можешь получить через GetCommandLine, она откуда приходит?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 09.04.2005 (Сб) 23:00

2 xolod

Сделай свою собственную функцию типа этой:

Private Function GetCommandArray() As Variant
Dim sChar, CmdLine As String
Dim CmdLineLen, i, MaxArgs, NumArgs As Long
Dim InArg As Boolean
MaxArgs = 16
ReDim ArgArray(MaxArgs)
NumArgs = 0
InArg = False
CmdLine = Command$
CmdLineLen = Len(CmdLine)
For i = 1 To CmdLineLen
sChar = Mid$(CmdLine, i, 1)
If (sChar <> Chr$(32) And sChar <> vbTab) Then
If Not InArg Then
If NumArgs = MaxArgs Then Exit For
NumArgs = NumArgs + 1
InArg = True
End If
ArgArray(NumArgs) = ArgArray(NumArgs) & sChar
Else
InArg = False
End If
Next i
ReDim Preserve ArgArray(NumArgs)
GetCommandArray = ArgArray()
End Function

И парсь всё что душе угодно (и как угодно) :)

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 09.04.2005 (Сб) 23:19

2 Sedge
Она приходит из другой копии этой же программы путем SendMessage в составе структуры COPYDATASTRUCT по WM_COPYDATA

2 BV
Свой парсинг - он конечно хорошо, и написать я его в состоянии. Только не всегда корректно (в отличие от API) и медленно.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 10.04.2005 (Вс) 1:41

Все спасибо.
Вопрос решен.
Путем перекапывания MSDN было выяснено, что GetCommandLine абсолютно до светильника, какую строку ей пихают.
Разница только в методе получения коммандной строки путем GetCommandLine, либо через OLE GUI приложений, к примеру я на свой EXE какой-либо файл перетащил, либо через консоль. Во втором случае имя файла в передаваемой командной строке не терминируется кавычками. Из-за этого и все заморочки.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 193

    TopList