2017-07-14 17 views
3

こんにちはすべて私はVB6のコード変換を介してVS 2008にいくつかのVB6のコードを変換しようとしています。ほとんどがうまくいくが、タッチアップが必要なものがいくつかある。VS6のAddressOfとコールバック

InitializeGrCap = GrCapInitialize(AddressOf GrCapStatusEventHandler) 

そしてGrCapInitializeはこれです::

一つは、タッチアップは、コードのこの部分であることを特徴とする

Public Declare Function GrCapInitialize Lib "GrFinger.dll" Alias "[email protected]" (ByVal StatusEventHandler As Integer) As Integer 

そしてGrCapStatusEventHandlerです:

Public Sub GrCapStatusEventHandler(ByVal pidSensor As Integer, ByVal eventRaised As Integer) 
    While fireStatus = True 
     System.Windows.Forms.Application.DoEvents() 
    End While 

    myPIdSensor = pidSensor 
    myEventRaised = eventRaised  
    fireStatus = True 

    While fireStatus = True 
     System.Windows.Forms.Application.DoEvents() 
    End While 
End Sub 

私は午前

エラー 'Integer'がデリゲートタイプではないため、 'AddressOf'式を 'Integer'に変換できません。

GrCapFingerEventHandler:...はこの1つにエラーがある再び

GrCapStartCapture(myIdSensor, AddressOf GrCapFingerEventHandler, AddressOf GrCapImageEventHandler) 

そして、のAddressOf:

第二は、タッチアップは、このコードの一部であることを特徴とします。

Public Sub GrCapFingerEventHandler(ByVal pidSensor As Integer, ByVal eventRaised As Integer) 
    While fireFinger = True 
     System.Windows.Forms.Application.DoEvents() 
    End While 

    myPIdSensor = pidSensor 
    myEventRaised = eventRaised 
    fireFinger = True 

    While fireFinger = True 
     System.Windows.Forms.Application.DoEvents() 
    End While 
End Sub 

およびGrCapImageEventHandler

Public Sub GrCapImageEventHandler(ByVal pidSensor As Integer, ByVal width As Integer, ByVal height As Integer, ByVal pRawImage As Integer, ByVal res As Integer) 
    While fireImage = True 
     System.Windows.Forms.Application.DoEvents() 
    End While 

    myPIdSensor = pidSensor 
    myWidth = width 
    myHeight = height 
    myRes = res 
    myRawImage = pRawImage 
    fireImage = True 

    While fireImage = True 
     System.Windows.Forms.Application.DoEvents() 
    End While 
End Sub 

そして再び、エラーがある: '整数' はデリゲート型ではありませんので、44 'のAddressOf' 式は '整数' に変換することはできません

エラー。

誰も私にこれらの2つのコード領域を.netに変換する手助けはできますか?

答えて

4

VB6では、アンマネージ関数に渡したIntegerは関数ポインタになります。 VB.NETは関数ポインタを実行しません。 .NETでは代わりにデリゲートを使用します。これはメソッドを参照するオブジェクトです。つまり、管理対象メソッドに一致するシグネチャを持つデリゲート型が必要であり、その型としてアンマネージ関数のパラメータを宣言し、その関数を呼び出すときにその型のインスタンスを渡すことができます。独自のデリゲートタイプを宣言できます(例:

Public Delegate Sub GrCapStatusCallback(ByVal pidSensor As Integer, ByVal eventRaised As Integer) 

は、そのタイプを使用して外部関数を宣言:

Public Declare Function GrCapInitialize Lib "GrFinger.dll" Alias "[email protected]" (ByVal StatusEventHandler As GrCapStatusCallback) As Integer 

とを、あなたのように動作するはず持つ呼び出しがあるか、明示的にデリゲートのインスタンスを作成することができます。

InitializeGrCap = GrCapInitialize(New GrCapStatusCallback(AddressOf GrCapStatusEventHandler)) 

を代わりに既存のActionFunc代理人を使用することができます。これはそれぞれSubsFunctionsであり、ca 0〜16のパラメータのサポート:

Public Declare Function GrCapInitialize Lib "GrFinger.dll" Alias "[email protected]" (ByVal StatusEventHandler As Action(Of Integer, Integer)) As Integer 
+0

返信いただきありがとうございます。しかし、** InitializeGrCap = GrCapInitialize(新しいGrCapStatusCallback(AddressOf GrCapStatusEventHandler))に変更すると、同じエラーが発生する**エラー**エラーが発生する**エラー 'GrFingerSampleVB6.Callbacks.GrCapStatusCallback'の値を'Integer'。** – StealthRT

+0

次に、私の答えで具体的に取り上げたアンマネージドメソッドの宣言を変更していません。 – jmcilhinney

+0

ああ、それを忘れてしまいました。 OPの第2号はどうですか? – StealthRT

関連する問題