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;


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

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


UrbanRider   (2007-02-10 14:49:00) [1]

благодарю вас всех, с этим всем разобрался...

чувствую скоро проблемы с UNICODE<>ANSI будут :)


GrayFace   (2007-02-10 08:14:00) [2]

UrbanRider   (09.02.07 15:05) [25]
2GrayFace: AppDir:=ExtractFilePath(Application.ExeName); //это разве не строка где  я задаю в переменной папку своего приложения?

Я о параметре lpDirectory у ShellExecute.

UrbanRider   (10.02.07 1:16) [38]
А потому и нет, что не нужны. Напиши
Win32Check(RenameFile(oldName, newName));
или
if not RenameFile(oldName, newName) then  RaiseLastOSError;


UrbanRider   (2007-02-10 01:16:00) [3]

нет напрямую l2endec Через ShellExecute не работает.

я немного кода добавил.

теперь создаю бат файл, который запускает l2endec.exe, хотя он тоже тупо сначала работал...

попозже попробую адреса править этой функцией, мож тогда Через ShellExecute заработает.


function sfn(const LongName: String): String;
var i :Integer;
begin
 SetLength(Result,Length(LongName));
 i := GetShortPathName(pChar(LongName),pChar(Result),Length(Result));
 if  i > Length(Result)  then begin
   SetLength(Result,i);
   i := GetShortPathName(pChar(LongName),pChar(Result),Length(Result));
 end;
 SetLength(Result,i);
end;


У меня еще вопрос. Из-за него не хочу новую тему поднимать...

вот код для переименовывания файла:

procedure TForm1.BPreToTxtClick(Sender: TObject);
var
  oldName, newName : string;
begin
  oldName := sfn(AppDir)+'dec-'+EFName2;
  newName := sfn(FName2);
  if RenameFile(oldName, newName)
  then ShowMessage(oldName+' renamed OK')
  else ShowMessage(oldName+' rename failed with error : '+ IntToStr(GetLastError));


GetLastError в сообщении дает код ошибки 3... в дурацкой помощи Borland® Developer Studio 2005 есть всякой дребедятины, а кодов ошибок че-то нет :(


Германн   (2007-02-10 00:52:00) [4]

2 UrbanRider   (09.02.07 22:54) [36]
Как тебя понимать, Саид?
То ты пишешь
> UrbanRider   (09.02.07 21:20) [35]
>
> вот кстати как у меня получилось:
>
> ShellExecute(Handle,'open',PChar('"'+AppDir+'l2endec.exe"'),
> Pchar(Edit1.Text), NIL, SW_SHOWNORMAL);

То
> UrbanRider   (09.02.07 22:54) [36]
> Ладно ребят я решил проблемы подругому...
>
> получаю параметры и пишу бат файл, после чего запускаю его
> и все...

Так что же всё-таки получилось, а что нет?
Через ShellExecute всё должно нормально работать.


UrbanRider   (2007-02-09 22:54:00) [5]

Ладно ребят я решил проблемы подругому...

получаю параметры и пишу бат файл, после чего запускаю его и все...

обратно кодирую также...

хотелось конечно все культурнее сделать, однако придется так...

хотя юзеру какая разница как, лишь работало нормально, нетакли?


UrbanRider   (2007-02-09 21:20:00) [6]

вот кстати как у меня получилось:

ShellExecute(Handle,'open',PChar('"'+AppDir+'l2endec.exe"'),Pchar(Edit1.Text), NIL, SW_SHOWNORMAL);


UrbanRider   (2007-02-09 21:13:00) [7]

блин всеравно не работает... бю :(

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


Германн   (2007-02-09 16:01:00) [8]

PChar() забыл :(
ShellExecute(Handle,'open',PChar('"путь'+'имя файла"'),Pchar(Edit1.Text), NIL, SW_SHOWNORMAL);


UrbanRider   (2007-02-09 15:51:00) [9]

при таком раскладе запускается вроде нормально, l2endec запускается, а работу не делает :(


Германн   (2007-02-09 15:50:00) [10]

Типа так
ShellExecute(Handle,'open',' "путь'+'имя файла"',Pchar(Edit1.Text), NIL, SW_SHOWNORMAL);


UrbanRider   (2007-02-09 15:50:00) [11]

вот как сделал я:

Edit1.Text :='-l "'+FName2+'"';

WinExec(PChar('"'+ExtractFilePath(Application.ExeName)+'l2endec.exe" '+Edit1.Text), SW_ShowNormal);


UrbanRider   (2007-02-09 15:36:00) [12]

Герман когда я все беру в "кавычки" двойные мой делфи 9 начинает ругатся и не дает компилировать проект... может я не так делаю?

покажи как реализовать это на примере проекта...

у меня ведь путь к файлу строится из нескольких частей.

1 переменная путь
2 имя файла


Германн   (2007-02-09 15:33:00) [13]

Лучше добавить путь к l2endec.exe, и взять всё в кавычки.


UrbanRider   (2007-02-09 15:26:00) [14]

ах да, я вот задумался о путях...

если пользователь установит программу далеко от корня диска, и будут встречаться русские символы в именах папок будет ли ошибка?

Если да то нужно преобразовать путь в короткий, типа D:\Progra~1\...

как этого добится?


UrbanRider   (2007-02-09 15:13:00) [15]

FName2:=AppDir+''+EFName2; - имя с путем как видно, а вот в коде 2 я действительно к l2endec задаю имя без пути и скорее всего в этом ошибка...

спасибо за мысль Герман.

Встречный вопрос: что лучше сделать папку приложения текущей(как?) или просто в вызов стороннего приложения, добавить путь к  l2endec.exe?


UrbanRider   (2007-02-09 15:05:00) [16]

2GrayFace: AppDir:=ExtractFilePath(Application.ExeName); //это разве не строка где  я задаю в переменной папку своего приложения?


GrayFace   (2007-02-09 01:45:00) [17]

И папку для программы ты не задаешь.

Вместо 'open' обычно лучше указывать nil. 'open' - не всегда действие по умолчанию.


Германн   (2007-02-09 01:19:00) [18]


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


Читать ответы думая при этом головой. Тебе же уже сказали всё

> clickmaker ©   (08.02.07 15:23) [16]
>
> > почему после исполнения Кода №1, Код №2 некорректно работает?
>
> может потому что OpenDialog меняет текущую папку, в коде
> №2 только имя без пути?


UrbanRider   (2007-02-09 01:07:00) [19]

2ASoft: копируется я слежу за этим в папке он появляется... с переменными все ок, я выводил их в Showmessage

2TRUNK: l2endec лежит в папке с моим приложением, сюда же и копируется *.dat файл


TRUNK   (2007-02-08 19:48:00) [20]


> после выбора файла в диалоговом окне он копируется в папку
> с приложением

С каким приложением ? Твоим или l2endec.exe ?


Страницы:   1 2

Наверх

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