VB6で、コマンドライン引数に フォルダーパスを入れたいのですが、
パスに半角スペースが入るので、ダブルクォーテーションで括ってデバッグし、
プログラム側でコマンドライン引数を取得すると、ダブルクォーテーションが入っていました。
VisualStudioでのデバック時にダブルクォーテーションが含まれないような方法はあるでしょうか。
実際にこのEXEをコマンドプロンプト等で実行する際にダブルクォーテーションを付けても
このようなことは起こらないと思うので、運用上は問題ないですが・・・。
コマンドライン引数は、[プロジェクトのプロパティ]-[実行可能ファイルの作成]-[コマンドライン引数]のところに入れています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
VB6 でコマンドライン引数をキチンと処理するのは結構やっかいなので CommandLineToArgvW を使ってみてください。
CommandLineToArgvW function (shellapi.h)
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw
VB
1Option Explicit 2 3Private Declare Function CommandLineToArgvW Lib "shell32" (ByVal lpCmdLine As Long, pNumArgs As Integer) As Long 4Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long 5Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long 6Private Declare Function lstrcpyW Lib "kernel32" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long 7Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 8 9Private Const OFFSET_4 As Currency = 4294967296@ 10Private Const MAXINT_4 As Currency = 2147483647 11 12Public Function DivCommand(ByVal iCommand As String) As String() 13 Dim lpszArgs As Long 14 Dim nArgs As Integer 15 Dim i As Long 16 Dim nRet As Long 17 Dim sArgs() As String 18 19 lpszArgs = CommandLineToArgvW(StrPtr(iCommand), nArgs) 20 If lpszArgs <> 0 Then 21 ReDim sArgs(nArgs - 1) 22 For i = 0 To nArgs - 1 23 sArgs(i) = ToStringW(GetPointer(lpszArgs, i)) 24 Next 25 nRet = LocalFree(lpszArgs) 26 End If 27 DivCommand = sArgs 28 29End Function 30 31Private Function GetPointer(ByVal iAddress As Long, ByVal iIndex As Long) As Long 32Dim lpAddress As Long 33Dim lpPointer As Long 34 35 lpAddress = SLONG(ULONG(iAddress) + iIndex * 4) 36 37 CopyMemory lpPointer, ByVal lpAddress, Len(lpPointer) 38 GetPointer = lpPointer 39 40End Function 41 42Private Function SLONG(ByVal Value As Currency) As Long 43 If Value < 0 Or Value >= OFFSET_4 Then Error 6 44 If Value <= MAXINT_4 Then 45 SLONG = Value 46 Else 47 SLONG = Value - OFFSET_4 48 End If 49End Function 50 51Private Function ULONG(ByVal Value As Long) As Currency 52 If Value < 0 Then 53 ULONG = Value + OFFSET_4 54 Else 55 ULONG = Value 56 End If 57End Function 58 59Private Function ToStringW(ByVal lpAddr As Long) As String 60Dim nLen As Long 61Dim strBuffer As String 62 63 If lpAddr <> 0 Then 64 nLen = lstrlenW(lpAddr) 65 If nLen > 0 Then 66 strBuffer = String(nLen + 1, vbNullChar) 67 Call lstrcpyW(StrPtr(strBuffer), lpAddr) 68 ToStringW = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1) 69 Else 70 ToStringW = "" 71 End If 72 Else 73 ToStringW = "" 74 End If 75 76End Function
使い方
VB6
1Sub Main() 2 Dim v As Variant 3 For Each v In DivCommand(Command) 4 MsgBox v 5 Next 6End Sub
投稿2021/01/20 18:46
総合スコア2707
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。