PDA

Просмотр полной версии : Exe для запуска приложения



P1ece
01.07.2006, 23:12
Посмотрел примеры в MSDN


#include "ShellApi.h"
void ShellExecute(HWnd Wnd, const char * Operation, const char *FileName, const char *Parameters, const char *Directory, unsiged int ShowCmd);

ShellExecute(Handle, "open", "Calc", 0, 0, SW_RESTORE);

запускает кальк

прописываю вместо calc путь к проге для запуска... не пашет все равно. че я не так делаю?

BreakPointMAN
02.07.2006, 20:57
А как ты прописываешь путь? Не забываешь удваивать слэши?

BBB
03.07.2006, 10:27
Я вообще вторым параметром (т.е. вместо "open" в твоем прмере) пишу NULL.
В этом случае система использует "действие по умолчению".
Хотя, не думаю, что в данном случае это принципиально.

Absurd
03.07.2006, 12:10
А ShellExecute() принципиален? Может CreateProcess() сгодится?

Eugie
03.07.2006, 15:18
Наверняка с путями напутал

BBB
03.07.2006, 16:02
А ShellExecute() принципиален? Может CreateProcess() сгодится?По-моему, в параметрах вызова ShellExecute гораздо проще разобраться, чем в параметрах вызова CreateProcess :)
В ShellExecute вообще 4 из 6 параметров (кроме lpFile и nShowCmd) можно указать NULL и не париться :)

Eugie
03.07.2006, 16:11
Тогда уж WinExec() еще проще ;)

P1ece
03.07.2006, 22:31
блин я уже и NULL и так... и сяк... не знаю просто :(

Eugie
04.07.2006, 00:39
Код с путем приведи, так долго гадать будем.
ShellExecute что возвращает?

Absurd
04.07.2006, 09:02
А ShellExecute() принципиален? Может CreateProcess() сгодится?По-моему, в параметрах вызова ShellExecute гораздо проще разобраться, чем в параметрах вызова CreateProcess :)
В ShellExecute вообще 4 из 6 параметров (кроме lpFile и nShowCmd) можно указать NULL и не париться :)
Лично я бы давно уже перебрал альтернативные подходы (типа CreateProcess()) вместо того чтобы три дня сидеть на форуме.

P1ece
04.07.2006, 11:50
код с путем?
p:\p.bat - путь
тока сомневаюсь что лучше от этого станет

Absurd
04.07.2006, 16:00
У меня так работает:



WCHAR exepath[MAX_PATH];
::GetSystemDirectoryW(exepath, MAX_PATH);
::lstrcatW(exepath, L"\\cmd.exe");
WCHAR cmdline[MAX_PATH];
::lstrcpyW(cmdline, exepath);
::lstrcatW(cmdline, L" /c p:\\p.bat");
STARTUPINFOW si;
memset(&si, 0, sizeof(si));
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
::CreateProcessW(exepath, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

BBB
04.07.2006, 18:34
У меня так работает:
Ну, у меня и вот так работает :) /Win98, Win2k/

Текст программы, запускающей указанный как параметр командной строки файл (компилировал на Microsoft VC++ 6.0):



#include "Windows.H"

int WINAPI WinMain (
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
HINSTANCE iErr;
//------------------------------
iErr = ShellExecute (
NULL, // HWND hwnd,
NULL, // "open", // LPCTSTR lpOperation,
lpCmdLine, // LPCTSTR lpFile,
NULL, // LPCTSTR lpParameters,
NULL, // LPCTSTR lpDirectory,
SW_SHOWDEFAULT // INT nShowCmd
);
return (0);
};

Eugie
04.07.2006, 21:05
P1ece, так бы сразу и написал: не могу программно запустить bat-файл. Тут на форуме телепаты не водятся :)
Собственно, за меня уже ответили, но повторение - мать учения :) Вот такой код должен работать:


