Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ShellAPI. ShellExecute, не уверен что срабатывает. [WinXP]


Страницы:   1 2

UrbanRider ©   (2007-02-08 01:07:00) 

Доброго времени суток.
У меня стоит Delphi 2005 aka Delphi 9.

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

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

Но, как говорится, должен, но не делает.

Делаю я так:


procedure TForm1.BDecryptClick(Sender: TObject);
Var
Param: Pchar;
begin
Param:=Pchar(Edit1.Text);  //в Edit1 лежат параметры для предачи в l2endec, присваиваем их переменной Param
ShellExecute(Handle,'open','l2endec.exe', Param, NIL, SW_SHOWNORMAL);//запуск приложения l2endec
end;


скажите что может быть не так?

Если несовсем понятно что к чему, я дам полный текст программы.


ASoft   (2007-02-08 18:59:00) [21]

Файл действительно копируется при CopyFile()?
Проверь пошагово, какие значения принимают все переменные до Edit1.text:=


UrbanRider   (2007-02-08 17:30:00) [22]

Вот вся система проекта:

проект предназначается для расшифровки *.dat файла игры LineAge2

вот как это должно происходить
на форме 2 кнопке и спрятанный Edit(Visible:=False),
при нажатии на 1ю кнопку открывается диалог открытия файла, после выбора файла в диалоговом окне он копируется в папку с приложением,
и в Edit1 записываются параметры расшифровки, которые передаются позднее в l2endec.

procedure TForm1.BOpenFileClick(Sender: TObject);
begin
OpenDialog1.Execute;
AppDir:=ExtractFilePath(Application.ExeName);//переменным задается нужный вид
FName:=OpenDialog1.FileName;
EFName2:=ExtractFileName(OpenDialog1.FileName);
FName2:=AppDir+''+EFName2;
Edit1.Text:='';
Edit1.Text :='-l '+EFName2;//задается строка параметров
CopyFile(Pchar(FName),Pchar(FName2),false);//копируется файл в папку с программой
end;


при нажатии на 2ю кнопку(Декодировать) вызывается консольное приложение l2endec.exe -l <filename>

procedure TForm1.BDecryptClick(Sender: TObject);
begin
WinExec(PChar('l2endec.exe '+Edit1.Text), SW_ShowNormal);
end;


для откладки я сейчас поставил Edit1.Visible:=True;

система вся в том что после нажатия на 1ю кнопку, действия 1й кнопки выполняются на УРА. Однако если нажать на 2ю кнопку, то l2endec.exe работает неверно, хотя параметры в Edit1 сформированы верно.

Еслиже действия 1й кнопки сделать самостоятельно, а потом нажать 2ю кнопку, то все действия 2й кнопки выполняются на ура(l2endec.exe запускается с теми же параметрами, однако появляется результат ее действия, т.е. появляется декодированный файл, чего не происходит в 1м случае)

что делать?


ASoft   (2007-02-08 15:45:00) [23]


> UrbanRider   (08.02.07 15:25) [17]

Как я понял, в Edit1 у тебя параметры, а в sellexecute запуск консольной чужой проги с параметрами Edit1..
Проверь, имеются ли пути с пробелами или русскими символами, заключи в двойные кавычки, если что.. Ну, я вообще-то не знаю цели выполнения l2endec.exe, но что-то мне подсказывает, что CreateProcess подошел лучше в твоем случае..


UrbanRider   (2007-02-08 15:25:00) [24]

Мастера, неужели я как-то не так задаю вопрос?
вы скажите что именно вам не ясно в данной ситуации, я попытаюсь ее описать лучше.

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


clickmaker   (2007-02-08 15:23:00) [25]


> почему после исполнения Кода №1, Код №2 некорректно работает?

может потому что OpenDialog меняет текущую папку, в коде №2 только имя без пути?


UrbanRider   (2007-02-08 15:16:00) [26]

можно и убрать роли не играет вообще, просто я туда раньше дописывал поддиректорию... это не существенно...


sergeyst   (2007-02-08 14:24:00) [27]


> UrbanRider   (08.02.07 14:12) [13]


