Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как программно открыть Acrobat Reader ?

382  1 2 все
krys посетитель16.02.07 17:36
16.02.07 17:36 
Привет.
Я работаю с Visual Studio C++ 6.0.
Мне надо программно открыть Acrobat Reader и потом pdf - file. Как это можно сделать?
стойте там и слушайте сюда, именно отсюда будет проистекать
#1 
kashej посетитель16.02.07 18:06
kashej
NEW 16.02.07 18:06 
в ответ krys 16.02.07 17:36
Посмотри в документации функцию CreateProcess. Одним из ее параметров и является имя образа программы (как точно у тебя не знаю, скорей всего "acroread.exe")
А есть параметр, который и будет файлом, который хочешь открыть.
http://denis-aristov.ucoz.com
#2 
kashej посетитель16.02.07 18:17
kashej
NEW 16.02.07 18:17 
в ответ krys 16.02.07 17:36
Вообще под виндой не так все просто. До вызова CreateProcess нужно будет пару структур объявить.
Вообще лучше вот здесь почитай: http://doks.gorodok.net/?p=553#h1t2
http://denis-aristov.ucoz.com
#3 
.:Nissan:. местный житель17.02.07 18:34
NEW 17.02.07 18:34 
в ответ krys 16.02.07 17:36
В ответ на:
Мне надо программно открыть Acrobat Reader и потом pdf - file. Как это можно сделать?

Можно и просто сразу окрыть фвйл ПДВ. Есле Файлы пдф у пользователя открываються автомотически Acrobat Reader.
#4 
  Chipolino местный житель17.02.07 20:52
NEW 17.02.07 20:52 
в ответ .:Nissan:. 17.02.07 18:34
И как ты себе это представляешь ?
Process p;
p.start("file.pdf");
Я сомневаюсь что такое возможно .
#5 
.:Nissan:. местный житель17.02.07 20:59
NEW 17.02.07 20:59 
в ответ Chipolino 17.02.07 20:52
Через дельфи это возможно! Ты сам пробывал в твоём языке програм.?
#6 
  Chipolino местный житель17.02.07 21:48
NEW 17.02.07 21:48 
в ответ .:Nissan:. 17.02.07 20:59
В ответ на:

Через дельфи это возможно! Ты сам пробывал в твоём языке програм.?

