powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Run() возвращает -1
25 сообщений из 25, страница 1 из 1
Run() возвращает -1
    #32347393
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не работает команда Run("c:\ss.doc").
Возвращает -1.
Вариант Run("start c:\ss.doc") то же не проходит.

Если кто знает, подскажите где ошибка.

Заранее благодарен.


Windows 2000 Professional
PB Enterprise 9.0.1. Build 6533
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347406
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
Ну вообще Run запускает на выполнение какую то программу (exe и т.п.), но не как не doc.
Попробуй поработать через ole...
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347460
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Файлы с зарегистрированными в Windows расширениями запускать надо через ShellExecute(Ex). Библиотеку для работы с данной функцией можно взять у меня на сайте lokshinmark.narod.ru/download.htm
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347491
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В глобальных внешних фунциях определяем

Код: plaintext
1.
2.
3.
4.
5.
//для запуска файлов по имени
FUNCTION long ShellExecuteA( &
    long hwnd, String lpOperation, String lpFile, &
    String lpParameters, String lpDirectory, long nShowCmd) &
LIBRARY  "shell32.dll" 


Создаем функцию для запуска файла, возможно с параметрами командной
строки :

Код: 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.
public subroutine uf_runfile (string as_file, string as_param);Long ll_ret
String ls_null
SetNull(ls_null)
long hWnd   // Handle to control
// Get the handle to a PowerBuilder window.
hWnd = Handle(this.of_GetFrame())
ll_ret = ShellExecuteA(hWnd, ls_null, &
     as_file, as_param, ls_null,  1 )
//Обработка ошибок ( сообщение )	  
Constant Long SE_ERR_FNF          =     2        // file not found
Constant Long SE_ERR_PNF          =     3        // path not found
Constant Long SE_ERR_BAD_FORMAT =  11 
Constant Long SE_ERR_ACCESSDENIED =     5        // access denied
Constant Long SE_ERR_OOM          =     8        // out of memory
Constant Long SE_ERR_DLLNOTFOUND  =             32 
Constant Long SE_ERR_SHARE        =             26 
Constant Long SE_ERR_ASSOCINCOMPLETE =          27 
Constant Long SE_ERR_DDETIMEOUT      =          28 
Constant Long SE_ERR_DDEFAIL         =          29 
Constant Long SE_ERR_DDEBUSY         =          30 
Constant Long SE_ERR_NOASSOC         =          31 

if ll_ret<= 32  then
	String ls_err
	ls_err = 'Код ошибки - ' + String(ll_ret)
	Choose Case ll_ret
		Case SE_ERR_FNF  
			ls_err='The specified file was not found.'
		Case SE_ERR_PNF  
			ls_err='The specified path was not found.'
		Case SE_ERR_BAD_FORMAT
			ls_err='The .exe file is invalid (non-Win32® .exe or error in .exe image).'
		Case SE_ERR_ACCESSDENIED  
			ls_err='The operating system denied access to the specified	file.'
		Case SE_ERR_ASSOCINCOMPLETE  
			ls_err='The file name association is incomplete or invalid.'
		Case SE_ERR_DDEBUSY  
			ls_err='The DDE transaction could not be completed because other DDE transactions were being processed.'
		Case SE_ERR_DDEFAIL  
			ls_err='The DDE transaction failed.'
		Case SE_ERR_DDETIMEOUT  
			ls_err='The DDE transaction could not be completed because the	request timed out.'
		Case SE_ERR_DLLNOTFOUND  
			ls_err='The specified dynamic-link library was not found.'
		Case SE_ERR_FNF  
			ls_err='The specified file was not found.'
		Case SE_ERR_NOASSOC  
			ls_err='There is no application associated with the given file name extension.'
		Case SE_ERR_OOM  
			ls_err='There was not enough memory to complete the operation.'
		Case SE_ERR_PNF  
			ls_err='The specified path was not found.'
		Case SE_ERR_SHARE  
			ls_err='A sharing violation occurred.'
	End Choose
 MessageBox('Ошибка запуска файла с помощью ShellExecuteA',String(ls_err)+'~n Задан файл:' +String(as_file))	  	
