|
Можно ли как-то понять, что возвращает API запущенная через rundll32.exe?
|
|||
---|---|---|---|
#18+
Задача - печать файла (пусть будет картинка "C:\path\mypict.tif") на заданный принтер "MyPrinterName". Решение #1. Метод "printto". Реализация: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Метод имеет недостатки. В реестре может не оказаться ключа HKEY_CLASSES_ROOT\TIFImage.Document\shell\printto\command Код: vbnet 1.
И на 8-ке/8.1 в 99 случаев из 100 печать не сработает. Но shimgvw.dll есть везде и всегда, поэтому правильнее Print an image using ShellExecute (CSShellPrintImageWithShellExecute) Решение #2. использовать shimgvw.dll в лоб : Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Проблема. ret всегда больше 32, даже если печать не удалась. А мне надо знать результат НАПЕЧАТАЛИ УСПЕШНО либо ОШИБКА. Как узнать? Косвенно: делаю проверку на GDI-совместимость. Но иконки (ico) например на GDI проходят, а на XP ImageView_PrintTo их не печатает. Т.е. такая проверка замороченная и не точная. Пытался вызывать ImageView_PrintTo декларируя ее как обычную API -должна же она что-то возвращать - ничего не получается-не работает, только через rundll32.exe. Т.е. printto не надежен в плане гарантии печати (но ошибку в случае не печати ShellExecute возвращает четко). А здесь печатает четко (то что должен печатать), но не возвращает результат (где гарантия что в ф-цию не подсунут текстовуху переименованную в jpg). Как выкручиваться? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2014, 11:26 |
|
Можно ли как-то понять, что возвращает API запущенная через rundll32.exe?
|
|||
---|---|---|---|
#18+
Дмитрий77Можно ли как-то понять, что возвращает API Засада, ничего она не возвращает. После чтения этой статьи СВЕДЕНИЯ: интерфейс программ Windows Rundll и Rundll32 удалось грамотно запустить ImageView_PrintTo вообще напрямую (без rundll32.exe и ShellExecute): Код: vbnet 1. 2. 3. 4.
Работает (метод кстати универсальный для таких штук). Но возвращает всегда 0 - даже если печать не состоялась. Т.е. ничего не возвращает. А как мне отследить УСПЕХ/ НЕ УСПЕХ печати? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2014, 19:08 |
|
Можно ли как-то понять, что возвращает API запущенная через rundll32.exe?
|
|||
---|---|---|---|
#18+
Дмитрий77, Что возвращает Err.LastDllError? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 01:22 |
|
Можно ли как-то понять, что возвращает API запущенная через rundll32.exe?
|
|||
---|---|---|---|
#18+
ATM-TURBO 2, ATM-TURBO 2, ничего она умного не возвращает, и не может вернуть в принципе. Потому что нет ошибки. Даже если печатать через shimgvw.dll,ImageView_PrintTo заведомо невалидный файл, т.е. txt ico (в XP не печатает, в 8-ке печатает) пустой bmp пустышку неверного формата например txt переименованный в jpg, bmp и т.п. то ОН ЕГО ВСЕ РАВНО "ПЕЧАТАЕТ" -это ясно из появления монитора принтера в трее, т.е. err как таковой просто нет Проблема всплывает потом, не будучи отслеженной. Я использую виртуальный принтер (результат - образование файла tiff), который по окончании печати запускает некоторый EXE с параметром имя файла tiff, кот. есть результат печати. (механизм запуска exe и сам принтер -чужие - хакнуты мной из другой проги, а вот этот exe -моего производства) - Дык вот, во всех проблемных случаях (pdf, ico, пустой bmp) этот мой EXE не запускается. В EXE и в основной проге (которая делает printto) использована некая логика. Например, я печатаю несколько картинок подряд, пока EXE не "словил" картинку(имя кот. заранее неизвестно), нельзя печатать следующий файл. 1) EXE запустился, с файлом-параметром (результат печати), значит можно давать команду делать следующее printto 2) Если при printto отловилась ОШИБКА (результатов печати не будет), значит можно делать следующее printto Если ОШИБКА не отловилась и EXE никогда не запустится, то мой "цикл" встанет . Дмитрий77Т.е. printto не надежен в плане гарантии печати (но ошибку в случае не печати ShellExecute возвращает четко). Ни фига ShellExecute не надежен. При "ошибке" он обычно возвращает (например при печати ico): (== 31, meaning SE_ERR_NOASSOC), than according to shellapi.h "There is no application associated with the given file name extension.", which что просто означает, что нет ассоциации с "printto" в реестре системы(shimgvw.dll,ImageView_PrintTo или другая ассоциация не прописана для данного типа файлов) , а никак не ОШИБКУ в ImageView_PrintTo. А пустой BMP он тоже пропустит с Err(ShellExecute)=42 (больше 32 - не ошибка), и точно также EXE не запустится и мой цикл встанет. Как вариант, я конечно могу "ждать EXE в течении разумного времени", но разумность вещь относительная: "печать" 100-страничного документа может занять несколько минут, а обычные 1-2 страницы это 1-2 секунды. Но по сути вопроса топика, вопрос можно снять за его бессмыслицей. Ибо нельзя отследить ошибку которой нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 03:27 |
|
|
start [/forum/topic.php?fid=60&fpage=43&tid=2156388]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
102ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 461ms |
0 / 0 |