Может это в виндах и возможно , если MIME тип настроены , а если не настроены ?
Путь к просмотрщику PDF нужно брать с конфига .
#7 
krys посетитель19.02.07 10:07
NEW 19.02.07 10:07 
в ответ kashej 16.02.07 18:17
спасибо за совет, но почему-то acrobat reader (для Reader 7.0 - AcroRd32(.exe) )не открывается.
Если я передаю "Notepad"-результат положительный :(.
НЕ знаешь в чем может быть дело?
стойте там и слушайте сюда, именно отсюда будет проистекать
#8 
Murr коренной житель19.02.07 10:23
Murr
NEW 19.02.07 10:23 
в ответ krys 19.02.07 10:07
В PATH=
#9 
Simple Nothing is f*cked19.02.07 11:40
Simple
NEW 19.02.07 11:40 
в ответ Chipolino 17.02.07 20:52
ShellExecute("test.pdf");
#10 
kashej посетитель19.02.07 16:56
kashej
NEW 19.02.07 16:56 
в ответ krys 19.02.07 10:07
Тогда используй абсолютный путь к программе. Например "C:\Program Files\Adobe\Acrobat 6.0\Acrobat\Acrobat.exe".
http://denis-aristov.ucoz.com
#11 
Murr коренной житель19.02.07 17:58
Murr
NEW 19.02.07 17:58 
в ответ kashej 19.02.07 16:56
А откуда уверенность, что система стоит на С:?
#12 
kashej посетитель19.02.07 18:07
kashej
NEW 19.02.07 18:07 
в ответ Murr 19.02.07 17:58
Действительно. Что же делать если не на С?...
http://denis-aristov.ucoz.com
#13 
  Chipolino местный житель19.02.07 19:59
NEW 19.02.07 19:59 
в ответ Simple 19.02.07 11:40
В ответ на:

ShellExecute("test.pdf");

Что это ?
#14 
kashej посетитель19.02.07 20:08
kashej
NEW 19.02.07 20:08 
в ответ Chipolino 19.02.07 19:59
Должно работать судя по http://www.vbarchiv.net/faq/ds_shellexecute.php
Я ее как-то использовал, но там вроде вместе с нужной программой еще и DOSовское окно открывается.
Поэтому я на CreateProcess и перешел.
http://denis-aristov.ucoz.com
#15 
  digital.pilot старожил19.02.07 21:56
digital.pilot
NEW 19.02.07 21:56 
в ответ Simple 19.02.07 11:40
а остальные параметры где, сцуко ленивое? :D
#16 
  digital.pilot старожил19.02.07 21:58
digital.pilot
NEW 19.02.07 21:58 
в ответ kashej 19.02.07 20:08
странно, у меня никогда ниче левого не открывалось (вызывал т.о. кучу муйни для открывания распространенных расширений)
#17 
kashej посетитель19.02.07 22:12
kashej
NEW 19.02.07 22:12 
в ответ digital.pilot 19.02.07 21:58
Ну может быть... Я говорю, давно это было когда я ShellExecute использовал. Просто CreateProcess элегантней на мой взгляд. И процесс можно контроллировать - запустить его параллельно к вызывающей программе или же заставить вызывающую программу ждать завершения процесса.
Может это все и с помощью ShellExecute можно реализовать - не буду спорить. В общем - скорее тут вопрос вкуса.
http://denis-aristov.ucoz.com
#18 
Такой-сякой гость19.02.07 22:33
Такой-сякой
NEW 19.02.07 22:33 
в ответ krys 19.02.07 10:07
На самом деле все прекрасно работает: и ShellExecute и CreateProcess и то что абсолютный путь к акробату нужно передавать тоже правильно и не нужно знать где стоит система (хотя и это не проблема 1)SHGetSpecialfolderLocation() повозвращает все что хочешь, 2) системная переменная %windir% дает путь установки виндовоза ну а там уж... и т.д. - всего 1000000 способов). Лезем дружно в региcтри и заценяем как сам експлорер открывает пдф. HKEY_CLASSES_ROOT\AcroExch.Document\shell\Open\command а там написано например такое "C:\Program Files\Adobe\Acrobat 6.0\Reader\AcroRd32.exe" "%1". Вот собственно и вся мулька. Это когда юзер даблкликает на пдф файле то експлорер это трансформирует в такой вот вызов. И больше тут ничего нет, ни ДОСовских окон, ни путей непонятных. Хотя я кажется понял в чем дело. У тебя может не работать по одной очень простой причине. Проверь чтобы пути содержащие пробел брались в кавычки и смело запускай
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
const char* lpcszToExecution = "\"C:\Program Files\Adobe\Acrobat 6.0\Reader\AcroRd32.exe\" \"C:\Program Files\my.pdf\"";
CreateProcess(NULL, lpcszToExecution, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
Я вам один умный вещь скажу - но только вы не обижайтесь...
#19 
Такой-сякой гость19.02.07 22:39
Такой-сякой
NEW 19.02.07 22:39 
в ответ Такой-сякой 19.02.07 22:33
И насчет ДОСовских окон... Флаг CREATE_NO_WINDOW просто таки необходим
Я вам один умный вещь скажу - но только вы не обижайтесь...
#20 
  scorpi_ коренной житель19.02.07 22:53
NEW 19.02.07 22:53 
в ответ kashej 19.02.07 22:12
ShellExecute вообще-то правильнее. Ибо юзеру виднее, чем он хочет смотреть данный файл. Может у него Foxit какой-нибудь?
Меня всегда бесили программы, которые открывают IE, вместо того чтобы воспользоваться ShellExecute, в результате чего открылся бы Firefox...
#21 
Такой-сякой гость19.02.07 23:04
Такой-сякой
NEW 19.02.07 23:04 
в ответ scorpi_ 19.02.07 22:53
Если не хочешь сам запускать CreateProcess, то можешь перепоручить это функции ShellExecute, она из-под себя сама запускает CreateProcess.
Я вам один умный вещь скажу - но только вы не обижайтесь...
#22 
  scorpi_ коренной житель19.02.07 23:08
NEW 19.02.07 23:08 
в ответ Такой-сякой 19.02.07 23:04
Я что-то недопонимаю, для чего здесь этот твой постинг? Я произвожу впечатление человека не знающего WIN32 API? Или это неясно из предыдущих постингов?
#23 
Такой-сякой гость19.02.07 23:19
Такой-сякой
NEW 19.02.07 23:19 
в ответ scorpi_ 19.02.07 23:08
Это был твой первый постинг который я прочитал вообще. Я и понятия не имею пока о твоих АПИшных познаниях. Рассуди сам. Человеку нужно просто тупо запустить пдф файл. И все. Ему не нужно возиться с ассоциациями файлов, кому что запускать и т.д... поэтому прямое и простое решение это CreateProcess, а ShellExecute во многих случаях будет работать а в 2-3 возьмет и откроет фолдер или еще чего хуже стартанет ФаерФокс
Я вам один умный вещь скажу - но только вы не обижайтесь...
#24 
kashej посетитель19.02.07 23:25
kashej
NEW 19.02.07 23:25 
в ответ scorpi_ 19.02.07 22:53
Зависит от ситуации. Если важно открыть файл только той программой, которую определил пользователь для этого типа данных, то можно управиться и с помощью ShellExecute.
Ну а если надо открыть файл другой программой, то - CreateProcess.
Вообще в таких ситуациях я включаю интуицию. ShellExecute ассоциируется с "Выполнить в терминале", а CreateProcess - "создать процесс", что в итоге-то и нужно.
http://denis-aristov.ucoz.com
#25 
Simple Nothing is f*cked20.02.07 13:00
Simple
NEW 20.02.07 13:00 
в ответ kashej 19.02.07 23:25
Shell в данном случае ничего общего с терминалом не имеет.
#26 
Simple Nothing is f*cked20.02.07 13:01
Simple
NEW 20.02.07 13:01 
в ответ scorpi_ 19.02.07 23:08
Just take it easy, man... (c) :-D
#27 
Simple Nothing is f*cked20.02.07 13:01
Simple
NEW 20.02.07 13:01 
в ответ digital.pilot 19.02.07 21:56
Ненавижу разжевывать до молекул, собственная инициатива тоже должна быть ;)
#28 
kashej посетитель20.02.07 13:07
kashej
NEW 20.02.07 13:07 
в ответ Simple 20.02.07 13:00
Как же не имеет? Если не указать определенный параметр, то запустится не только Акробат, но и окно терминала. Т.е. терминал будет отцовским процессом Акробата. А это лишняя трата ресурсов.
http://denis-aristov.ucoz.com
#29 
kashej посетитель20.02.07 13:13
kashej
NEW 20.02.07 13:13 
в ответ kashej 20.02.07 13:07
CreateProcess это системный вызов операционной системы, чтобы создать процесс. Все остальное лишнее.
ShellExecute вообще какая-то "benutzerfreundliche Version"
http://denis-aristov.ucoz.com
#30 
Simple Nothing is f*cked20.02.07 13:19
Simple
NEW 20.02.07 13:19 
в ответ kashej 20.02.07 13:07
ShellExecute( NULL, "open", "E:\\KBV\\C10_Schnittstellenbeschreibung_SDDA.pdf", NULL, NULL, SW_SHOWNORMAL );

