3

一連のコマンド ライン パラメーターを使用する app1.exe (VB6 でビルド) があります。これは、EXE のコマンド ライン パラメータへのアクセスを必要とする C#/.NET 相互運用ライブラリである lib1.dll を呼び出します。Environment.CommandLine私はコマンド ライン パラメータを読み取るために使用し、それはうまく機能します。

VB6 IDE で app1.exe をデバッグするときは、通常、プロジェクト プロパティの [作成] タブに移動し、コマンド ライン パラメーターのテキスト ボックスを手動で設定します。ただし、.NET ライブラリは、呼び出されたときに、コマンド ライン パラメーターをまったく認識しません。全体が VB6.exe プロセスの下で実行されていることがわかります。

これは理にかなっていますが (デバッグ時には実際に VB6.exe で実行されるため)、.NET ライブラリが実際のコマンド ライン パラメータにアクセスできないため、デバッグが困難になります。

私の質問: コマンド ライン パラメータを手動で .NET lib に渡す以外に、VB6 IDE でデバッグするときにそれらを表示する方法はありますか?

4

2 に答える 2

1

おそらく、デバッグ実行に必要なコマンド ライン引数を使用して VB6 IDE を起動できます。不便に見えますが (実行するたびに IDE を再起動する必要があります)。また、.NET ライブラリがコマンド ラインの一部であるプログラム名を気にしている場合も、動作しないはずです。

別の方法として、実行中の VB6.exe プロセスのコマンド ラインを変更した後に移動することもできます。コマンドラインは作成時にプロセスのアドレス空間にコピーされるため、プロセスはそれを変更できます。理論的には。悪いニュースは、私の知る限り、これを行う方法がサポートされていないことです。また、サポートされていない方法を実装するのは難しい場合があります。

さらに別の方法として、.NET ライブラリが VB6.exe で実行されるかどうかをテストし (これはコマンド ラインから明らかなはずです)、そのようなデバッグ シナリオで別のストレージからデータを取得することもできます。

編集

以下のコードは、GetCommandLine WinAPI 関数によって返されるメモリの場所を変更します。うまくいけば、この同じ関数が内部で使用されEnvironment.CommandLineます。

私は .NET ライブラリでコードをテストしていませんが (まだ)、とにかく試してみたいと思うかもしれません。この方法を試すには:

VB6 IDE (VB6.exe) を任意の、しかし十分に長いコマンド ライン引数の文字列で実行します。SetCmdLineWhenRunInVB6IDEVB6 IDE で実行する場合は、以下の手順を実行するように手配してください。これは、IDE のコマンド ラインを、プロジェクト パラメータで設定された値に置き換えることを目的としています。GetCmdLine探索を容易にSetCmdLineするヘルパーにすぎません。

Option Explicit

Private Declare Function GetCommandLine _
    Lib "kernel32" Alias "GetCommandLineW" () As Long
Private Declare Function lstrlen _
    Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory _
    Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Any, ByVal pSrc As Any, ByVal ByteLen As Long)

Public Function GetCmdLine() As String
    Dim hStr As Long
    Dim hLen As Long

    hStr = GetCommandLine
    hLen = lstrlen(hStr)
    If hLen > 0 Then
        GetCmdLine = Space$(hLen)
        CopyMemory StrPtr(GetCmdLine), hStr, (hLen) * 2
    End If
End Function

Public Sub SetCmdLine(sNewCmdLine As String)
    Dim hStr As Long
    Dim hLen As Long
    Dim sBuf As String

    hStr = GetCommandLine
    hLen = lstrlen(hStr)
    If hLen > 0 Then
        Dim i As Long, hEndMark As Long

        sBuf = Space$(hLen)
        hEndMark = IIf(Len(sNewCmdLine) < Len(sBuf), Len(sNewCmdLine), Len(sBuf))

        For i = 1 To hEndMark
            Mid$(sBuf, i) = Mid$(sNewCmdLine, i)
        Next i

        CopyMemory ByVal hStr, StrPtr(sBuf), LenB(sBuf)
    End If
End Sub

Public Sub SetCmdLineFromVBACommand()
    Dim sVBACmdLine As String

    sVBACmdLine = """" & App.Path & "\" & App.EXEName & ".exe"" " & VBA.Command$
    SetCmdLine sVBACmdLine
End Sub
于 2013-04-05T23:33:01.573 に答える