Консультация № 161235
24.02.2009, 01:05
0.00 руб.
0 8 2
Здравствуйте.
Я пытаюсь запустить программу следующим образом

ShellExecute(0, nil, @CopyName {AnsiString}, nil, nil, SW_Show);

Строка выполняется и возвращает результат "2". Программа при этом не запускается. Подскажите пожалуйста, что нужно исправить.

Обсуждение

давно
Мастер-Эксперт
425
4118
24.02.2009, 09:41
общий
Хукаленко Дмитрий
А вот это вот Вы зачем написали:
@CopyName {AnsiString}

???
Разве нельзя просто имя запускаемой программы написать?
2 означает ERROR_FILE_NOT_FOUND. Надеюсь переводить не нужно? Как у Вас с английским?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
24.02.2009, 09:47
общий
Дополню - если уж у Вас переменная типа String, в которой у Вас хранится имя программы - то её нужно просто преобразовать в тип PChar:

var
Prog: String;
begin
Prog := 'calc.exe';
ShellExecute(0, nil, PChar(Prog), nil, nil, sw_show);
end;
Неизвестный
24.02.2009, 14:25
общий
это ответ
Здравствуйте, Хукаленко Дмитрий!

Результат "2" означает ERROR_FILE_NOT_FOUND - файл не найден.
Попробуйте так: ShellExecute(0, nil, PAnsiChar(CopyName) {AnsiString}, nil, nil, SW_Show);
Неизвестный
24.02.2009, 21:54
общий
При PAnsiChar(CopyName) - пишет Incompatible types: 'AnsiChar' and 'Char'
PWideChar(CopyName) - Suspicious typecast of AnsiString to PWideChar
PChar(CopyName) - Suspicious typecast of AnsiString to PWideChar
CopyName - Incompatible types: 'AnsiString' and 'PWideChar'
В ShellExecute на этом месте требуется PWideChar. Пользуюсь Delphi 2009.
На момент выполнения ShellExecute файл CopyName существует и благополучно запускается из проводника.
Неизвестный
25.02.2009, 10:22
общий
Ну так Дельфи вам уже все подсказала, вот и сделайте CopyName : WideString или другую переменную такого типа например WCopyName, а потом

var WCopyName : WideString;

WCopyName := CopyName;
ShellExecute(0, nil, PWideChar(WCopyName), nil, nil, SW_Show);

P.S. И не забывайте, что если файл не в каталогах из переменной окружения Path, то надо указывать полный путь, иначе получите тот же ERROR_FILE_NOT_FOUND.
Неизвестный
25.02.2009, 10:31
общий
Если уж Вы работаете в Delphi 2009, то для чего объявили CopyName типа AnsiString?....

Есть 2 варианта решения:

Использование ANSI-версиии функции ShellExecute
ShellExecuteA(0, nil, PAnsiChar(CopyName), nil, nil, SW_Show);

или преобразование типов:
ShellExecute(0, nil, PChar(WideString(CopyName)), nil, nil, SW_Show);
Неизвестный
25.02.2009, 10:33
общий
это ответ
Здравствуйте, Хукаленко Дмитрий!

Есть 2 варианта решения:

Использование ANSI-версиии функции ShellExecute
ShellExecuteA(0, nil, PAnsiChar(CopyName), nil, nil, SW_Show);

или преобразование типов:
ShellExecute(0, nil, PChar(WideString(CopyName)), nil, nil, SW_Show);
Неизвестный
25.02.2009, 20:55
общий
Спасибо большое. Теперь всё работает.
Форма ответа