> FName2:=AppDir+''+EFName2;

А зачем тут '' ?


UrbanRider   (2007-02-08 14:12:00) [28]

с CreateProcess не удалось разобраться параметров куча, не смог написать строку нормально, чтоб Delphi ее скомпилировал.


> Ну так и работай с WinExec

Объясню еще раз:

Это код №1:

procedure TForm1.BOpenFileClick(Sender: TObject);
begin
OpenDialog1.Execute;
AppDir:=ExtractFilePath(Application.ExeName);//переменным задается нужный вид
FName:=OpenDialog1.FileName;
EFName2:=ExtractFileName(OpenDialog1.FileName);
FName2:=AppDir+''+EFName2;
Edit1.Text:='';
Edit1.Text :='-l '+EFName2;//задается строка параметров
CopyFile(Pchar(FName),Pchar(FName2),false);//копируется файл в папку с программой
end;


Он обрабатывает выбранный в OpenDialog1 файл и копирует его в папку с программой и задает параметры для запуска стороннего приложения в зависимости от имени выбранного файла.(заносит их в Edit1)

Это Код №2:

procedure TForm1.BDecryptClick(Sender: TObject);
begin
WinExec(PChar('l2endec.exe '+Edit1.Text), SW_ShowNormal);
end;


Этот код запускает стороннюю программу с параметрами, содержащимися в Edit1, но есть один нюанс:

Код №2 не корректно работает, если был запущен Код №1.

И для нормальной работы приходиться Код №1 выполнять в ручную(копировать файл в папку с приложением, вручную писать параметры в Edit1).

Если все сделать руками, то Код №2 запускается и работает как надо.

Но для меня это неприемлемо, не буду же я пользователя заставлять руками копировать файл в папку программы и писать параметры запуска декодировщика.

Вопрос на данный момент: почему после исполнения Кода №1, Код №2 некорректно работает?


Elen   (2007-02-08 13:49:00) [29]


> то все работает

Ну так и работай с WinExec . кстати кроме open в Shellexecute можно еще и explore попробовать. Ну и CreateProcess, имхо :)


UrbanRider   (2007-02-08 13:47:00) [30]

2TRUNKщас и твой вариант попробую.


UrbanRider   (2007-02-08 13:46:00) [31]

тоже самое: если не вызывать обработку где копируются файлы, задаются переменные, а вписать параметры в Edit вручную, а потом запустить
WinExec(PChar('l2endec.exe '+Edit1.Text), SW_ShowNormal);
то все работает, а если делать так как нужно, то вроде консольное окно сторонней программы открывается, однако результат не появляется.

Проблема остается открытой....


TRUNK   (2007-02-08 13:25:00) [32]


> Elen ©   (08.02.07 13:15) [7]
> А что WinExec не устраивает?

This function is provided for compatibility with earlier versions of Windows. For Win32-based applications, use the CreateProcess function.


UrbanRider   (2007-02-08 13:19:00) [33]

Щас погляжу... я даже не знал о ее существовании.


Elen   (2007-02-08 13:15:00) [34]


> UrbanRider  

А что WinExec не устраивает?


UrbanRider   (2007-02-08 13:12:00) [35]