end if

end subroutine


Где надо , ее используем

Код: plaintext
1.
uf_RunFile(ls_file,ls_args)
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347502
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того, чтобы открыть с помощью команды run(<string>) оффисный документ, картинку, текстовый документ или иной файл, ассоциированый в ОС с каким либо приложением, нужно формировать строку запуска из имени приложения с полным путем и имени файла с полным путем. Так в Вашем случае вам нужно делать вызов примерно так:
Код: plaintext
1.
2.
3.
Run (  "C:\Program Files\Microsoft Office\Office\WINWORD.EXE"  +  " "  +  "c:\ss.doc"  )

// я выделил пробел через суммирование строки специально, для примера. ;)


Точно так же, с полным путем лучше и приложения запускать, т.к. нет гарантии, что запускаемое Вами из кода приложение имеет прописанные в ОС пути у конечного пользователя. Так же велика вероятность, что пути у пользователя могут не совпадать со стандартными, по этому их лучше либо выносить в настройку, либо динамически подгружать из реестра.
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347506
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обрати внимание, что эта функция работает асинхронно, могут возникнуть проблемы. Если необходимо, то ищи тему про асинхронность в этом форуме.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347512
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Локшин Марк & Вовик

ИМХО, не стОит дергать внешние функции если можно обойтись собственными силами... Тем более что, на сколько я понял, человеку нужно дергать офисные документы (*.doc, *.xls, и т.п.). Вполне можно двумя-тремя "заглядываниями" в реестр дернуть оттудова пути к офису и выполнять через Run()...
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347571
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Сделал как посоветовал Ikar - получилось.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347588
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Ikar
Нужно использовать именно ShellExecute(Ex). Эта функция предназначена именно для этих целей и "собственными" силами здесь не обойтись. Кто вам сказал что *.doc ассоциирован именно с офисом? Например сразу после установки Windows он связан с WordPad'ом. Так что нужно использовать те функции, которые предлагает для это использовать производитель ОС, тем более, что PB это позволяет сделать.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347688
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Локшин Марк
Нет, Марк, Позвольте с Вами не согласиться! По сути, что делает функция ShellExecute(Ex) ? Она делает абсолютно тоже самое, что я и описал - лезет в реестр, ищет по расширению файла с каким приложением он асоциирован, формирует строку команды на выполнение и запускает ее. Но, подгружая ее как внешнюю функцию мы выделяем под нее память, разве не так? А так как вызовы этой функции вероятны из нескольких точек приложения, нам естественно очень захочется определить ее как глобальную. Следовательно, память, которую она отожрет, она будет держать весь сеанс работы. С другой стороны, если мы сделаем ее аналог в качестве глобальной функции средствами РВ внутри приложения, то мы экономим на памяти. Да ,экономия памяти не столь заметна на одной - двух функциях, но вот когда их количество растет - это уже становится критичным.

В своей работе я тоже однажды столкнулся с подобной проблемой. И тоже решил пойти путем внешних функций. Но, слава Биллу, более опытные коллеги объяснили что к чему и направили "в правильное русло".

К сожалению я не могу привести здесь тот код, который выполняет эту задачу (он является частью корпоративного продукта), но могу, если хотите, подсказать в каких ветках реестра копать...
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347762
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, было бы интересно.
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Extensions - здесь?
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347799
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 umalov
Нет, [HKEY_CLASSES_ROOT\...] - описания расширений файлов и ассоциированных приложений...

---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347812
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку поясню на примере для *.doc:
Раздел [HKEY_CLASSES_ROOT\.doc] в параметре по умолчанию содержит имя подраздела ассоциированного приложения - Word.Document.8

А раздел [HKEY_CLASSES_ROOT\Word.Document.8\shell\Open\command] в параметре по умолчаинию содержит путь к приложению, с которым ассоциирован файл...
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347813
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Ikar

