Hallo,
ich habe ein Problem an dem ich nich weiter weiß.
Ich setzte gerade ein VB6 Programm auf vb.net um. In diesem Programm wird eine Funktion in einer PL/1 - DLL aufgerufen. Übergeben werden die Paramter in einer Structure aus der hinterher auch die Ergebnisse gelesesen werden.
In VB 6 klappt das auch ohne Probleme, aber mit VB.nt (vb 2010) bekomme ich das nicht hin.
Der Aufruf selber klappt. Aber die übergebenen Werte passen nicht.
So werden die String in VB.Net mit Null terminiert. Die PL/1-erwartet aber Space als Füllzeichen und feste Längen.
Und auch bei den double Parametern ist irgendwie mind. ein Bit geschoben. Wenn ich mir die Parameter in PL/1 im Debugger anschaue scheinen die übergebenen Werte irgendwo zu lang zusein, z.B. wenn die Summen am Ende alle 0 sind bis auf Summe2 und Summe4. So ist in PL/1 die Summe3 und Summe5 gefüllt (und die anderen nicht) allerdings mit absurd hohen Werten.
Hier der Aufruf in VB.Net:
<DllImport("C:\Users\R\Documents\Projekte\dll\PL1k32.dll", _
CallingConvention:=CallingConvention.StdCall, EntryPoint:="ABG")> Sub TB1( _
ByRef Tar As MBBG_TYP, ByVal Msg As String, ByVal rkDebugInfo As String)
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> Public _
Structure MBBG_IN_TYP
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public WA As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public ZW As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public G1 As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public Tf As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public Tfk As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public Gemxtra As _
String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public Bg As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public GV As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public Zu As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=4)> Public KZO As String
Dim EA As Integer
Dim Gj As Integer
Dim VD As Integer
Dim LD As Integer
Dim BD As Integer
Dim KD As Integer
Dim LZAV As Integer
Dim GS As Double
Dim Summe1 As Double
Dim Summe2 As Double
Dim Summe3 As Double
Dim Summe4 As Double
Dim Summe5 As Double
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> Public _
Structure MBBG_OUT_TYP
Dim NP As Double
Dim NPU As Double
Dim TB As Double
Dim RWB As Double
Dim A2 As Integer
Dim DMAV As Double
Dim ReturnCode As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> Public FehlerID _
As String
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> Public _
Structure MBBG_TYP
Dim Inp As MBBG_IN_TYP
Dim Out As MBBG_OUT_TYP
End Structure Und hier das selbe in VB6 (das was halt funktioniert)
Public Declare Sub TB1 Lib "C:\Users\R\Documents\Projekte\dll\PL1k32.dll" Alias _
"ABG" (ByRef Tar As MBBG_TYP, ByVal Msg As String, ByVal rkDebugInfo As _
String)
Public Type MBBG_IN_TYP
WA As String * 4
ZW As String * 4
G1 As String * 4
Tf As String * 4
Tfk As String * 4
Gemxtra As String * 4
Bg As String * 4
GV As String * 4
Zu As String * 4
KZO As String * 4
EA As Long
Gj As Long
VD As Long
LD As Long
BD As Long
KD As Long
LZAV As Long
GS As Double
Summe1 As Double
Summe2 As Double
Summe3 As Double
Summe4 As Double
Summe5 As Double
End Type
Public Type MBBG_OUT_TYP
NP As Double
NPU As Double
TB As Double
RWB As Double
A2 As Long
DMAV As Double
ReturnCode As Long
FehlerID As String * 8
End Type
Public Type MBBG_TYP
Inp As MBBG_IN_TYP
Out As MBBG_OUT_TYP
End Type Ich hoffe mir kann jemand einen Hinweis geben
Schonmal vielen Dank
Ralf |