Простой парсер аргументов командной строки - VB

Узнай цену своей работы

Формулировка задачи:

Рылся в интернете - не нашел. Хотелось, конечно, RegExp. Написал сам. В боевіх условиях вместо переменной St подставляем Command Это все нужно, если аргументами командной строки могут попадаться пути с пробелами (как и положено, заключенные кавычками).
Листинг программы
  1. Sub Parse_CMD_Line()
  2. Dim Lex, St$, nL&, nA&, Unit$
  3. St = "c:\123\test.exe 123 ""456"" ""789 0123"" aaa BBB """"" 'Строка для разбора (пример)
  4. Debug.Print St
  5. If Len(St) = 0 Then Exit Sub
  6. Lex = Split(St) 'Разбиваем по пробелам для лексического анализа
  7. ReDim argv(0 To UBound(Lex)) 'Определяем выходной массив до максимально возможного числа параметров
  8. Do While nL <= UBound(Lex)
  9. Unit = Lex(nL) 'Записысаем смысловую единицу
  10. If Len(Unit) = 0 Then GoTo nxt 'Защита от двойных пробелов между параметрами
  11. If Left$(Lex(nL), 1) = """" Then 'Если попалась кавычка
  12. Do Until Right$(Lex(nL), 1) = """" 'Пока не найдем кавычке пару
  13. nL = nL + 1
  14. If nL > UBound(Lex) Then Exit Do 'Если не дождались завершающей кавычки, а лимит превышен
  15. Unit = Unit & " " & Lex(nL)
  16. Loop
  17. Unit = Replace$(Unit, """", "") 'Удаляем кавычки
  18. End If
  19. argv(nA) = Unit
  20. nA = nA + 1 'Счетчик выходных аргументов
  21. nxt:
  22. nL = nL + 1 'Счетчик лексических единиц
  23. Loop
  24. ReDim Preserve argv(0 To nA - 1)
  25. Stop 'Смотрим Locals
  26. End Sub
Может у кого еще есть похожие примеры.

Решение задачи: «Простой парсер аргументов командной строки»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Declare Function GetCommandLineAPI Lib "kernel32" Alias "GetCommandLineW" () As Long
  4. Private Declare Function CommandLineToArgvW Lib "shell32" (ByVal lpCmdLine As Long, pNumArgs As Long) As Long
  5. Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
  6. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Size As Long)
  7. Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
  8.  
  9. Private Function PtrToString(ptr As Long) As String
  10.     Dim buffer() As Byte
  11.     Dim lengthString As Long
  12.  
  13.     If CBool(ptr) Then
  14.         lengthString = lstrlenW(ptr) * 2
  15.         If CBool(lengthString) Then
  16.             ReDim buffer(lengthString - 1)
  17.             CopyMemory buffer(0), ByVal ptr, lengthString
  18.             PtrToString = buffer
  19.         End If
  20.     End If
  21. End Function
  22.  
  23. Private Function PtrToDWORD(ByVal ptr As Long) As Long
  24.     Dim lngValue As Long
  25.     If CBool(ptr) Then
  26.         CopyMemory lngValue, ByVal ptr, 4&
  27.         PtrToDWORD = lngValue
  28.     End If
  29. End Function
  30.  
  31. Public Function GetCommandLineArgs() As String()
  32.     Dim cmdLinePtr As Long
  33.     Dim numArgs As Long
  34.     Dim argPtr As Long
  35.     Dim i As Integer
  36.     Dim strArgs() As String
  37.     Dim GetCommand As String
  38.     GetCommand = "2222 4444 66666 67fffd" ' фейковая CommandLine
  39.    cmdLinePtr = CommandLineToArgvW(StrPtr(GetCommand), numArgs) ' фейковая CommandLine
  40.   '  cmdLinePtr = CommandLineToArgvW(GetCommandLineAPI(), numArgs) ' Настоящая CommandLine
  41.    Debug.Print numArgs ' кол-во аргументов
  42.    If CBool(cmdLinePtr) Then
  43.         ReDim strArgs(numArgs - 1)
  44.         For i = 0 To numArgs - 1
  45.             argPtr = PtrToDWORD(cmdLinePtr + (i * 4))
  46.             strArgs(i) = PtrToString(argPtr)
  47.           Debug.Print strArgs(i) ' Набор команд
  48.        Next
  49.        
  50.         Call LocalFree(cmdLinePtr)
  51.        
  52.         GetCommandLineArgs = strArgs ' возвращаем массив команд
  53.    End If
  54. End Function
  55.  
  56. Private Sub Form_Load()
  57.  GetCommandLineArgs
  58. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы