none
如何在VB6.0實現.Net中的Delegate? RRS feed

  • 問題

  • 上網查詢,知道Delegate是類似函式指標的功能,看了一些範例程式,也大概了解一些概念

    更知道了VB6.0並不支援Delegate的使用,但是客戶就是上帝,他們的要求我們必須拼死完成(誰快來救我出去...)

    而經過一段時間的嘗試,卻還是對下面的範例程式毫無頭緒

    事實上,這個範例已經有點超出我的理解範圍,尤其是FunctionB的使用

    main.vb Public Class formMain Dim Test As classTest Private Sub formMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Test = New classTest(New TFunctionB(AddressOf FunctionA)) End Sub Public Function FunctionA(ByVal MsgType As Integer, ByVal ID As Integer, ByVal No As Integer, ByVal Data As String, ByRef Result As String) As Boolean 'Do Something End Function End Class classTest.vb Option Explicit On Imports System.Runtime.InteropServices Imports System.Collections.Specialized Delegate Function TFunctionA(ByVal Owner As Integer, ByVal ResultIndex As UInt32, ByVal MsgType As Integer, ByVal ID As Integer, ByVal No As Integer, ByVal Data As System.IntPtr, ByVal Len As Integer) As Boolean Public Delegate Function TFunctionB(ByVal MsgType As Integer, ByVal ID As Integer, ByVal No As Integer, ByVal Data As String, ByRef Result As String) As Boolean Public Class classTest Const shareDLL As String = "Test.dll" Dim m_FunctionB As TFunctionB Dim m_FunctionA As TFunctionA <DllImport(shareDLL, CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi, EntryPoint:="TestStart")> _ Private Shared Function TestStart(ByVal callback As IntPtr) As Byte End Function Public Sub New(ByVal f_FunctionB As TFunctionB) m_FunctionB = f_FunctionB m_FunctionA = New TFunctionA(AddressOf FunctionA) If (TestStart(Marshal.GetFunctionPointerForDelegate(m_FunctionA)) = 0) Then MessageBox.Show("Fail") End If End Sub Public Function FunctionA(ByVal Owner As Integer, ByVal ResultIndex As UInt32, ByVal MsgType As Integer, ByVal ID As Integer, ByVal No As Integer, ByVal Data As System.IntPtr, ByVal Len As Integer) As Boolean 'Do Something End Function End Class

    寫了一堆,實際上,我想要問的是,要如何在VB6.0中使用TestStart這個函式?

    之前在實做的時候,我的想法很單純,不就是調用函式嘛,宣告引用TestStart,然後把上面IntPtr的部份用Long取代

    宣告一個OnRsvRemoteData的函式,最後在呼叫TestStart的時候把AddressOf OnRsvRemoteData就好了

    但是執行的時候,程式卻告訴我,呼叫規格錯誤

    Public Declare Function TestStart Lib "Test.dll" (ByVal callback As Long) As Boolean
    
    Public Function OnRsvRemoteData(ByVal Owner As Integer, ByVal MsgType As Integer, ByVal ID As Integer, ByVal No As Integer, ByRef Data As String, ByVal Len As Integer) As Boolean
        'Do Something
    End Function
    
    
        tmpBoolAns = TestStart(AddressOf OnRsvRemoteData)

    搞了很久,依舊無法解決這個問題

    請問一下各位大師,要怎樣做才能在VB6.0實現.Net中的Delegate呢?

    感謝各位的回答~

    2012年4月5日 下午 03:12

解答

  • 你查一下 EnumWindows 這類 API 怎樣在 VB6 使用 callback 的範例。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 夢想家 2012年4月6日 上午 08:55
    2012年4月5日 下午 03:26

所有回覆

  • 你查一下 EnumWindows 這類 API 怎樣在 VB6 使用 callback 的範例。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 夢想家 2012年4月6日 上午 08:55
    2012年4月5日 下午 03:26
  • TestStart函數的傳回值是Boolean還是Byte, 上面的宣告和下面的宣告好像不一樣
    2012年4月6日 上午 03:38
  • 文件上是寫bool,但是範例程式是byte,我兩個都試過了,但是都是一樣的錯誤,"呼叫規格錯誤"...Orz

    目前還在不斷的嘗試中,不過試到現在,終於知道m_FunctionB只是個指標,純粹拿來給classTest裡的涵式用而已

    至於要怎樣成功的在VB6.0上使用,仍是一個很大的問題


    • 已編輯 夢想家 2012年4月6日 上午 06:05
    2012年4月6日 上午 05:53
  • 結果經過與廠商的溝通,他們文件給錯了..........

    我的用法應該是對的,只是這次的作業不需要用到此技巧

    感謝各位的協助~

    2012年4月6日 上午 08:55