1

現在、ソフトウェアを VB6 から VB.NET にアップグレードしており、一度に 1 つの DLL をアップグレードしています。EXE は、多くのサード パーティの UI コントロールを備えているため、最後になります。

私が見つけた 1 つの問題は、DLL の VB6 バージョンがインターフェイス クラス (VB6 には公式に存在しない) のように動作する IProgressCallBack クラスを格納し、EXE が DLL から進行状況レポートを取得して画面に表示できるようにしたことです。ユーザーのために。

この DLL が移行されると、IProgressCallBack クラスを Interface クラスとして設定できますが、それを使用するフォームのインスタンスに「設定」することはできません。しかし、通常のクラスとして作成しても、2 つの異なるオブジェクト タイプであるため、それを使用するフォームのインスタンスに「設定」することはできません。

VB6 と VB.NET の間で IProgressCallBack クラスを動作させる方法、または .NET DLL の進行状況を VB6 UI に通知し続けるための代替ソリューションを知る必要がありますか?

両方の VB6 バージョンとその動作の例を次に示します。

VB6 DLL: IProgressCallBack

Option Explicit
Public Function NotifyProgress(ByVal Progress As Single, ByRef isCancel As Boolean) As Boolean
End Function

VB6 DLL: MainFunctions クラス

Public ProgressNotify As IProgressCallBack
Public Sub DoWork()
    Dim l As Long
    For l = 1 to 100
        Sleep 10 'sleep for 1/100 of a second
        ProgressNotify.NotifyProgress 1, False
    Next
End Sub

VB6 EXE

Implements IProgressCallBack
Dim m_oMainFunc As MainFunctions

Private Sub cmdStart_Click()
    Set m_oMainFunc = New MainFunctions
    Set m_oMainFunc.ProgressNotify = Me
    m_oMainFunc.DoWork
    Set m_oMainFunc = Nothing
End Sub

Public Function IProgressCallBack_NotifyProgress(ByVal Progress As Single, isCancel As Boolean) As Boolean
    lblStatus.Caption = CStr(Round(Progress)) & "%"
    pbStatus.Value = Round(Progress)
    Me.Refresh
End Function

ありがとう、クリス

4

1 に答える 1

1

上記で投稿した質問に対する答えは正確には見つかりませんでしたが、適切な回避策を見つけました。基本的に、フォームをオブジェクトとしてクラスに渡し、インターフェイスのふりをして、フォームにあるインターフェイスメソッドを直接呼び出して画面を更新します。これが私がこれを行う方法のコードサンプルです:

VB.NET DLL:IProgressCallBackクラス

Dim m_oForm As Object

Public Sub New(ByRef oForm As Object)
    m_oForm = oForm
End Sub

Public Function NotifyProgress(ByVal Progress As Single, ByRef isCancel As Boolean) As Boolean
m_oForm.IProgressCallBack_NotifyProgress(Progress, isCancel)
End Function

VB.NET DLL:MainFunctionsクラス

Public ProgressNotify As IProgressCallBack

Public Sub New()
    'Need Public Sub New() with no parameters for all Com Classes
    MyBase.New()
End Sub

Public Sub Initialize(ByRef oForm As Object)
    ProgressNotify = New IProgressCallBack(oForm)
End Sub

Public Sub DoWork()
    For l As Long = 1 to 100
        Threading.Thread.Sleep(10) 'sleep for 1/100 of a second
        ProgressNotify.NotifyProgress(l,False)
    Next
End Sub

VB6 EXE

Dim m_oMainFunc As TestDLL_Net.MainFunctions
Private cmdStart_Click()
    Set m_oMainFunc = New TestDLL_Net.MainFunctions
    m_oMainFunc.Initialize Me
    m_oMainFunc.DoWork
    Set m_oMainFunc = Nothing
End Sub

Public Function IProgressCallBack_NotifyProgress(ByVal Progress As Single, isCancel As Boolean) As Boolean
    DoEvents
    lblStatus.Caption = CStr(Round(Progress)) & "%"
    Me.Refresh
    pbStatus.Value = Round(Progress)
End Function

これにより、上記のVB6DLLからVB6EXEの例と同じ結果が得られ、EXEの変更は最小限で機能します。

ありがとう、クリス

于 2012-05-01T12:53:18.473 に答える