Bonjour,
J'ai migré un ActiveX cod. en VB6 vers VB.Net.
Malheuresement, je rencontre une erreur lors de mon call à l'API: AccessviolationException.
L'ActiveX codé en VB6 marche bien et je n'ai pas d'erreur, mais mon code VB.Net ne fonctionne pas.

En Voici le code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
Module nif_types
'Define structure for RGETDAT_BITS procedure call
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    Public Structure rgetdat_bits_data_str
        Dim type As Short 'data type (set internally)
        Dim file As Short 'file in database
        Dim rec As Short 'record in file
        Dim word As Short 'word offset in record
        Dim start_bit As Short 'start bit in word
        Dim length As Short 'number of bits
        Dim flags As Short 'flags
        Dim padding As Short
        Dim value As Short 'database value
        <VBFixedArray(2)> Dim padV() As Short
        Dim status As Short 'return status
        <VBFixedArray(2)> Dim padA() As Short
        Public Sub Initialize()
            ReDim padV(2)
            ReDim padA(2)
        End Sub
    End Structure
End Module
 
Module HSCNAPI
 
Public Declare Function rgetdat_bits Lib "hscnetapi.dll" Alias "rgetdat_bits_vb" (ByVal Server As String, ByVal num_points As Short, ByRef getdat_bits_data() As rgetdat_bits_data_str) As Short
 
End Module
 
Class MyControl
 
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=255)> Dim ServerName As String ' For fixed length compatibility
 
 Public Sub GetServerName()
                ServerName = RegQuery("Honeywell", "Experion PKS Server", "Server", "ConnectedServerName")
 End Sub
 
 Public Function HSC_get_bits_data(ByVal iFile As Short, ByVal iRec As Short, ByVal iWord As Short, ByVal iStart As Short, Optional ByVal DataNumber As Integer = 1) As Array
            Dim ArrData(0) As rgetdat_bits_data_str
            Dim ArrReturn(0 To 100) As String
            Dim iWordCount As Integer = 0
            Dim iBitCount As Integer = 0
            Try
                For i As Integer = 0 To DataNumber - 1
                    ArrData(0).file = (iFile)
                    ArrData(0).rec = Convert.ToInt16(iRec)
                    ArrData(0).word = Convert.ToInt16(iWord + iWordCount)
                    ArrData(0).start_bit = Convert.ToInt16(iStart + iBitCount)
                    ArrData(0).length = Convert.ToInt16(1)
                    ArrData(0).flags = Convert.ToInt16(0)
                    rgetdat_bits(ServerName, Convert.ToInt16(1), ArrData) ' <------------------- Stacktrace shows this Exception happens on this line, which is the API Call
                    ArrReturn(i) = CStr(ArrData(0).value)
                    iBitCount += 1 ' Counter to increment the StartBit by 1: 1 bit = 1 bit. 
                    If iBitCount = 16 Then ' 0 to 15 represent 16 bits. When 16 bit count is reached, increment word and reset bit counter
                        iWordCount += 1
                        iBitCount = 0
                    End If
                Next
                Return ArrReturn
            Catch Ex1 As AccessViolationException
                'mylogWriter.WriteLine("Record Time: " & time.ToString(timeformat) & " :: " & "HSC_get_bits_data: " & Ex1.Message, Ex1.InnerException.ToString)
            Catch Ex As Exception
                'mylogWriter.WriteLine("Record Time: " & time.ToString(timeformat) & " :: " & "HSC_get_bits_data: " & Ex.Message, Ex.InnerException.ToString)
            End Try
            Return Nothing
        End Function
End Class