Никакого терминала.

#31 
Gaidzin знакомое лицо21.02.07 15:57
Gaidzin
21.02.07 15:57 
в ответ Такой-сякой 19.02.07 22:33
В ответ на:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( π, sizeof(pi) );
const char* lpcszToExecution = "\"C:\Program Files\Adobe\Acrobat 6.0\Reader\AcroRd32.exe\" \"C:\Program Files\my.pdf\"";
CreateProcess(NULL, lpcszToExecution, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, π);

Хотел бы задать смежный вопрос, что бы не открывать отдельную ветку.
А как "убить" процесс запущенный в CreateProcess() из запускающей программы?
Сейчас используется примерно такой код
В ответ на:

PostMessage(FindWindow(NULL, MainWindowName), WM_CLOSE, 0, 0);

Все работает, однако необходимо задавать помимо имени программы (для запуска) еще и имя ее главного окна (а оно у некоторых программ может и менятся в процессе работы).
Может быть существует более изящное решение? Желательно не TerminateProcess() и без встраивания обработчиков сообщений в вызываемую программу.
Возможно ли через STARTUPINFO или PROCESS_INFORMATION получить имя главного окна программы или его дескриптор?
Зараннее благодарен за ответ.
#32 
krys посетитель29.03.07 12:09
NEW 29.03.07 12:09 
в ответ Такой-сякой 19.02.07 22:33
Спасибо за подробный ответ.
У меня есть еще один вопрос по локализации исполнительного Фаила.
Мне надо запустить сейчас хтмл страницу как отдельную инстанцию. Для этого мне требуется найти фаил iexplorer.exe. Насколько корректно следующее решение(я велосипеда не изобретал, а перенял старый код, но имеются и отличия):
CString str;
HKEY hKeyOLE=NULL;