ShellExecute(Handle, 0, "cmd.exe", "/c p:\\p.bat", 0, SW_SHOWNORMAL);

Eugie
04.07.2006, 21:11
Да, вот еще что: если путь содержит длинные имена, нужно его заключать в кавычки, чтобы командный процессор смог его коррктно обработать. Т.е. например для пути c:\Program Files\p.bat четвертый параметр в ShellExecute() будет выглядеть так:


"/c \"c:\\Program Files\\p.bat\""

P1ece
04.07.2006, 23:04
P1ece, так бы сразу и написал: не могу программно запустить bat-файл. Тут на форуме телепаты не водятся :)
Собственно, за меня уже ответили, но повторение - мать учения :) Вот такой код должен работать:


ShellExecute(Handle, 0, "cmd.exe", "/c p:\\p.bat", 0, SW_SHOWNORMAL);

дык а подрубать ничего кроме windows.h не надо?

Eugie
05.07.2006, 14:44
Включи еще Shellapi.h и в настройках проекта подключи библиотеку импорта Shell32.lib

BBB
05.07.2006, 14:46
дык а подрубать ничего кроме windows.h не надо?А у тебя возникает ошибка компилятора? Или линкера?
Если ошибок компиляции/линковки нет, то встречный вопрос: зачем еще что-то "подрубать кроме windows.h"?

Eugie
05.07.2006, 15:00
ShellExecute() без Shellapi.h + Shell32.lib не скомпилируется и не слинкуется

BBB
06.07.2006, 10:00
ShellExecute() без Shellapi.h + Shell32.lib не скомпилируется и не слинкуется
Что касаемо исходного текста, то у меня компилируется (MS VC++ 6.0) без явного подключения Shellapi.h (см. исходник выше). Возможно, подключение Windows.H неявно подключает много всего, в т.ч. и Shellapi.h.
Посмотрел свойства проекта, Shell32.lib присутствует в списке (среди многого прочено), но, опять-таки, сам я вручную его туда не цеплял. Походу, при создании проекта VC сам прописывает туда весь набор стандартных lib-ов.

Eugie
06.07.2006, 16:18
А у меня в MSVC++ 6.0 без явного подключения Shellapi.h не компилируется. И даже знаю, почему :) - в stdafx.h определен макрос WIN32_LEAN_AND_MEAN, который режет все лишнее (в смысле, редко используемое) из windows.h
Хотя Shell32.lib, действительно, включен в список библиотек по умолчанию.

P1ece
06.07.2006, 22:41
стдафх на всяк случай подрубил... скомпилировал... все ок.

флеха не хочет его стартовать по прежнему :(

BBB
07.07.2006, 10:03
А у меня в MSVC++ 6.0 без явного подключения Shellapi.h не компилируется. И даже знаю, почему :) - в stdafx.h определен макрос WIN32_LEAN_AND_MEAN, который режет все лишнее (в смысле, редко используемое) из windows.h
"stdafx.h" у меня как раз не подцеплен. А что, у тебя MFC-приложение? :) Насколько я понимаю, при создании MFC-приложения визард генерит и цепляет "stdafx.h".
Еще раз: ВЕСЬ ("от и до") исходный текст я приводил выше :) Там есть #include <windows.h>, но нет ни "stdafx.h", ни "Shellapi.h".

