AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.11.2006, 21:47   #1  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
? ChangeDisplaySettings
Всем доброго времени суток!
Собственно проблемка в том что функция EnumDisplaySettings упорно не желает заполнять передаваемую структуру
Если есть какие либо идеи буду признателен.

Код:
client static str ChangeDisplaySettings()
{
    DLL             DLL;
    DLLFunction     DLLFunction;
    Binary          DEVMODE                 = WinApi::NewDEVMODE();
    str             st;
    ;

    DLL = new DLL(#UserDLL);
    DLLFunction = new DLLFunction(DLL, 'ChangeDisplaySettingsA');

    DLLFunction.returns(ExtTypes::DWord);
    DLLFunction.arg(ExtTypes::DWord,
                    ExtTypes::DWord);

    DEVMODE = WinApi::EnumDisplaySettings();

    DEVMODE.dWord(46, 32);
    DEVMODE.dWord(50, 1024);
    DEVMODE.dWord(54, 768);

    st = strfmt( '%1', DLLFunction.call( DEVMODE, #CDS_TEST ) );
    return st;
}
Код:
client static Binary EnumDisplaySettings ()
{
    DLL             DLL;
    DLLFunction     DLLFunction;
    Binary          DEVMODE      = WinApi::NewDEVMODE();
    ;

    DLL = new DLL(#UserDLL);
    DLLFunction = new DLLFunction(DLL, 'EnumDisplaySettingsA');

    DLLFunction.returns(ExtTypes::DWord);
    DLLFunction.arg(ExtTypes::String,
                    ExtTypes::DWord,
                    ExtTypes::Pointer);


    DLLFunction.call( 0, 0, DEVMODE);
    return DEVMODE;
}
Код:
#define.SizeOfStruct        (94)

static Binary NewDEVMODE()
{
    Binary          DEVMODE      = new Binary(#SizeOfStruct);
;
    DEVMODE.dWord   (0, 94); // Specifies the size, in bytes, of the structure
    DEVMODE.string  ( 4 );  //dmDeviceName
    DEVMODE.word    ( 6 );  //dmSpecVersion
    DEVMODE.word    ( 8 );  //dmDriverVersion
    DEVMODE.word    ( 10 ); //dmSize
    DEVMODE.word    ( 12 ); //dmDriverExtra
    DEVMODE.dWord   ( 20 ); //dmFields

    DEVMODE.word    ( 22 ); //dmScale
    DEVMODE.word    ( 24 ); //dmCopies
    DEVMODE.word    ( 26 ); //dmDefaultSource
    DEVMODE.word    ( 28 ); //dmPrintQuality
    DEVMODE.word    ( 30 ); //dmColor
    DEVMODE.word    ( 32 ); //dmDuplex
    DEVMODE.word    ( 34 ); //dmYResolution
    DEVMODE.word    ( 36 ); //dmTTOption
    DEVMODE.word    ( 38 ); //dmCollate

    DEVMODE.string  ( 42 ); //dmFormName
    DEVMODE.word    ( 44 ); //dmUnusedPadding
    DEVMODE.word    ( 46 ); //dmBitsPerPel
    DEVMODE.dWord   ( 50 ); //dmPelsWidth
    DEVMODE.dWord   ( 54 ); //dmPelsHeight

    DEVMODE.dWord   ( 58 ); //dmDisplayFrequency
    DEVMODE.dWord   ( 62 ); //dmICMMethod
    DEVMODE.dWord   ( 66 ); //dmICMIntent
    DEVMODE.dWord   ( 70 ); //dmMediaType
    DEVMODE.dWord   ( 74 ); //dmDitherType
    DEVMODE.dWord   ( 78 ); //dmReserved1
    DEVMODE.dWord   ( 82 ); //dmReserved2
    DEVMODE.dWord   ( 86 ); //dmPanningWidth
    DEVMODE.dWord   ( 90 ); //dmPanningHeight

    return DEVMODE;
}
Старый 05.11.2006, 22:22   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Размер и поля вашей структуры отличаются от данных MSDN. DEVMODE

Еще. Первый входной парамер для функции EnumDisplaySettingsA вы указывает тип - стринг, а передаете 0. Если хотите передать NULL, то сделайте тип - DWord
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 05.11.2006 в 23:15.
Старый 05.11.2006, 23:22   #3  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Сделал как в МСДН , но, очевидно, все равно есть ошибка

X++:
#define.SizeOfStruct        (206)

static Binary NewDEVMODE()
{
    Binary          DEVMODE      = new Binary(#SizeOfStruct);
    container       con          = WinAPI::getVersion();
;
    DEVMODE.dWord   (0, 198); // Specifies the size, in bytes, of the structure
    DEVMODE.dWord   ( 8 );  //dmDeviceName[CCHDEVICENAME];
    DEVMODE.word    ( 10 );  //dmSpecVersion
    DEVMODE.word    ( 12 );  //dmDriverVersion
    DEVMODE.word    ( 16 ); //dmSize
    DEVMODE.word    ( 20 ); //dmDriverExtra
    DEVMODE.dWord   ( 24 ); //dmFields

    DEVMODE.word    ( 26 ); //dmOrientation
    DEVMODE.word    ( 28 ); //dmPaperSize
    DEVMODE.word    ( 30 ); //dmPaperLength
    DEVMODE.word    ( 32 ); //dmPaperWidth
    DEVMODE.word    ( 34 ); //dmScale
    DEVMODE.word    ( 36 ); //dmCopies
    DEVMODE.word    ( 38 ); //dmDefaultSource
    DEVMODE.word    ( 40 ); //dmPrintQuality
    DEVMODE.dWord   ( 48 ); //dmPosition
    DEVMODE.dWord   ( 56 ); //dmDisplayOrientation
    DEVMODE.dWord   ( 64 ); //dmDisplayFixedOutput

    DEVMODE.word    ( 66 ); //dmColor
    DEVMODE.word    ( 68 ); //dmDuplex
    DEVMODE.word    ( 70 ); //dmYResolution
    DEVMODE.word    ( 72 ); //dmTTOption
    DEVMODE.word    ( 74 ); //dmCollate
    DEVMODE.dWord   ( 82 ); //dmFormName[CCHFORMNAME]; ???
    DEVMODE.word    ( 84 ); //dmLogPixels
    DEVMODE.dWord   ( 92 ); //dmBitsPerPel
    DEVMODE.dWord   ( 100 ); //dmPelsWidth
    DEVMODE.dWord   ( 108 ); //dmPelsHeight

    DEVMODE.dWord   ( 120 ); //dmDisplayFlags
    DEVMODE.dWord   ( 128 ); //dmNup

    DEVMODE.dWord   ( 136 ); //dmDisplayFrequency

    if (conPeek(con, 4) >= 0x0400)
    {
        DEVMODE.dWord   ( 144 ); //dmICMMethod
        DEVMODE.dWord   ( 152 ); //dmICMIntent
        DEVMODE.dWord   ( 160 ); //dmMediaType
        DEVMODE.dWord   ( 168 ); //dmDitherType
        DEVMODE.dWord   ( 176 ); //dmReserved1
        DEVMODE.dWord   ( 182 ); //dmReserved2
    }
    if (conPeek(con, 4) >= 0x0500 || conPeek(con, 4) >= 0x0400)
    {
        DEVMODE.dWord   ( 190 ); //dmPanningWidth
        DEVMODE.dWord   ( 198 ); //dmPanningHeight
    }


    return DEVMODE;
}
Неуверен что правильно делаю смещение для BCHAR dmDeviceName[CCHDEVICENAME] и BYTE dmFormName[CCHFORMNAME]; Я делаю dWord и смещение на 8.
Старый 05.11.2006, 23:42   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Размер структуры для Win2000+ 156 байт
X++:
        DEVMODE.byte    ( 0 );  //dmDeviceName
        DEVMODE.word    ( 32 );  //dmSpecVersion
        DEVMODE.word    ( 34 );  //dmDriverVersion
        DEVMODE.word    ( 36, #SizeOfStruct); //dmSize
        DEVMODE.word    ( 38 ); //dmDriverExtra
        DEVMODE.dWord   ( 40 ); //dmFields

        DEVMODE.word    ( 44 ); // dmOrientation;
        DEVMODE.word    ( 46 ); // dmPaperSize;
        DEVMODE.word    ( 48 ); // dmPaperLength;
        DEVMODE.word    ( 50 ); // dmPaperWidth;
        DEVMODE.word    ( 52 ); //dmScale
        DEVMODE.word    ( 54 ); //dmCopies
        DEVMODE.word    ( 56 ); //dmDefaultSource
        DEVMODE.word    ( 58 ); //dmPrintQuality

        DEVMODE.word    ( 60 ); //dmColor
        DEVMODE.word    ( 62 ); //dmDuplex
        DEVMODE.word    ( 64 ); //dmYResolution
        DEVMODE.word    ( 66 ); //dmTTOption
        DEVMODE.word    ( 68 ); //dmCollate

        DEVMODE.byte    ( 70 ); //dmFormName
        DEVMODE.word    ( 102 ); //dmLogPixels
        DEVMODE.word    ( 104 ); //dmBitsPerPel
        DEVMODE.dWord   ( 108 ); //dmPelsWidth
        DEVMODE.dWord   ( 112 ); //dmPelsHeight
        DEVMODE.dWord   ( 116 ); //dmDisplayFlags

        DEVMODE.dWord   ( 120 ); //dmDisplayFrequency
        DEVMODE.dWord   ( 124 ); //dmICMMethod
        DEVMODE.dWord   ( 128 ); //dmICMIntent
        DEVMODE.dWord   ( 132 ); //dmMediaType
        DEVMODE.dWord   ( 136 ); //dmDitherType
        DEVMODE.dWord   ( 140 ); //dmReserved1
        DEVMODE.dWord   ( 144 ); //dmReserved2
        DEVMODE.dWord   ( 148 ); //dmPanningWidth
        DEVMODE.dWord   ( 152 ); //dmPanningHeight
dmDeviceName и dmFormName - это массивы символов (байт) размером по 32.

Вообще, нужно вызывать только это - установление размера структуры
X++:
DEVMODE.word    ( 36, #SizeOfStruct);
Остальные вызовы просто возвращают 0 для неинициализированной структуры.
__________________
Axapta v.3.0 sp5 kr2
Старый 06.11.2006, 00:42   #5  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Сделал, как Вы написали, только dmSize заполнял и даже циклом прошелся по нему, задавая размер структуры, но без изменений
Может я функцию неправильно вызываю?

X++:
#define.SizeOfStruct        (156)

static Binary NewDEVMODE()
{
    Binary          DEVMODE      = new Binary(#SizeOfStruct);
    container       con          = WinAPI::getVersion();
;

//    DEVMODE.dWord   (0, #SizeOfStruct); // Specifies the size, in bytes, of the structure
    DEVMODE.byte    ( 0 );  //dmDeviceName[CCHDEVICENAME];
    DEVMODE.word    ( 32 );  //dmSpecVersion
    DEVMODE.word    ( 34 );  //dmDriverVersion
    DEVMODE.word    ( 36, #SizeOfStruct ); //dmSize
    DEVMODE.word    ( 38 ); //dmDriverExtra
    DEVMODE.dWord   ( 40 ); //dmFields

    DEVMODE.word    ( 44 ); //dmOrientation
    DEVMODE.word    ( 46 ); //dmPaperSize
    DEVMODE.word    ( 48 ); //dmPaperLength
    DEVMODE.word    ( 50 ); //dmPaperWidth
    DEVMODE.word    ( 52 ); //dmScale
    DEVMODE.word    ( 54 ); //dmCopies
    DEVMODE.word    ( 56 ); //dmDefaultSource
    DEVMODE.word    ( 58 ); //dmPrintQuality

//    DEVMODE.dWord   ( 48 ); //dmPosition
//    DEVMODE.dWord   ( 56 ); //dmDisplayOrientation
//    DEVMODE.dWord   ( 64 ); //dmDisplayFixedOutput

    DEVMODE.word    ( 60 ); //dmColor
    DEVMODE.word    ( 62 ); //dmDuplex
    DEVMODE.word    ( 64 ); //dmYResolution
    DEVMODE.word    ( 66 ); //dmTTOption
    DEVMODE.word    ( 68 ); //dmCollate
    DEVMODE.byte    ( 70 ); //dmFormName[CCHFORMNAME]; ???
    DEVMODE.word    ( 102 ); //dmLogPixels
    DEVMODE.dWord   ( 104 ); //dmBitsPerPel
    DEVMODE.dWord   ( 108 ); //dmPelsWidth
    DEVMODE.dWord   ( 112 ); //dmPelsHeight

    DEVMODE.dWord   ( 116 ); //dmDisplayFlags
//    DEVMODE.dWord   ( 120 ); //dmNup

    DEVMODE.dWord   ( 120 ); //dmDisplayFrequency

//    if (conPeek(con, 4) >= 0x0400)
    {
        DEVMODE.dWord   ( 124 ); //dmICMMethod
        DEVMODE.dWord   ( 128 ); //dmICMIntent
        DEVMODE.dWord   ( 132 ); //dmMediaType
        DEVMODE.dWord   ( 136 ); //dmDitherType
        DEVMODE.dWord   ( 140 ); //dmReserved1
        DEVMODE.dWord   ( 144 ); //dmReserved2
    }
//    if (conPeek(con, 4) >= 0x0500 || conPeek(con, 4) >= 0x0400)
    {
        DEVMODE.dWord   ( 148 ); //dmPanningWidth
        DEVMODE.dWord   ( 152 ); //dmPanningHeight
    }

    return DEVMODE;
}
Входной параметр поменял, без результатов.

Последний раз редактировалось Link; 06.11.2006 в 00:53.
Старый 06.11.2006, 09:16   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А Windows какая? 98?
У меня такой код проходит на ура (WinXP, для 98 и Me не проверял - не на чем)
X++:
static void DisplaySettings(Args _args)
{
#define.UserDLL("user32.dll")

    Binary dm;
    Binary NewDEVMODE()
    {
        container       con          = WinAPI::getVersion();
        int             SizeOfStruct = conpeek(con, 1) > 4 ? 156 : 148;
        Binary          DEVMODE      = new Binary(SizeOfStruct);
        ;
        DEVMODE.word    ( 36, SizeOfStruct ); //dmSize
        return DEVMODE;
    }

    Binary EnumDisplaySettings ()
    {
        DLL             DLL;
        DLLFunction     DLLFunction;
        Binary          DEVMODE      = NewDEVMODE();
        ;

        DLL = new DLL(#UserDLL);
        DLLFunction = new DLLFunction(DLL, 'EnumDisplaySettingsA');

        DLLFunction.returns(ExtTypes::DWord);
        DLLFunction.arg(ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::Pointer);


        DLLFunction.call( 0, 0, DEVMODE);
        return DEVMODE;
    }
    ;
    dm = EnumDisplaySettings();
    info(dm.string(0));
}
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Link (1).
Старый 06.11.2006, 12:05   #7  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Thumbs up
Большое спасибо AndyD, работает !
Моя ошибка была в том, что я выводил в инфолог саму структуру а не DEVMODE.string(0), поэтому не мог увидеть что она заполнилась.
Спасибо, что помогли разобраться.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:35.