Автор |
Сообщение |
AlexRock Гуру |
|
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
|
|
%systemroot%\program_files
или просто
%programfiles%
системрут - корень системного диска |
|
|
|
|
AlexRock Гуру |
|
not_available писал(а): |
%systemroot%\program_files
или просто
%programfiles%
системрут - корень системного диска |
Уточняю - это надо писать в параметре функции вызова приложения? Я имею ввиду не скрипты установочников, а код С++. |
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
AlexRock
естественно, это системные переменные. инсталляторы тут вообще не к месту. |
|
|
|
|
AlexRock Гуру |
|
Что-то не пашут эти вещи. Пишу так
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
|
|
А ф-ии 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
|
|
|
|
|
|
AlexRock Гуру |
|
Vlad писал(а): |
Почему первый пар-тр ф-ии NULL |
Потому что в книжке было написано, что "чтобы запуск 16 разрядных ДОС приложений в среде Виндоуз не вызывал ошибки времени исполнения, следует взять за правило передавать имя файла не через параметр lpApplicationName, а через параметр командной строки (т. е. всегда так передавать). Я ещё попробую через lpApplicationName.
Vlad писал(а): |
А ф-ии API вроде GetCurrentDirectory |
В текущей директории моя оболочка и так находится, так что мне она не нужна. Мне надо запускать приложения, которые находятся по иерархии выше или вообще в других папках, и при этом не зарегистрированы в системе (т. е. их нельзя запустить, просто указал экзешник). |
|
|
|
|
Vlad Гуру Предупреждений : 4
|
|
Цитата: |
не зарегистрированы в системе |
те если по русски,вне переменной Path |
|
|
|
|
AlexRock Гуру |
|
AlexRock писал(а): |
Цитата:не зарегистрированы в системе
те если по русски,вне переменной Path |
Ну, я не знаю, что это за переменная. (Я, вообще, много чего не знаю. ) |
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|