>Нет, Марк, Позвольте с Вами не согласиться! По сути, что делает функция
>ShellExecute(Ex)? Она делает абсолютно тоже самое, что я и описал - лезет в
>реестр, ищет по расширению файла с каким приложением он асоциирован,
>формирует строку команды на выполнение и запускает ее.
А в следующей версии Windows/Office Microsoft поменяет положение разделов в реестре. Или будет делать что-то еще при запуске файлов. ShellExecute предоставляет для этого интерфейс. Опять повторю - для работы с *.doc может использоваться совсем не офис. Так что не надо изобретать велосипед.

>Но, подгружая ее как внешнюю функцию мы выделяем под нее память, разве
>не так? А так как вызовы этой функции вероятны из нескольких точек
>приложения, нам естественно очень захочется определить ее как
>глобальную. Следовательно, память, которую она отожрет, она будет
>держать весь сеанс работы. С другой стороны, если мы сделаем ее аналог в
>качестве глобальной функции средствами РВ внутри приложения, то мы
Про какую память вы говорите, я никак не пойму? Про загрузку shell32.dll? Так она загружается всегда, explorer ее активно использует. PB ее тоже использует, так что она даже уже будет спроецирована на адресное пространсво нашей программы. dll эта будет загружена одна на всех. Я не вижу никакой экономии.

>экономим на памяти. Да ,экономия памяти не столь заметна на одной - двух
>функциях, но вот когда их количество растет - это уже становится
>критичным.
Почему вы говорите "одной - двух функциях"? Менеджер памяти в Windows работает со страницами памяти а не с функциями.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347838
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Локшин Марк:
>А в следующей версии Windows/Office Microsoft поменяет положение
>разделов в реестре. Или будет делать что-то еще при запуске файлов.
>ShellExecute предоставляет для этого интерфейс. Опять повторю - для
>работы с *.doc может использоваться совсем не офис. Так что не надо
>изобретать велосипед.
То, что для работы с *.doc может использоваться совсем не офис - не имеет значения, поскольку из реестра берется название приложения, ассоциированного с файлами типа *.doc, то есть то самое, которое открывается при двойном щелчке на файле. И что это будет, неважно.
Что касается следующей версии Windows/Office (опять таки, Office тут ни при чем), то HKEY_CLASSES_ROOT - один из основных разделов реестра, который вряд ли будет изменен - слишком много придется переписывать софта. Кстати, функция ShellExecute также может отсутствовать в следующей версии Windows (останется, например, только CreateProcess как более гибкая).

>Про какую память вы говорите, я никак не пойму? Про загрузку shell32.dll?
>Так она загружается всегда, explorer ее активно использует. PB ее тоже
>использует, так что она даже уже будет спроецирована на адресное
>пространсво нашей программы. dll эта будет загружена одна на всех. Я не
>вижу никакой экономии
Про загрузку ВСЕЙ библиотеки из-за одной функции. Так что если есть возможность не использовать внешние функции, надо этой возможностью пользоваться.

>Почему вы говорите "одной - двух функциях"? Менеджер памяти в Windows
>работает со страницами памяти а не с функциями.
А причем тут менеджер памяти и функции? Для подгрузки функций, а вернее, библиотеки, где они находятся, необходима память, а уж как ее распределяет менеджер памяти Windows - абсолютно не важно, хоть страницами, хоть целыми томами ;)
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347841
Winnie-the-Pooh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть непреодолимое желание использовать run, то можно сделать следующее:
Код: plaintext
1.
2.
string ls_2run
ls_2run =  "cmd /c start c:\top_secret\most_secret_data.doc" 
run (ls_2run)

Хотя, в итоге, всё равно вызовется ShellExecute, просто коммандный процессор сделает это за вас.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347883
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Локшин Марк
Полностью согласен с коллегой gerss .

Вот что еще хочу добавить: РВ, при вызове внешней функции подгружает в свою область памяти всю dll содержащую эту функцию вне зависимости от того, использует эту dll кто то еще и загружена ли она уже кем то в память или нет.