BBB
07.07.2006, 10:08
стдафх на всяк случай подрубил... скомпилировал... все ок.
флеха не хочет его стартовать по прежнему :(
В конце концов, ShellExecute - функция, т.е. возвращает результат.
Проанализируй возвращаемое значение, это может помочь понять, в чем у тебя проблема.

ShellExecute
.....................
Return Values
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Microsoft® Windows® applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an integer and compare it with the value 32 or one of the error codes below:
0 - The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND - The specified file was not found.
ERROR_PATH_NOT_FOUND - The specified path was not found.
ERROR_BAD_FORMAT - The .exe file is invalid (non-Win32® .exe or error in .exe image).
SE_ERR_ACCESSDENIED - The operating system denied access to the specified file.
SE_ERR_ASSOCINCOMPLETE - The file name association is incomplete or invalid.
SE_ERR_DDEBUSY - The DDE transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL - The DDE transaction failed.
SE_ERR_DDETIMEOUT - The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND - The specified dynamic-link library was not found.
SE_ERR_FNF - The specified file was not found.
SE_ERR_NOASSOC - There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.
SE_ERR_OOM - There was not enough memory to complete the operation.
SE_ERR_PNF - The specified path was not found.
SE_ERR_SHARE - A sharing violation occurred.

Absurd
07.07.2006, 10:48
Сейчас он спросит, как ему проанализировать значение - ошибки то не в строчном виде возвращаются.

Eugie
07.07.2006, 15:30
BBB, stdafx.h и stdafx.cpp к MFC отношения не имеют. Они нужны, если задана опция Use precompiled headers (студия задает ее по умолчанию для генерируемых мастером проектов).
P1ece, действительно, проверь под отладчиком, что возвращает ShellExecute(). Это на самом деле целое число, в случае ошибки <= 32. Потом найди файл Shellapi.h и посмотри описание ошибки. См.также http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

P1ece
07.07.2006, 23:01
оно все прекрасно компилируется и даже работает... проблема в том что с флехи exe то не стартует... как ни странно с СДРОМ все ок... видать я что то отрубил в настройках эксплорера

Absurd
10.07.2006, 13:07
оно все прекрасно компилируется и даже работает... проблема в том что с флехи exe то не стартует... как ни странно с СДРОМ все ок... видать я что то отрубил в настройках эксплорера
Ты про autorun?
Он по моему зависит от NoDriveTypeAutorun


[HKEY_CURRENT_USER\Software\Microsoft\Windows\Curr entVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=dword:00000091

Это флаговое слово - для каждого типа дисков там отдельный бит. На win9x я обычно отрубал авторан для всех дисков - записывал туда 0.
Сейчас не отрубаю - стало либо лениво либо Сидиромы стали быстрые либо чего-то с этой настройкой не так - не помню уже.

BBB
10.07.2006, 15:34
оно все прекрасно компилируется и даже работает... проблема в том что с флехи exe то не стартует... как ни странно с СДРОМ все ок... видать я что то отрубил в настройках эксплорера
Ты про autorun?
Он по моему зависит от NoDriveTypeAutorun
.........
Это флаговое слово - для каждого типа дисков там отдельный бит. На win9x я обычно отрубал авторан для всех дисков - записывал туда 0.
Сейчас не отрубаю - стало либо лениво либо Сидиромы стали быстрые либо чего-то с этой настройкой не так - не помню уже.
Я помню, что в Win98 (может, это и не свойство Win98, но наблюдал на этой операционке) у меня autorun запускался даже, когда я делал subst подкаталога.
Т.е., например, в каталоке C:\MYDIR лежит файл autorun.inf
И я выполняю, например:
subst E: C:\MYDIR
Так вот тот самый C:\MYDIR\autorun.inf при этом выполнялся.

А вот сейчас на Win2k (на другом компе) попробовал - фиг, не запускается.

Повторюсь: может, это зависит и не от Win98 или Win2k, а от каких-то там настроек, но я просто факты рассказал.

Eugie
11.07.2006, 16:18
Если проблема действительно связана с AutoRun, то см. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/programmersguide/shell_basics/shell_basics_extending/autorun/autoplay_reg.asp

Дык, все же какое значение возвращает ShellExecute(), когда пытаешься запускать с флешки?

P1ece
13.07.2006, 22:27
дык сабст под нтями не работает через cmd.
с прогой все в порядке. не работает сам авторан форточный

Eugie
14.07.2006, 16:06
Ну, не знаю, чем еще тебе помочь.
Насчет subst под NT ты не прав, работает.