Консультация онлайн # 161235

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Хукаленко Дмитрий
Дата: 24.02.2009, 01:05 Консультация неактивна
Поступило ответов: 2
Здравствуйте.
Я пытаюсь запустить программу следующим образом

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

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

Ответ # 1, Качурин Влвдимир Константинови (Посетитель)

Здравствуйте, Хукаленко Дмитрий!

Результат "2" означает ERROR_FILE_NOT_FOUND - файл не найден.
Попробуйте так: ShellExecute(0, nil, PAnsiChar(CopyName) {AnsiString}, nil, nil, SW_Show);

Качурин Влвдимир Константинови

Посетитель
24.02.2009, 14:25
Нет оценки ответа

Ответ # 2, Лукьяненко Алексей Валериевич (Посетитель)

Здравствуйте, Хукаленко Дмитрий!

Есть 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
Нет оценки ответа

Мини-форум консультации # 161235

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

177576

= общий =    24.02.2009, 09:41
Хукаленко Дмитрий
А вот это вот Вы зачем написали:

@CopyName {AnsiString}


???
Разве нельзя просто имя запускаемой программы написать?
2 означает ERROR_FILE_NOT_FOUND. Надеюсь переводить не нужно? Как у Вас с английским?
=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Лукьяненко Алексей Валериевич

177578

= общий =    24.02.2009, 09:47
Дополню - если уж у Вас переменная типа String, в которой у Вас хранится имя программы - то её нужно просто преобразовать в тип PChar:

var
Prog: String;
begin
Prog := 'calc.exe';
ShellExecute(0, nil, PChar(Prog), nil, nil, sw_show);
end;
неизвестный

177684

= общий =    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 существует и благополучно запускается из проводника.
PGM

177747

= общий =    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.
Лукьяненко Алексей Валериевич

177748

= общий =    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);
неизвестный

177830

= общий =    25.02.2009, 20:55
Спасибо большое. Теперь всё работает.
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.