質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Basic 6.0

Microsoft Visual Basic 6.0(VB6)とはCOMプログラミングのためにMicrosoftが提供したプログラミング言語とintegrated develpment enviornment(IDE)のことです。

Q&A

解決済

2回答

6387閲覧

VB6 コマンドライン引数について

JOE

総合スコア13

Visual Basic 6.0

Microsoft Visual Basic 6.0(VB6)とはCOMプログラミングのためにMicrosoftが提供したプログラミング言語とintegrated develpment enviornment(IDE)のことです。

0グッド

0クリップ

投稿2021/01/19 23:16

VB6で、コマンドライン引数に フォルダーパスを入れたいのですが、
パスに半角スペースが入るので、ダブルクォーテーションで括ってデバッグし、
プログラム側でコマンドライン引数を取得すると、ダブルクォーテーションが入っていました。
VisualStudioでのデバック時にダブルクォーテーションが含まれないような方法はあるでしょうか。
実際にこのEXEをコマンドプロンプト等で実行する際にダブルクォーテーションを付けても
このようなことは起こらないと思うので、運用上は問題ないですが・・・。
コマンドライン引数は、[プロジェクトのプロパティ]-[実行可能ファイルの作成]-[コマンドライン引数]のところに入れています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

削除する必要があるなら、コードで削除すればいいです。
が、そういう場合、削除すると動かなくなる場合があるので、そのままにしておくほうがいいかと思います。

運用上問題ないならなおさら

投稿2021/01/19 23:32

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問