Единственное чего я не знаю, так это как РВ поступит если из одной dll вызывается несколько внешних функций. Загрузит он ее в одном экземпляре (что логично и во что хочется верить), или загрузит ее в стольких экземплярах сколько внешних функций из нее вызывается (абсурд, но не будем забывать про любовь Сайбейза к фичам;), мало ли...).

2 Winnie-the-Pooh
Да, согласен, вполне логичный и простой выход. Но в этом случае мы не сможем самостоятельно обработать ситуацию, когда файл, который мы пытаемся открыть, не ассоциирован ни с каким приложением. Как поведет себя в этой ситуации ShellExecute я не знаю, по этому я бы это метод использовать не стал. Но это мое, личное мнение.

---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32347972
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 МБ).
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32348139
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Локшин Марк:
>Кто вам это сказал? PB никаких dll сам не подгружает вообще (ну не его это
>забота). Это делает LoadLibrary. Всю dll эта функция не подгружает и не
>подгружает "в не зависимости от того".

Что это все значит? LoadLibrary - это всего-навсего функция, вызываемая виртуальной машиной PB. Сама по себе функция вызваться не может, а приложения PB ее впрямую нигде не вызывают. И потом, именно ВСЯ библиотека подгружается, а потом ищется АДРЕС нужной функции.

И вот еще что. Человек, организовавший тему уже давно получил ответ, поблагодарил и свалил отсюда. Так что мы просто ведем бесполезный спор. Предлагаю его закончить, поскольку никакой реальной пользы он не приносит и каждый ис спорщиков, судя по всему, будет делать так, как привык.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32348157
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поддерживаю коллегу gerss , тем более что считаю, что я не обладаю достаточными знаниями для продолжения спора. :)
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32348203
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Что это все значит? LoadLibrary - это всего-навсего функция, вызываемая
>виртуальной машиной PB. Сама по себе функция вызваться не может, а
>приложения PB ее впрямую нигде не вызывают. И потом, именно ВСЯ
>библиотека подгружается, а потом ищется АДРЕС нужной функции.
Для того, чтобы найти адрес нужной функции нет необходимости загружать ВСЮ dll. Также как и для того, чтобы загрузить какой-то файл нет необходимости читать содержимое всего винчестера. Понимаете, механизм dll в windows устроен несколько сложнее и эффективно, чем вы его себе представляете.

>И вот еще что. Человек, организовавший тему уже давно получил ответ,
>поблагодарил и свалил отсюда. Так что мы просто ведем бесполезный спор.
>Предлагаю его закончить, поскольку никакой реальной пользы он не
>приносит и каждый ис спорщиков, судя по всему, будет делать так, как
>привык.
А я не про ShellExecute уже говорю, а про загрузку dll. Чисто теоретически PB может делать так как вы говорите, но вот практически - нет. По крайней мере фактов, подтверждающих то вы не приводите.
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32348403
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спор сей абсолютно не бесполезен, и г-н Локшин абсолютно прав - лазить в registry вместо того чтобы использовать ShellExecute есть глупость, поскольку названия конкретных ключей в registry - OS version dependent, а ShellExecute - нет для всех Windows OS, в которых есть Shell :-)
...
Рейтинг: 0 / 0
Run() возвращает -1
    #32359792
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, но ничего не понятно!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Run() возвращает -1
    #35969777
Andreas_84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umalovНе работает команда Run("c:\ss.doc").
Возвращает -1.
Вариант Run("start c:\ss.doc") то же не проходит.

Если кто знает, подскажите где ошибка.

Заранее благодарен.


Windows 2000 Professional
PB Enterprise 9.0.1. Build 6533

можно так
Код: plaintext
Run("explorer c:\ss.doc") 

У меня так вышло)
...
Рейтинг: 0 / 0
Run() возвращает -1
    #35970470
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andreas_84У меня так вышло)
Йоу, тут итак полфорума злые ходят, а вы еще и 6-летнюю тему подняли.
Ховайся кто может :-)

Что касается вашего варианта - я бы так никогда не делал. Объяснять почему - лень.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Run() возвращает -1
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]