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

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

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

Рылся в интернете - не нашел. Хотелось, конечно, RegExp. Написал сам. В боевіх условиях вместо переменной St подставляем Command Это все нужно, если аргументами командной строки могут попадаться пути с пробелами (как и положено, заключенные кавычками).
Может у кого еще есть похожие примеры.

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

textual
Листинг программы
Option Explicit
 
Private Declare Function GetCommandLineAPI Lib "kernel32" Alias "GetCommandLineW" () As Long
Private Declare Function CommandLineToArgvW Lib "shell32" (ByVal lpCmdLine As Long, pNumArgs As Long) As Long
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Size As Long)
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
 
Private Function PtrToString(ptr As Long) As String
    Dim buffer() As Byte
    Dim lengthString As Long
 
    If CBool(ptr) Then
        lengthString = lstrlenW(ptr) * 2
        If CBool(lengthString) Then
            ReDim buffer(lengthString - 1)
            CopyMemory buffer(0), ByVal ptr, lengthString
            PtrToString = buffer
        End If
    End If
End Function
 
Private Function PtrToDWORD(ByVal ptr As Long) As Long
    Dim lngValue As Long
    If CBool(ptr) Then
        CopyMemory lngValue, ByVal ptr, 4&
        PtrToDWORD = lngValue
    End If
End Function
 
Public Function GetCommandLineArgs() As String()
    Dim cmdLinePtr As Long
    Dim numArgs As Long
    Dim argPtr As Long
    Dim i As Integer
    Dim strArgs() As String
    Dim GetCommand As String
    GetCommand = "2222 4444 66666 67fffd" ' фейковая CommandLine
    cmdLinePtr = CommandLineToArgvW(StrPtr(GetCommand), numArgs) ' фейковая CommandLine
   '  cmdLinePtr = CommandLineToArgvW(GetCommandLineAPI(), numArgs) ' Настоящая CommandLine
    Debug.Print numArgs ' кол-во аргументов
    If CBool(cmdLinePtr) Then
        ReDim strArgs(numArgs - 1)
        For i = 0 To numArgs - 1
            argPtr = PtrToDWORD(cmdLinePtr + (i * 4))
            strArgs(i) = PtrToString(argPtr)
          Debug.Print strArgs(i) ' Набор команд
        Next
       
        Call LocalFree(cmdLinePtr)
        
        GetCommandLineArgs = strArgs ' возвращаем массив команд
    End If
End Function
 
Private Sub Form_Load()
 GetCommandLineArgs
End Sub

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


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

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

12   голосов , оценка 3.667 из 5
Похожие ответы