Passing data problem to older third party DLL - HELP!

J

James Radke

Hello,

I have a vb.net windows application that is calling an older DLL provided by
a third party. They supplied a VB 6 application that, when run on my
systemn successfully passes data to the database. The problem I am having
is that when I pass the data from VB.NET, the fields defined as double all
contain strange values. For example, if I pass in 10, the value stored on
the database is: 5.325550197128e-315

Note that most of the rest of the data appears to pass correctly, with the
exception of the STK code which appears to be off by 4 bytes of data.

Can someone help me out as to why these values are not being passed
correctly?

Any help would be greatly appreciated!!!

Thanks!

Jim



The valid VB6.0 structure that successfully passes data from a VB6
application is:

Type SODetail
ORDNUM28 As String * 6 ' String
LINNUM28 As String * 2 ' String
DELNUM28 As String * 2 ' String
STATUS28 As String * 1 ' String
CUSTID28 As String * 7 ' String
PRTNUM28 As String * 15 ' String
EDILIN28 As String * 6 ' String
TAXABL28 As String * 1 ' String
GLXREF28 As String * 32 ' String
CURDUE28 As Long ' Btrieve Date
FILL0128 As String * 2 ' String
ORGDUE28 As Long ' Btrieve Date
FILL0228 As String * 2 ' String
CUSDUE28 As Long ' Btrieve Date
FILL0328 As String * 2 ' String
SHPDTE28 As Long ' Btrieve Date
FILL0428 As String * 2 ' String
SLSUOM28 As String * 2 ' String
REFRNC28 As String * 25 ' String
PRICE28 As Double ' IEEE Float
ORGQTY28 As Double ' IEEE Float
CURQTY28 As Double ' IEEE Float
BCKQTY28 As Double ' IEEE Float
SHPQTY28 As Double ' IEEE Float
CURSHP28 As Double ' IEEE Float
DUEQTY28 As Double ' IEEE Float
INVQTY28 As Double ' IEEE Float
DISC28 As Single ' IEEE Float
STYPE28 As String * 2 ' String
PRNT28 As String * 1 ' String
AKPRNT28 As String * 1 ' String
STK28 As String * 8 ' String
COCFLG28 As String * 3 ' String
FORCUR28 As Double ' IEEE Float
HSTAT28 As String * 1 ' String
SLSREP28 As String * 7 ' String
COMMIS28 As Single ' IEEE Float
DRPSHP28 As String * 10 ' String
QUMQTY28 As Single ' IEEE Float
TAXCDE128 As String * 7 ' String
TAX128 As Double ' IEEE Float
TAXCDE228 As String * 7 ' String
TAX228 As Double ' IEEE Float
TAXCDE328 As String * 7 ' String
TAX328 As Double ' IEEE Float
MCOMP28 As String * 3 ' String
MSITE28 As String * 3 ' String
UDFKEY28 As String * 15 ' String
UDFREF28 As String * 25 ' String
DEXPFLG28 As String * 1 ' String (adChar)
FILLER28 As String * 24 ' String
End Type


The structure used in the vb.net application that seems to start screwing up
data with the elements defined as double is:

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Structure SOEDetItem
<VBFixedString(6), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=6)> Public ORDNUM() As Char '
String
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public LINNUM() As Char '
String
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public DELNUM() As Char '
String
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1,
SizeConst:=1)> Public STATUS() As Char ' String
<VBFixedString(7), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=7)> Public CUSTID() As Char '
String
<VBFixedString(15), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=15)> Public PRTNUM() As Char '
String
<VBFixedString(6), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=6)> Public EDILIN() As Char '
String
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1,
SizeConst:=1)> Public TAXABL() As Char ' String
<VBFixedString(32), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=32)> Public GLXREF() As Char '
String
Public CURDUE As Integer ' Btrieve Date
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public FILL01() As Char '
String
Public ORGDUE As Integer ' Btrieve Date
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public FILL02() As Char '
String
Public CUSDUE As Integer ' Btrieve Date
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public FILL03() As Char '
String
Public SHPDTE As Integer ' Btrieve Date
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public FILL04() As Char '
String
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public SLSUOM() As Char '
String
<VBFixedString(25), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=25)> Public REFRNC() As Char '
String
Public PRICE As Double ' IEEE Float
Public ORGQTY As Double ' IEEE Float
Public CURQTY As Double ' IEEE Float
Public BCKQTY As Double ' IEEE Float
Public SHPQTY As Double ' IEEE Float
Public CURSHP As Double ' IEEE Float
Public DUEQTY As Double ' IEEE Float
Public INVQTY As Double ' IEEE Float
Public DISC As Single ' IEEE Float
<VBFixedString(2), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=2)> Public STYPE() As Char '
String
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1,
SizeConst:=1)> Public PRNT() As Char ' String
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1,
SizeConst:=1)> Public AKPRNT() As Char ' String
<VBFixedString(8), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=8)> Public STK() As Char ' String
<VBFixedString(3), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=3)> Public COCFLG() As Char '
String
Public FORCUR As Double ' IEEE Float
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1,
SizeConst:=1)> Public HSTAT() As Char ' String
<VBFixedString(7), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=7)> Public SLSREP() As Char '
String
Public COMMIS As Single ' IEEE Float
<VBFixedString(10), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=10)> Public DRPSHP() As Char '
String
Public QUMQTY As Single ' IEEE Float
<VBFixedString(7), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=7)> Public TAXCDE1() As Char '
String
Public TAX1 As Double ' IEEE Float
<VBFixedString(7), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=7)> Public TAXCDE2() As Char '
String
Public TAX2 As Double ' IEEE Float
<VBFixedString(7), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=7)> Public TAXCDE3() As Char '
String
Public TAX3 As Double ' IEEE Float
<VBFixedString(3), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=3)> Public MCOMP() As Char '
String
<VBFixedString(3), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=3)> Public MSITE() As Char '
String
<VBFixedString(15), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=15)> Public UDFKEY() As Char '
String
<VBFixedString(25), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=25)> Public UDFREF() As Char '
String
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1,
SizeConst:=1)> Public DEXPFLG() As Char ' String (adChar)
<VBFixedString(24), MarshalAs(UnmanagedType.ByValArray,
ArraySubType:=UnmanagedType.U1, SizeConst:=24)> Public FILLER() As Char '
String
End Structure
 
G

Gary Chang

Hi James,

Thanks for posting in the community.

Currently I am looking for somebody who could help you on it. We will reply
here with more information as soon as possible.
If you have any more concerns on it, please feel free to post here.


Thanks!

Best regards,

Gary Chang
Microsoft Online Partner Support

Get Secure! - www.microsoft.com/security
This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
 
J

James Radke

I figured out what the problem was.

I needed to add the Pack:=4 option to the StructLayout command to ensure
that all my numeric data was ending on a 4 byte boundary when it is being
marshalled and passed to the older DLL. Once I set that, everything works
great!

Thanks!

Jim
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top