おそらく、デバッグ実行に必要なコマンド ライン引数を使用して VB6 IDE を起動できます。不便に見えますが (実行するたびに IDE を再起動する必要があります)。また、.NET ライブラリがコマンド ラインの一部であるプログラム名を気にしている場合も、動作しないはずです。
別の方法として、実行中の VB6.exe プロセスのコマンド ラインを変更した後に移動することもできます。コマンドラインは作成時にプロセスのアドレス空間にコピーされるため、プロセスはそれを変更できます。理論的には。悪いニュースは、私の知る限り、これを行う方法がサポートされていないことです。また、サポートされていない方法を実装するのは難しい場合があります。
さらに別の方法として、.NET ライブラリが VB6.exe で実行されるかどうかをテストし (これはコマンド ラインから明らかなはずです)、そのようなデバッグ シナリオで別のストレージからデータを取得することもできます。
編集
以下のコードは、GetCommandLine WinAPI 関数によって返されるメモリの場所を変更します。うまくいけば、この同じ関数が内部で使用されEnvironment.CommandLine
ます。
私は .NET ライブラリでコードをテストしていませんが (まだ)、とにかく試してみたいと思うかもしれません。この方法を試すには:
VB6 IDE (VB6.exe) を任意の、しかし十分に長いコマンド ライン引数の文字列で実行します。SetCmdLineWhenRunInVB6IDE
VB6 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