if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_CLASSES_ROOT ,_T("Applications\\iexplore.exe\\shell\\open\\command"),0,KEY_READ, &hKeyOLE))
{

TCHAR szVISDir[MAX_PATH];
szVISDir[0] = '\0';

DWORD dwType = REG_SZ;
DWORD dwSize = sizeof(szVISDir);
if(ERROR_SUCCESS==RegQueryValueEx(hKeyOLE,_T(""),NULL, &dwType,(LPBYTE)szVISDir, &dwSize))
//Здесь _Т("") стоит для поля (Standard)
{
str=szVISDir;
}

RegCloseKey(hKeyOLE);
}
я получаю следующий стринг :
"C:\Programme\Internet Explorer\IEXPLORE.EXE" %1
потом я заменяю %1 на имя фаила который надо открыть.
стойте там и слушайте сюда, именно отсюда будет проистекать
#33 
Simple Nothing is f*cked29.03.07 12:37
Simple
NEW 29.03.07 12:37 
в ответ krys 29.03.07 12:09
Нах...я? Сделай тот же ShellExecute.
#34 
krys посетитель29.03.07 14:07
NEW 29.03.07 14:07 
в ответ Simple 29.03.07 12:37
Если ты имеешь ввиду что я просто с помoщью ShellExecute сам HTML-Документ открыть могу, то мне это не подходит.Т.к. если IExplorer уже был открыт с другим документом, то мой отктывается как ещ╦ одно окно.
Если же я хочу открыть и IExplorer и Документ, как я это в командной строке сделал:
iexplore.exe D:\Doc.HTML
...то как я понимаю я должен в ShellExecute (или CreateProcess) указать путь по которому я найду этот самый iexplore.exe . А он может быть разным.
стойте там и слушайте сюда, именно отсюда будет проистекать
#35 
Simple Nothing is f*cked29.03.07 14:28
Simple
NEW 29.03.07 14:28 
в ответ krys 29.03.07 14:07
Тоды ой.
#36 
1 2 все