Вход на сайт
Как программно открыть Acrobat Reader ?
16.02.07 17:36
Привет.
Я работаю с Visual Studio C++ 6.0.
Мне надо программно открыть Acrobat Reader и потом pdf - file. Как это можно сделать?
Я работаю с Visual Studio C++ 6.0.
Мне надо программно открыть Acrobat Reader и потом pdf - file. Как это можно сделать?
стойте там и слушайте сюда, именно отсюда будет проистекать
NEW 19.02.07 22:12
в ответ digital.pilot 19.02.07 21:58
Ну может быть... Я говорю, давно это было когда я ShellExecute использовал. Просто CreateProcess элегантней на мой взгляд. И процесс можно контроллировать - запустить его параллельно к вызывающей программе или же заставить вызывающую программу ждать завершения процесса.
Может это все и с помощью ShellExecute можно реализовать - не буду спорить. В общем - скорее тут вопрос вкуса.
Может это все и с помощью ShellExecute можно реализовать - не буду спорить. В общем - скорее тут вопрос вкуса.
http://denis-aristov.ucoz.com
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);
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);
Я вам один умный вещь скажу - но только вы не обижайтесь...
NEW 19.02.07 22:53
в ответ kashej 19.02.07 22:12
ShellExecute вообще-то правильнее. Ибо юзеру виднее, чем он хочет смотреть данный файл. Может у него Foxit какой-нибудь?
Меня всегда бесили программы, которые открывают IE, вместо того чтобы воспользоваться ShellExecute, в результате чего открылся бы Firefox...
Меня всегда бесили программы, которые открывают IE, вместо того чтобы воспользоваться ShellExecute, в результате чего открылся бы Firefox...
NEW 19.02.07 23:19
в ответ scorpi_ 19.02.07 23:08
Это был твой первый постинг который я прочитал вообще. Я и понятия не имею пока о твоих АПИшных познаниях. Рассуди сам. Человеку нужно просто тупо запустить пдф файл. И все. Ему не нужно возиться с ассоциациями файлов, кому что запускать и т.д... поэтому прямое и простое решение это CreateProcess, а ShellExecute во многих случаях будет работать а в 2-3 возьмет и откроет фолдер или еще чего хуже стартанет ФаерФокс
Я вам один умный вещь скажу - но только вы не обижайтесь...
NEW 19.02.07 23:25
в ответ scorpi_ 19.02.07 22:53
Зависит от ситуации. Если важно открыть файл только той программой, которую определил пользователь для этого типа данных, то можно управиться и с помощью ShellExecute.
Ну а если надо открыть файл другой программой, то - CreateProcess.
Вообще в таких ситуациях я включаю интуицию. ShellExecute ассоциируется с "Выполнить в терминале", а CreateProcess - "создать процесс", что в итоге-то и нужно.
Ну а если надо открыть файл другой программой, то - CreateProcess.
Вообще в таких ситуациях я включаю интуицию. ShellExecute ассоциируется с "Выполнить в терминале", а CreateProcess - "создать процесс", что в итоге-то и нужно.
http://denis-aristov.ucoz.com
21.02.07 15:57
Хотел бы задать смежный вопрос, что бы не открывать отдельную ветку.
А как "убить" процесс запущенный в CreateProcess() из запускающей программы?
Сейчас используется примерно такой код
Все работает, однако необходимо задавать помимо имени программы (для запуска) еще и имя ее главного окна (а оно у некоторых программ может и менятся в процессе работы).
Может быть существует более изящное решение? Желательно не TerminateProcess() и без встраивания обработчиков сообщений в вызываемую программу.
Возможно ли через STARTUPINFO или PROCESS_INFORMATION получить имя главного окна программы или его дескриптор?
Зараннее благодарен за ответ.
в ответ Такой-сякой 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, π);
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);
PostMessage(FindWindow(NULL, MainWindowName), WM_CLOSE, 0, 0);
Все работает, однако необходимо задавать помимо имени программы (для запуска) еще и имя ее главного окна (а оно у некоторых программ может и менятся в процессе работы).
Может быть существует более изящное решение? Желательно не TerminateProcess() и без встраивания обработчиков сообщений в вызываемую программу.
Возможно ли через STARTUPINFO или PROCESS_INFORMATION получить имя главного окна программы или его дескриптор?
Зараннее благодарен за ответ.
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 на имя фаила который надо открыть.
У меня есть еще один вопрос по локализации исполнительного Фаила.
Мне надо запустить сейчас хтмл страницу как отдельную инстанцию. Для этого мне требуется найти фаил 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 на имя фаила который надо открыть.
стойте там и слушайте сюда, именно отсюда будет проистекать
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 . А он может быть разным.
Если же я хочу открыть и IExplorer и Документ, как я это в командной строке сделал:
iexplore.exe D:\Doc.HTML
...то как я понимаю я должен в ShellExecute (или CreateProcess) указать путь по которому я найду этот самый iexplore.exe . А он может быть разным.
стойте там и слушайте сюда, именно отсюда будет проистекать