Ребят, не помогло :(

вот полностью код программы(уже немного модифицирован):


unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, XPMan, StdCtrls, AeroGlass, shellapi;

type
 TForm1 = class(TForm)
   BOpenFile: TButton;
   BDecrypt: TButton;
   BToTXT: TButton;
   BEncrypt: TButton;
   XPManifest1: TXPManifest;
   OpenDialog1: TOpenDialog;
   BEdit: TButton;
   Edit1: TEdit;
   procedure BToTXTClick(Sender: TObject);
   procedure BDecryptClick(Sender: TObject);
   procedure BOpenFileClick(Sender: TObject);
 private
   { Private declarations }
 public
   FName: string; //сделал переменные общедоступными
   AppDir: String;
   FName2: String;
   EFName2: String;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BOpenFileClick(Sender: TObject);
begin
OpenDialog1.Execute;
AppDir:=ExtractFilePath(Application.ExeName);//переменным задается нужный вид
FName:=OpenDialog1.FileName;
EFName2:=ExtractFileName(OpenDialog1.FileName);
FName2:=AppDir+''+EFName2;
Edit1.Text:='';
Edit1.Text :='-l '+EFName2;//задается строка параметров
CopyFile(Pchar(FName),Pchar(FName2),false);//копируется файл в папку с программой
end;

procedure TForm1.BDecryptClick(Sender: TObject);
begin
ShellExecute(Handle,'open','l2endec.exe',Pchar(Edit1.Text), NIL, SW_SHOWNORMAL);//ну собственно вызов сторонней программы.
end;
end.


Суть не в том, что что-то неправильно я подставил в ShellExecute, так как если
не вызывать TForm1.BOpenFileClick, а написать параметры вручную в Edit1 и запустить TForm1.BDecryptClick, то все работает.

Такое чувство, что после копирования файла ShellExecute колбасить начинает.

Может после функции копирования файла что-то нужно дописать(высвободить память например?)


TRUNK   (2007-02-08 11:43:00) [36]

Попробуй так:

procedure TForm1.BDecryptClick(Sender: TObject);
begin
ShellExecute(Handle,'open','l2endec.exe', Pchar(Edit1.Text), NIL, SW_SHOWNORMAL);//запуск приложения l2endec
end;

или на крайний случай так:

procedure TForm1.BDecryptClick(Sender: TObject);
var
Param: PChar;
begin
GetMem(Param,Length(Edit1.Text)+1); // под строку PChar надосначала выделить память
StrCopy(Param,PChar(Edit1.Text)) ;
ShellExecute(Handle,'open','l2endec.exe', Param, NIL, SW_SHOWNORMAL);//запуск приложения l2endec
FreeMem(Param);
end;


umbra   (2007-02-08 11:33:00) [37]

приводите строку к PChar прямо в вызове ShellExecute, а не раньше.

var
 params: string;
{..............}
ShellExecute(Handle,'open','l2endec.exe',PChar(params), NIL, SW_SHOWNORMAL);


UrbanRider   (2007-02-08 01:39:00) [38]

нашел еще одну странную вещь:

после выполнения этого кода(код1):
procedure TForm1.BOpenFileClick(Sender: TObject);
var
AppDir: Pchar;
FName: Pchar;
FName2: Pchar;
EFName2: Pchar;
begin
OpenDialog1.Execute;
AppDir:=Pchar(ExtractFilePath(Application.ExeName));
FName:=Pchar(OpenDialog1.FileName);
EFName2:=Pchar(ExtractFileName(OpenDialog1.FileName));
FName2:=Pchar(AppDir+''+EFName2);
Edit1.Text:='';
Edit1.Text :='-l'+' '+EFName2;
if FileExists(FName) then
if CopyFile(FName,FName2,true) then
 ShowMessage('Файл успешно скопирован и готов к дальнейшей обработке!')
end;


даже ранее рабочий код(2):
ShellExecute(Handle,'open','l2endec.exe','-l systemmsg-e.dat', NIL, SW_SHOWNORMAL);
НЕ РАБОТАЕТ.

странно очень, но если скопировать файл в папку программы самостоятельно и пропустить (КОД1), то (КОД2) выполняется нормально, в чем беда?


UrbanRider   (2007-02-08 01:17:00) [39]

и еще, если вместо ShellExecute(Handle,'open','l2endec.exe', Param, NIL, SW_SHOWNORMAL);
написать ShellExecute(Handle,'open','l2endec.exe', '-l systemmsg-e.dat', NIL, SW_SHOWNORMAL);
то все начинает работать, однако второй параметр(systemmsg-e.dat) динамический и поэтому такая работа меня не устраивает.


UrbanRider   (2007-02-08 01:11:00) [40]

Ах да чуть не забыл, если параметров не передавать, то я вижу как открывается и быстро закрывается окно l2endec, т.к. нет параметров для дальнейшей работы(l2endec-консольное приложение).

А когда параметры передаю, то я не наблюдаю никаких действий.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо