adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Использование функций вызова приложений
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
AlexRock
Гуру
СообщениеДобавлено: Пн 17-03-08 : 22-46    Заголовок сообщения: Использование функций вызова приложений Ответить с цитатой

ShellExecute и CreateProcess.
В этих функциях есть параметр, отвечающий за имя приложения или путь к его экзешнику. Можно ли использовать в этом параметре псевдонимы системных папок (если они есть)?
Например, я хочу запускать из своей оболочки несколько программ. Поэтому буду писать пути типа:

C:\Programm Files\App1
C:\Programm Files\App2
C:\Programm Files\App3

Но я не знаю, на каком диске у пользователся стоит система, хотя точно знаю, что все три App лежат в Programm Files в соответствующих папках App. Так вот, есть ли псевдонимы для системных папок? Ну, скажем, можно ли написать так

<Programm Files>\App1,
где <Programm Files> содержит в себе путь от корня диска до Programm Files? Ну, и вообще список таких псевдонимов нужен.

Если совсем конкретно, то задача такая. Структура расположения приложений и оболочки, из которой они пускаются, такая (буду юзать гипотетические псевдонимы, ибо буква диска не известна):

<Programm Files>\App1\App1.exe
<Programm Files>\App2\App2.exe
<Programm Files>\App3\App3.exe
<Programm Files>\Shell\Shell.exe

Хочу запускать программы App из Shell функцией CreateProcess. Как прописать в ней путь к экзешникам App (хотя бы начиная не с корня диска, а с папки Programm Files)? Положить все экзешники в одну папку нельзя (так надо). Положить Shell выше App

<Programm Files>\Shell\App1\App1.exe
<Programm Files>\Shell\App2\App2.exe
<Programm Files>\Shell\App3\App3.exe
<Programm Files>\Shell\Shell.exe

тоже нельзя.

Т. е. проблема в том, что я не могу полные пути писать к запускаемым приложениям, когда не на своей машине (с неизвестной структурой дисков) работаю. Вот и подумал, что псевдонимы (как в программах по созданию установочников) могут помочь.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
not_available
Эксперт
Предупреждений : 1
СообщениеДобавлено: Пн 17-03-08 : 23-15    Заголовок сообщения: Ответить с цитатой

%systemroot%\program_files
или просто
%programfiles%

системрут - корень системного диска
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 18-03-08 : 03-00    Заголовок сообщения: Ответить с цитатой

not_available писал(а):
%systemroot%\program_files

или просто

%programfiles%



системрут - корень системного диска

Уточняю - это надо писать в параметре функции вызова приложения? Я имею ввиду не скрипты установочников, а код С++.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
not_available
Эксперт
Предупреждений : 1
СообщениеДобавлено: Вт 18-03-08 : 11-12    Заголовок сообщения: Ответить с цитатой

AlexRock
естественно, это системные переменные. инсталляторы тут вообще не к месту.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 18-03-08 : 13-47    Заголовок сообщения: Ответить с цитатой

Что-то не пашут эти вещи. Пишу так

void __fastcall TForm1::Button3Click(TObject *Sender)
{
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
memset(&pinfo, 0, sizeof(pinfo));
memset(&sinfo, 0, sizeof(sinfo));
sinfo.cb = sizeof(sinfo);

CreateProcess(NULL, "%programfiles%\\App\\App.exe", // причём здесь пробовал и %program_files% - не работает
NULL, NULL, false, 0, NULL, NULL, &sinfo, &pinfo);
}

Понимает только так

CreateProcess(NULL, "App\\App.exe",
NULL, NULL, false, 0, NULL, NULL, &sinfo, &pinfo);

Причём моя запускающая программа Shell.exe должна находится либо в той же папке, что и папка App, либо выше (тогда путь в параметре должен быть полнее).
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Vlad
Гуру
Предупреждений : 4
СообщениеДобавлено: Вт 18-03-08 : 13-57    Заголовок сообщения: Ответить с цитатой

А ф-ии API вроде GetCurrentDirectory или GetWindowsDirectory на что? Но не важно.. Почему первый пар-тр ф-ии NULL? смотрим прототип:
Цитата:
BOOL WINAPI CreateProcess(
__in LPCTSTR lpApplicationName,
__in_out LPTSTR lpCommandLine,
__in LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in LPVOID lpEnvironment,
__in LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);

lpApplicationName
The name of the module to be executed. This module can be a Windows-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer.

The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. If the file name does not contain an extension, .exe is assumed. Therefore, if the file name extension is .com, this parameter must include the .com extension.

The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space-delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order:


c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe
If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module as well as its arguments.

To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the name of the batch file.

Однако если там NULL,тогда
Цитата:
If lpApplicationName is NULL, the first white-space – delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin (see the explanation for the lpApplicationName parameter). If the file name does not contain an extension, .exe is appended. Therefore, if the file name extension is .com, this parameter must include the .com extension. If the file name ends in a period (.) with no extension, or if the file name contains a path, .exe is not appended. If the file name does not contain a directory path, the system searches for the executable file in the following sequence:

The directory from which the application loaded.
The current directory for the parent process.
The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory.
Windows Me/98/95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory.
The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System.
The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
The directories that are listed in the PATH environment variable. Note that this function does not search the per-application path specified by the App Paths registry key. To include this per-application path in the search sequence, use the ShellExecute function.
The system adds a null character to the command line string to separate the file name from the arguments. This divides the original string into two strings for internal processing
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Вт 18-03-08 : 18-58    Заголовок сообщения: Ответить с цитатой

Vlad писал(а):
Почему первый пар-тр ф-ии NULL

Потому что в книжке было написано, что "чтобы запуск 16 разрядных ДОС приложений в среде Виндоуз не вызывал ошибки времени исполнения, следует взять за правило передавать имя файла не через параметр lpApplicationName, а через параметр командной строки (т. е. всегда так передавать). Я ещё попробую через lpApplicationName.
Vlad писал(а):
А ф-ии API вроде GetCurrentDirectory

В текущей директории моя оболочка и так находится, так что мне она не нужна. Мне надо запускать приложения, которые находятся по иерархии выше или вообще в других папках, и при этом не зарегистрированы в системе (т. е. их нельзя запустить, просто указал экзешник).
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Vlad
Гуру
Предупреждений : 4
СообщениеДобавлено: Вт 18-03-08 : 19-29    Заголовок сообщения: Ответить с цитатой

Цитата:
не зарегистрированы в системе

те если по русски,вне переменной Path
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Ср 19-03-08 : 01-26    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
Цитата:не зарегистрированы в системе


те если по русски,вне переменной Path

Ну, я не знаю, что это за переменная. (Я, вообще, много чего не знаю. Sad )
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
Страница 1 из 1

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы