|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Не работает команда Run("c:\ss.doc"). Возвращает -1. Вариант Run("start c:\ss.doc") то же не проходит. Если кто знает, подскажите где ошибка. Заранее благодарен. Windows 2000 Professional PB Enterprise 9.0.1. Build 6533 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 10:06 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Ну вообще Run запускает на выполнение какую то программу (exe и т.п.), но не как не doc. Попробуй поработать через ole... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 10:16 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Файлы с зарегистрированными в Windows расширениями запускать надо через ShellExecute(Ex). Библиотеку для работы с данной функцией можно взять у меня на сайте lokshinmark.narod.ru/download.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 10:47 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
В глобальных внешних фунциях определяем Код: plaintext 1. 2. 3. 4. 5.
Создаем функцию для запуска файла, возможно с параметрами командной строки : Код: plaintext 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
Где надо , ее используем Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 11:02 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Для того, чтобы открыть с помощью команды run(<string>) оффисный документ, картинку, текстовый документ или иной файл, ассоциированый в ОС с каким либо приложением, нужно формировать строку запуска из имени приложения с полным путем и имени файла с полным путем. Так в Вашем случае вам нужно делать вызов примерно так: Код: plaintext 1. 2. 3.
Точно так же, с полным путем лучше и приложения запускать, т.к. нет гарантии, что запускаемое Вами из кода приложение имеет прописанные в ОС пути у конечного пользователя. Так же велика вероятность, что пути у пользователя могут не совпадать со стандартными, по этому их лучше либо выносить в настройку, либо динамически подгружать из реестра. --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 11:12 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Обрати внимание, что эта функция работает асинхронно, могут возникнуть проблемы. Если необходимо, то ищи тему про асинхронность в этом форуме. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 11:13 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
2 Локшин Марк & Вовик ИМХО, не стОит дергать внешние функции если можно обойтись собственными силами... Тем более что, на сколько я понял, человеку нужно дергать офисные документы (*.doc, *.xls, и т.п.). Вполне можно двумя-тремя "заглядываниями" в реестр дернуть оттудова пути к офису и выполнять через Run()... --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 11:16 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Всем спасибо! Сделал как посоветовал Ikar - получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 11:58 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
to Ikar Нужно использовать именно ShellExecute(Ex). Эта функция предназначена именно для этих целей и "собственными" силами здесь не обойтись. Кто вам сказал что *.doc ассоциирован именно с офисом? Например сразу после установки Windows он связан с WordPad'ом. Так что нужно использовать те функции, которые предлагает для это использовать производитель ОС, тем более, что PB это позволяет сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 12:04 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
2 Локшин Марк Нет, Марк, Позвольте с Вами не согласиться! По сути, что делает функция ShellExecute(Ex) ? Она делает абсолютно тоже самое, что я и описал - лезет в реестр, ищет по расширению файла с каким приложением он асоциирован, формирует строку команды на выполнение и запускает ее. Но, подгружая ее как внешнюю функцию мы выделяем под нее память, разве не так? А так как вызовы этой функции вероятны из нескольких точек приложения, нам естественно очень захочется определить ее как глобальную. Следовательно, память, которую она отожрет, она будет держать весь сеанс работы. С другой стороны, если мы сделаем ее аналог в качестве глобальной функции средствами РВ внутри приложения, то мы экономим на памяти. Да ,экономия памяти не столь заметна на одной - двух функциях, но вот когда их количество растет - это уже становится критичным. В своей работе я тоже однажды столкнулся с подобной проблемой. И тоже решил пойти путем внешних функций. Но, слава Биллу, более опытные коллеги объяснили что к чему и направили "в правильное русло". К сожалению я не могу привести здесь тот код, который выполняет эту задачу (он является частью корпоративного продукта), но могу, если хотите, подсказать в каких ветках реестра копать... --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 12:50 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Да, было бы интересно. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Extensions - здесь? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 13:27 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
2 umalov Нет, [HKEY_CLASSES_ROOT\...] - описания расширений файлов и ассоциированных приложений... --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 13:42 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
В догонку поясню на примере для *.doc: Раздел [HKEY_CLASSES_ROOT\.doc] в параметре по умолчанию содержит имя подраздела ассоциированного приложения - Word.Document.8 А раздел [HKEY_CLASSES_ROOT\Word.Document.8\shell\Open\command] в параметре по умолчаинию содержит путь к приложению, с которым ассоциирован файл... --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 13:51 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
to Ikar >Нет, Марк, Позвольте с Вами не согласиться! По сути, что делает функция >ShellExecute(Ex)? Она делает абсолютно тоже самое, что я и описал - лезет в >реестр, ищет по расширению файла с каким приложением он асоциирован, >формирует строку команды на выполнение и запускает ее. А в следующей версии Windows/Office Microsoft поменяет положение разделов в реестре. Или будет делать что-то еще при запуске файлов. ShellExecute предоставляет для этого интерфейс. Опять повторю - для работы с *.doc может использоваться совсем не офис. Так что не надо изобретать велосипед. >Но, подгружая ее как внешнюю функцию мы выделяем под нее память, разве >не так? А так как вызовы этой функции вероятны из нескольких точек >приложения, нам естественно очень захочется определить ее как >глобальную. Следовательно, память, которую она отожрет, она будет >держать весь сеанс работы. С другой стороны, если мы сделаем ее аналог в >качестве глобальной функции средствами РВ внутри приложения, то мы Про какую память вы говорите, я никак не пойму? Про загрузку shell32.dll? Так она загружается всегда, explorer ее активно использует. PB ее тоже использует, так что она даже уже будет спроецирована на адресное пространсво нашей программы. dll эта будет загружена одна на всех. Я не вижу никакой экономии. >экономим на памяти. Да ,экономия памяти не столь заметна на одной - двух >функциях, но вот когда их количество растет - это уже становится >критичным. Почему вы говорите "одной - двух функциях"? Менеджер памяти в Windows работает со страницами памяти а не с функциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 13:52 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
2 Локшин Марк: >А в следующей версии Windows/Office Microsoft поменяет положение >разделов в реестре. Или будет делать что-то еще при запуске файлов. >ShellExecute предоставляет для этого интерфейс. Опять повторю - для >работы с *.doc может использоваться совсем не офис. Так что не надо >изобретать велосипед. То, что для работы с *.doc может использоваться совсем не офис - не имеет значения, поскольку из реестра берется название приложения, ассоциированного с файлами типа *.doc, то есть то самое, которое открывается при двойном щелчке на файле. И что это будет, неважно. Что касается следующей версии Windows/Office (опять таки, Office тут ни при чем), то HKEY_CLASSES_ROOT - один из основных разделов реестра, который вряд ли будет изменен - слишком много придется переписывать софта. Кстати, функция ShellExecute также может отсутствовать в следующей версии Windows (останется, например, только CreateProcess как более гибкая). >Про какую память вы говорите, я никак не пойму? Про загрузку shell32.dll? >Так она загружается всегда, explorer ее активно использует. PB ее тоже >использует, так что она даже уже будет спроецирована на адресное >пространсво нашей программы. dll эта будет загружена одна на всех. Я не >вижу никакой экономии Про загрузку ВСЕЙ библиотеки из-за одной функции. Так что если есть возможность не использовать внешние функции, надо этой возможностью пользоваться. >Почему вы говорите "одной - двух функциях"? Менеджер памяти в Windows >работает со страницами памяти а не с функциями. А причем тут менеджер памяти и функции? Для подгрузки функций, а вернее, библиотеки, где они находятся, необходима память, а уж как ее распределяет менеджер памяти Windows - абсолютно не важно, хоть страницами, хоть целыми томами ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 14:06 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Если есть непреодолимое желание использовать run, то можно сделать следующее: Код: plaintext 1. 2.
Хотя, в итоге, всё равно вызовется ShellExecute, просто коммандный процессор сделает это за вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 14:08 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
2 Локшин Марк Полностью согласен с коллегой gerss . Вот что еще хочу добавить: РВ, при вызове внешней функции подгружает в свою область памяти всю dll содержащую эту функцию вне зависимости от того, использует эту dll кто то еще и загружена ли она уже кем то в память или нет. Единственное чего я не знаю, так это как РВ поступит если из одной dll вызывается несколько внешних функций. Загрузит он ее в одном экземпляре (что логично и во что хочется верить), или загрузит ее в стольких экземплярах сколько внешних функций из нее вызывается (абсурд, но не будем забывать про любовь Сайбейза к фичам;), мало ли...). 2 Winnie-the-Pooh Да, согласен, вполне логичный и простой выход. Но в этом случае мы не сможем самостоятельно обработать ситуацию, когда файл, который мы пытаемся открыть, не ассоциирован ни с каким приложением. Как поведет себя в этой ситуации ShellExecute я не знаю, по этому я бы это метод использовать не стал. Но это мое, личное мнение. --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 14:26 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
to Gerss & Ikar >То, что для работы с *.doc может использоваться совсем не офис - > не имеет значения, поскольку из реестра берется название >приложения, ассоциированного с файлами типа *.doc, то есть то самое, Да, что не только офис можно использовать - согласен. Но... Кнопку тоже можно прямо на окне рисовать. А можно не прямо, а как надо. А потом появляется WinXP и всякие там новомодные темы XP, manifest'ы... и кнопка ваша их уже не использует и выглядит не так, как все остальные кнопки. >Про загрузку ВСЕЙ библиотеки из-за одной функции. Так что если есть >возможность не использовать внешние функции, надо этой возможностью >пользоваться. Кто сказал что PB загружает всю библиотеку? Во-первых загружать библиотеки это дело LoadLibrary а не PB. Во вторых - всю библиотеку в память из-за вызова одной функции она никогда не загружает. to Ikar >Вот что еще хочу добавить: РВ, при вызове внешней функции подгружает >в свою область памяти всю dll содержащую эту функцию вне зависимости >от того, использует эту dll кто то еще и загружена ли она уже кем то >в память или нет. Кто вам это сказал? PB никаких dll сам не подгружает вообще (ну не его это забота). Это делает LoadLibrary. Всю dll эта функция не подгружает и не подгружает "в не зависимости от того". У меня сейчас не установлен необходимый инструмент для пряой проверки ваших утверждений, но у меня есть FILEMON c www.sysinternals.com (очень хорошая утилита по монитроингу работы с диском - советую). Так вот, по результатам его работы могу сказать - ребята, вас кто-то обманул. Ну ни сколько не загружает она отдельную копию всей dll. Это было бы даже заметно на глаз (как-никак shell32.dll имеет размер 9 МБ). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 15:02 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
2 Локшин Марк: >Кто вам это сказал? PB никаких dll сам не подгружает вообще (ну не его это >забота). Это делает LoadLibrary. Всю dll эта функция не подгружает и не >подгружает "в не зависимости от того". Что это все значит? LoadLibrary - это всего-навсего функция, вызываемая виртуальной машиной PB. Сама по себе функция вызваться не может, а приложения PB ее впрямую нигде не вызывают. И потом, именно ВСЯ библиотека подгружается, а потом ищется АДРЕС нужной функции. И вот еще что. Человек, организовавший тему уже давно получил ответ, поблагодарил и свалил отсюда. Так что мы просто ведем бесполезный спор. Предлагаю его закончить, поскольку никакой реальной пользы он не приносит и каждый ис спорщиков, судя по всему, будет делать так, как привык. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 16:21 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Поддерживаю коллегу gerss , тем более что считаю, что я не обладаю достаточными знаниями для продолжения спора. :) --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 16:31 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
>Что это все значит? LoadLibrary - это всего-навсего функция, вызываемая >виртуальной машиной PB. Сама по себе функция вызваться не может, а >приложения PB ее впрямую нигде не вызывают. И потом, именно ВСЯ >библиотека подгружается, а потом ищется АДРЕС нужной функции. Для того, чтобы найти адрес нужной функции нет необходимости загружать ВСЮ dll. Также как и для того, чтобы загрузить какой-то файл нет необходимости читать содержимое всего винчестера. Понимаете, механизм dll в windows устроен несколько сложнее и эффективно, чем вы его себе представляете. >И вот еще что. Человек, организовавший тему уже давно получил ответ, >поблагодарил и свалил отсюда. Так что мы просто ведем бесполезный спор. >Предлагаю его закончить, поскольку никакой реальной пользы он не >приносит и каждый ис спорщиков, судя по всему, будет делать так, как >привык. А я не про ShellExecute уже говорю, а про загрузку dll. Чисто теоретически PB может делать так как вы говорите, но вот практически - нет. По крайней мере фактов, подтверждающих то вы не приводите. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 17:01 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Спор сей абсолютно не бесполезен, и г-н Локшин абсолютно прав - лазить в registry вместо того чтобы использовать ShellExecute есть глупость, поскольку названия конкретных ключей в registry - OS version dependent, а ShellExecute - нет для всех Windows OS, в которых есть Shell :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2003, 19:36 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
Интересно, но ничего не понятно!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2003, 15:01 |
|
Run() возвращает -1
|
|||
---|---|---|---|
#18+
umalovНе работает команда Run("c:\ss.doc"). Возвращает -1. Вариант Run("start c:\ss.doc") то же не проходит. Если кто знает, подскажите где ошибка. Заранее благодарен. Windows 2000 Professional PB Enterprise 9.0.1. Build 6533 можно так Код: plaintext
У меня так вышло) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2009, 15:52 |
|
|
start [/forum/topic.php?fid=15&msg=32359792&tid=1336291]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 151ms |
0 / 0 |