日期:2014-05-19  浏览次数:20841 次

百分求,动态调用dll,如何返回属性?
主程序调用a.dll,a实例中定义一int属性process用于跟踪实例的运行进度。
程序运行过程中不断给process赋进度值。

请问如何不断返回此process值?

本人有个笨方法:将process定义为静态属性,在主程序中通过Timer不断捕捉此属性。
缺点:无法交叉运行此实例。

请问有何好方法?急

------解决方案--------------------
程序运行过程中不断给process赋进度值。
----------------------------------------
在给process赋值的时候可以引发一个自定义事件,在使用的时候给这个事件添加处理代码,或者使用一个普通的委托.
------解决方案--------------------
应该在dll中提供触发事件接口出来,这样好处理
------解决方案--------------------
应提供一个进度变化事件,并在事件参数e中提供process值
------解决方案--------------------
我觉得用委托比较好实现。
------解决方案--------------------
写个回调函数吧
------解决方案--------------------
dll....
不好说...

------解决方案--------------------
其实这种情况,你应该为该dll定义一个接口。在调用dll的主程序中实现该接口。每次dll的状态有大的变化,都调用该接口方法,而由于该接口的实现在主程序中,所以你可以在主程序中进行状态的变更操作。然后根据情况,查询主程序中的标识值就可以了。
------解决方案--------------------
dll代码如下:

Public Class ProcessDll

Private mProcess As Integer
Private WithEvents ProcessTimer As Timers.Timer
Public Event ProcessChanged(ByVal Value As Integer)

Public Property Process() As Integer
Get
Return mProcess
End Get
Set(ByVal value As Integer)
If mProcess <> value Then
mProcess = value
RaiseEvent ProcessChanged(value)
End If
End Set
End Property

Public Sub New()
ProcessTimer = New Timers.Timer(500)
ProcessTimer.Start()
End Sub

Protected Overrides Sub Finalize()
MyBase.Finalize()
If ProcessTimer IsNot Nothing Then ProcessTimer.Stop()
End Sub

Private Sub ProcessTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles ProcessTimer.Elapsed
If Process < 100 Then Process += 1 Else Process = 0
End Sub
End Class

主程序代码:
注意:需要添加引用,窗体Form1上放置一个ProgressBar1控件

Public Class Form1

Private WithEvents MyProcess As ProcessDll

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyProcess = New ProcessDll
End Sub

Private Sub MyProcess_ProcessChanged(ByVal Value As Integer) Handles MyProcess.ProcessChanged
ProgressBar1.Invoke(New RunMySub(AddressOf MySub), Value)
End Sub

Private Delegate Sub RunMySub(ByVal Value As Integer)

Private Sub MySub(ByVal Value As Integer)
Me.ProgressBar1.Value = Value
End Sub
End Class