|
|
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Понадобилось разделить принтеры в системе по принципу локальный/сетевой. пробую делать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ( P_PRINTER_INFO_5 = ^_PRINTER_INFO_5; ) Но постоянно получаю ошибку: "System Error. Code: 122. Область данных, переданная по системному вызову, слишком мала." Подскажите, пожалуйста, что делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 11:23:07 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Попробуйте вместо GetMem\FreeMem использовать GlobalAllocPtr\GlobalFreePtr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 11:46:58 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
решил проблему выделением заведомо достаточного количества памяти: Код: pascal 1. 2. Спасибо большое за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 11:58:19 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
там проблема скорее всего в memory alignment ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:03:20 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Dagmanor, А зачем так сложно? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Не вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:30:20 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
alekcvp, Хотя, блин, там строки же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:33:23 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Dagmanor Код: pascal 1. приведи декларацию функции GetPrinter Их может быть несколько, тогда надо будет проверить, какая конкретно используется меня смущает последний параметр весьма Dagmanor Код: pascal 1. Здесь надёжнее PChar Dagmanor Код: pascal 1. 2. Правильнее Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:33:38 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
alekcvp, там все проще, издержки копипаста он ДВА РАЗА вызывает функцию GetPrinter и НИ ОДНОГО РАЗА не проверяет е результат ПЕРВАЯ вызов функции выставляет ошибку ( SetLastError ), но он её сразу не проверяет а вот после ВТОРОГО вызова он ее проверяет и выбрасывает исключение но это была ошибка ПЕРВОГО вызова, а не ВТОРОГО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:35:46 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
DagmanorПонадобилось разделить принтеры в системе по принципу локальный/сетевой в принципе ещё можно WMI использовать, но будет медленно и через брандммауэр хато единообразно для любого жеоеза и декларативно, псевдо-SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:39:31 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
alekcvp Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Не вариант? опасно в другой версии Windows структуру _PRINTER_INFO_5 вдруг как расширят, размер увеличат - и скомпилированная 5 лет назад программа начнёт выдавать ошибку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:44:29 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Ariochопасно в другой версии Windows структуру _PRINTER_INFO_5 вдруг как расширят, размер увеличат - и скомпилированная 5 лет назад программа начнёт выдавать ошибку Нет, проблема в том что структура содержит строки, а такие структуры, AFAIR, винда возвращает прикрепляя данные в её "хвост". Т.е. SizeOf(p) вернёт нам размер структуры без учета памяти под строки . Поэтому необходимо сначала получать размер и после выделять память, т.к. в этот размер входит не только размер структуры но и размер всех строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:17:47 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Ariochв другой версии Windows структуру _PRINTER_INFO_5 вдруг как расширят, размер увеличат - и скомпилированная 5 лет назад программа начнёт выдавать ошибку Это фантастика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:28:06 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
schi, в Windows очень много структур, в которых первое поле - это "размер структуры" это типовой сценарий именно потому что за десятилетия жизни Windows эти структуры развивались и их размер увеличивался, и поле "размер вот этой самой структуры" тем самым обеспечивает и версионность самой структуры и совместиость старых програм с новыми структурами в новых Windows ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:45:47 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Ariochэто типовой сценарий В данном конкретном случае проще сделать _PRINTER_INFO_11, чем ломать совместимость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 14:21:03 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
Ariochschi, в Windows очень много структур, в которых первое поле - это "размер структуры" это типовой сценарий именно потому что за десятилетия жизни Windows эти структуры развивались и их размер увеличивался, и поле "размер вот этой самой структуры" тем самым обеспечивает и версионность самой структуры и совместиость старых програм с новыми структурами в новых Windows Код: pascal 1. 2. 3. 4. 5. 6. 7. Ты тут где-то видишь размер структуры в первом поле ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 14:40:36 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
schi, конкретно тут - нет. кстати record без указания выравнивания, без спецификатора packed.... изменится компилятор - и может поехать структура. или например переход с Win32 API и Delphi ANSI->UTF16 или Win32 -> Win64 в общем, если есть возможность у Windows динамически запросить "сколько тебе памяти надо" - то это и нужно делать, а не хардкодить sizeof или вообще магические константы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 16:05:07 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
AriochDelphi ANSI->UTF16Для этой структуры размер не изменится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 16:10:46 |
|
||
|
Получение информации _PRINTER_INFO_5 о принтере
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Для этой структуры вот вот, для ЭТОЙ чем проверять каждую структуру с риском забыть или ошибиться, лучше использовать один общий принцип ----------- ну а вообще, это оффтопик зверский. Повторяю, исходная ошибка исходного автора в том, что он: 1) не проверяет результаты работы функций (возвращаемое значение) 2) ошибку от первой функции переводит в исключение не сразу, а только после вызова второй функции, чем запутал и себя и нас :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 16:26:16 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39509436&tid=2041911]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
201ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 502ms |

| 0 / 0 |
