原文: vbMain(argc As Long, argv() As String)——VB自己的类C"主"函数 http://www.vbgood.com/thread-103078-1-1.html 看到了 GetCommandLine 这个函数,又多看了几眼,就动手写了下面的这个类似于C中的 int main(int argc,char* argv[]) 函数。 当然可以自己解析命令行,但是使用Windows提供的函数既方便,又“安全”,能省下不少事。 话不多说了,直接上代码。 '==================== 'Written by D.L. ' '2011/04/14 '==================== Option Explicit Public Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As Long Public Declare Function GetCommandLineW Lib "kernel32" () As Long Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long Public Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long Public Declare Function CommandLineToArgvW Lib "shell32" (ByVal lpCmdLine As Long, pNumArgs As Long) As Long Public Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Sub vbMain(argc As Long, argv() As String) ' Dim szCmdLine() As Byte '命令行 ' Dim lpszCmdLine As Long '命令行指针 ' Dim lCmdLineLength As Long '命令行长度 ' ' 'A ' lpszCmdLine = GetCommandLine() ' lCmdLineLength = lstrlen(lpszCmdLine) ' ReDim szCmdLine(lCmdLineLength - 1) ' CopyMemory ByVal VarPtr(szCmdLine(0)), ByVal lpszCmdLine, lCmdLineLength ' Debug.Print StrConv(szCmdLine(), vbUnicode) ' Erase szCmdLine ' 'W ' lpszCmdLine = GetCommandLineW() ' lCmdLineLength = lstrlenW(lpszCmdLine) ' ReDim szCmdLine(lCmdLineLength * 2 - 1) ' CopyMemory ByVal VarPtr(szCmdLine(0)), ByVal lpszCmdLine, lCmdLineLength * 2 ' Debug.Print CStr(szCmdLine()) ' Erase szCmdLine '---------------------------------------------------------------------------- Dim lNumArgs As Long '命令行参数个数 Dim lpszArglist As Long '命令行参数数组地址 Dim lpszArg As Long '命令行各参数地址 Dim lArgLength As Long '命令行各参数长度 Dim szArg() As Byte '命令行各参数 Dim lRet As Long, i As Long 'ArgvW lpszArglist = CommandLineToArgvW(GetCommandLineW(), lNumArgs) If (lpszArglist) Then argc = lNumArgs ReDim argv(lNumArgs - 1) '得到argv(0)的地址 CopyMemory ByVal VarPtr(lpszArg), ByVal lpszArglist, 4 For i = 0 To lNumArgs - 1 lArgLength = lstrlenW(lpszArg) ReDim szArg(lArgLength * 2 - 1) CopyMemory ByVal VarPtr(szArg(0)), ByVal lpszArg, lArgLength * 2 argv(i) = CStr(szArg) '继续下一个 lpszArg = lpszArg + lArgLength * 2 + 2 Next '释放内存 Erase szArg lRet = LocalFree(lpszArglist) End If End Sub Sub Main() Dim argc As Long, argv() As String Dim i As Integer, szCmd As String Call vbMain(argc, argv()) For i = 0 To argc - 1 szCmd = szCmd & i & " " & argv(i) & vbNewLine Next Debug.Print szCmd MsgBox szCmd End Sub 复制代码 测试工程在附件中。 参考链接: http://msdn.microsoft.com/en-us/library/ms683156(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/bb776391(v=vs.85).aspx 可能有用的链接: http://bbs.et8.net/bbs/showthread.php?t=523504 http://www.ok800.net/archiver/tid-2451.html 测试工程: http://download.csdn.net/source/3197233