JNA: чтение данных обратно из памяти в структуру - PullRequest
0 голосов
/ 26 сентября 2011

Я хочу оценить сведения об устройстве принтера с JNA.

interface GDI32Ext extends GDI32
{
    public static class DEVICEMODE extends Structure
    {
        public static class ByReference extends DEVICEMODE
            implements Structure.ByReference
        {
            public ByReference()
            {
            }
            public ByReference( Pointer memory )
            {
                super( memory );
            }
        }

        public DEVICEMODE()
        {
        }

        public DEVICEMODE( int size )
        {
            super( new Memory( size ) );
        }

        public DEVICEMODE( Pointer memory )
        {
            useMemory( memory);
            read();
        }

        public char[] dmDeviceName = new char[32];
        public short dmSpecVersion;
        public short dmDriverVersion;
        public short dmSize;
        public short dmDriverExtra;
        public int dmFields;
        public short dmOrientation = 0;
        public short dmPaperSize = 0;
        public short dmPaperLength = 0;
        public short dmPaperWidth = 0;
        public short dmScale = 0;
        public short dmCopies = 0;
        public short dmDefaultScore = 0;
        public short dmPrintQuality = 0;
        public short dmColor = 0;
        public short dmDuplex = 0;
        public short dmYResolution = 0;
        public short dmTTOption = 0;
        public short dmCollate = 0;
        public char[] dmFormName = new char[32];
        public WORD dmLogPixels;
        public int dmBitsPerPel; 
        public int dmPelsWidth;
        public int dmPelsHeight;
        public int dmNup;
        public int dmDisplayFrequency;
        public int dmICMMethod;
        public int dmICMIntent;
        public int dmMediaType;
        public int dmDitherType;
        public int dmReserved1;
        public int dmReserved2;
        public int dmPanningWidth;
        public int dmPanningHeight;

        @Override
        public String toString()
        {
            return "DEVICEMODE: dmDeviceName <" +this.dmDeviceName
                +"> dmSpecVersion <" +this.dmSpecVersion
                ....
                +"> dmPanningWidth <" +this.dmPanningWidth
                +"> dmPanningHeight <" +this.dmPanningHeight
                +">\nBytes (" +this.size() +")";
        }
    }

Выполнение:

GDI32Ext.DEVICEMODE devMode = new GDI32Ext.DEVICEMODE( (int) dwNeeded );

long dwResult = WinspoolExt.INSTANCE.DocumentProperties( null,
    handle, new WString( printerName ), devMode.getPointer(), null,
    GDI32Ext.DEFINES.DM_OUT_BUFFER );

debugToFile( "DEVICEMODE.txt", devMode.getPointer().getByteArray( 0, (int) dwNeeded ) );
System.out.println( devMode );

Проблема заключается в том, что сбрасываются байты в файлеимеет данные, но если я обращаюсь к devMode-объекту, я вижу, что не могу получить действительные данные.

DEVICEMODE: dmDeviceName <null> dmSpecVersion <0> dmDriverVersion <0> dmSize <0> dmFields <0> dmOrientation <0> dmPaperSize <0> dmPaperLength <0> dmPaperWidth <0> dmScale <0> dmCopies <0> dmDefaultScore <0> dmPrintQuality <0> dmColor <0> dmDuplex <0> dmColor <0> dmYResolution <0> dmTTOption <0> dmCollate <0> dmFormName <null> dmLogPixels <0> dmBitsPerPel <0> dmPelsWidth <0> dmPelsHeight <0> dmNup<0> dmDisplayFrequency <0> dmICMMethod <0> dmICMIntent <0> dmMediaType <0> dmDitherType <0> dmReserved1 <0> dmReserved2 <0> dmPanningWidth <0> dmPanningHeight <0>

Как работает покрытие из bytedata в Structure-Object?

ОБНОВЛЕНИЕ: После добавления

devMode.read();

я получаю данные обратно в свой объект Java-Structure.

Но теперь у меня есть проблема, которая меняется там, где она не "активна".После записи с помощью «DM_IN_BUFFER» и повторного чтения значения не изменились!

...