0

I am upgrading an old VB6 project over to .NET and have run into a problem where the following line is used

CopyMemory(lpDevMode, DevMode, Len(DevMode))

Devmode is a struct that looks like this:

Public Structure DEVMODE_TYPE
    'UPGRADE_WARNING: Fixed-length string size must fit in the buffer. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="3C1E4426-0B80-443E-B943-0627CD55D48B"'
    <VBFixedString(CCHDEVICENAME),System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,SizeConst:=CCHDEVICENAME)> Public dmDeviceName() As Char
    Dim dmSpecVersion As Short
    Dim dmDriverVersion As Short
    Dim dmSize As Short
    Dim dmDriverExtra As Short
    Dim dmFields As Integer
    Dim dmOrientation As Short
    Dim dmPaperSize As Short
    Dim dmPaperLength As Short
    Dim dmPaperWidth As Short
    Dim dmScale As Short
    Dim dmCopies As Short
    Dim dmDefaultSource As Short
    Dim dmPrintQuality As Short
    Dim dmColor As Short
    Dim dmDuplex As Short
    Dim dmYResolution As Short
    Dim dmTTOption As Short
    Dim dmCollate As Short
    'UPGRADE_WARNING: Fixed-length string size must fit in the buffer. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="3C1E4426-0B80-443E-B943-0627CD55D48B"'
    <VBFixedString(CCHFORMNAME),System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,SizeConst:=CCHFORMNAME)> Public dmFormName() As Char
    Dim dmUnusedPadding As Short
    Dim dmBitsPerPel As Short
    Dim dmPelsWidth As Integer
    Dim dmPelsHeight As Integer
    Dim dmDisplayFlags As Integer
    Dim dmDisplayFrequency As Integer
End Structure

CopyMemory was originally declared using As Any so I had to change that to As Integer for the second value (Integer fit a line of code being used elsewhere). I need to specify which value contained in DevMode is the right one, but I don't know which to pass to the method, it must have been handled automatically in VB6. How do I find out which one VB6 was passing?

I believe there are a few other instances of code like this being used so ideally I could find out how vb6 handled situations like this and repeat the fix elsewhere in the code.

Bryan
  • 623
  • 1
  • 6
  • 23
  • 1
    I don't think you understand what is happening. CopyMemory is making a copy of the entire struct. You want a .NET way of doing this now. Have a look at this question - http://stackoverflow.com/questions/78536/deep-cloning-objects – jac Aug 08 '14 at 20:55
  • 3
    Don't use anything like CopyMemory(), you can simply use normal assignment to a variable to copy a struct. Pretty unlikely you should try porting this code at all, the PrinterSettings class wraps DEVMODE for a printer. – Hans Passant Aug 08 '14 at 22:12

0 Answers0