![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ShellAPI. ShellExecute, не уверен что срабатывает. [WinXP]
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 ?