05.11.2006, 21:47 | #1 |
Британский учённый
|
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 |
Участник
|
Размер и поля вашей структуры отличаются от данных MSDN. DEVMODE
Еще. Первый входной парамер для функции EnumDisplaySettingsA вы указывает тип - стринг, а передаете 0. Если хотите передать NULL, то сделайте тип - DWord
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 05.11.2006 в 23:15. |
|
05.11.2006, 23:22 | #3 |
Британский учённый
|
Сделал как в МСДН , но, очевидно, все равно есть ошибка
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; } |
|
05.11.2006, 23:42 | #4 |
Участник
|
Размер структуры для 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 Вообще, нужно вызывать только это - установление размера структуры X++: DEVMODE.word ( 36, #SizeOfStruct);
__________________
Axapta v.3.0 sp5 kr2 |
|
06.11.2006, 00:42 | #5 |
Британский учённый
|
Сделал, как Вы написали, только 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 |
Участник
|
А 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 |
Британский учённый
|
Большое спасибо AndyD, работает !
Моя ошибка была в том, что я выводил в инфолог саму структуру а не DEVMODE.string(0), поэтому не мог увидеть что она заполнилась. Спасибо, что помогли разобраться. |
|