Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2009, 12:44   #1
Kos123
Пользователь
 
Регистрация: 29.09.2009
Сообщений: 12
По умолчанию после добавления ярлыка программа не работает

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

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

...
Код:
var
{автозагрузка}
Folder : array[0..255] of Char; // путь к StartUp
List : PItemIDList; // список специальных папок
dir : string; // путь к папке проги

...
implementation

uses Unit2, Unit3, Unit4, Unit5;

{$R *.dfm}

// СОЗДАНИЕ ЯРЛЫКА
procedure CreateLink(const PathObj, PathLink, Desc, Param : string);
var
IObject : IUnknown;
SLink : IShellLink;
PFile : IPersistFile;
begin
IObject := CreateComObject(CLSID_ShellLink);
SLink := IObject as IShellLink;
PFile := IObject as IPersistFile;
with SLink do
begin
SetArguments(PChar(Param));
SetDescription(PChar(Desc));
SetPath(PChar(PathObj));
end;
PFile.Save(PWChar(WideString(PathLi nk)), false);
end;

...
procedure TGlavForm.FormCreate(Sender: TObject);
begin
{вернуть путь к папке проги}
dir := ExtractFilePath(ParamStr(0));
end;

...
procedure TGlavForm.Windows1Click(Sender: TObject);
begin
// АВТОЗАПУСК
{установить}
if Windows1.Checked = true then
begin
{создать ярлык}
CreateLink(dir + '\K_05.exe', dir + 'Quick Start.lnk', '', '');
{найти папку StartUp}
SHGetSpecialFolderLocation(0, CSIDL_STARTUP, List);
FillChar(Folder, SizeOf(Folder), 0);
SHGetPathFromIDList(List, @Folder);
{перейти в директорию StartUp}
ChDir(Folder);
{копировать файл}
CopyFile(PChar(ExtractFilePath(Para mStr(0)) + 'Quick Start.lnk'), 'Quick Start.lnk', true);
ShowMessage('Программа добавлена в автозагрузку !');
{удалить ярлык из папки проги}
DeleteFile(ExtractFilePath(ParamStr (0)) + 'Quick Start.lnk');
end
else
{удалить}
begin
{найти папку StartUp}
SHGetSpecialFolderLocation(0, CSIDL_STARTUP, List);
FillChar(Folder, SizeOf(Folder), 0);
SHGetPathFromIDList(List, @Folder);
{перейти в папку StartUp}
ChDir(Folder);
{удалить файл}
DeleteFile('Quick Start.lnk');
ShowMessage('Программа удалена из автозагрузки !');
end;
end;
Изображения
Тип файла: bmp 2009-09-29_123926.bmp (331.4 Кб, 186 просмотров)

Последний раз редактировалось Stilet; 29.09.2009 в 13:16.
Kos123 вне форума Ответить с цитированием
Старый 29.09.2009, 12:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в программе используете относительные пути значит.
используйте абсолютные.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.09.2009, 13:15   #3
Kos123
Пользователь
 
Регистрация: 29.09.2009
Сообщений: 12
По умолчанию

Абсолютные немогу - программа для разных пользователей на разных машинах (некоторые пользователи видят комп впервые) и многие пути должны меняться в зависимости от адреса машины.
Kos123 вне форума Ответить с цитированием
Старый 29.09.2009, 13:19   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
SetArguments(PChar(Param));
Вот поставь брекпоинт на эту строчку, и проверь чему равны передаваемые в нее и ниже функции параметры.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2009, 13:19   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

абсолютные это значит твердо зафиксированные относительно положения проги.
например
Код:
ExtractFilePath(Application.ExeName)+'File.txt;
укажет на файл File.txt рядом с ексешником проги.
так стоит делать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.09.2009, 13:47   #6
Kos123
Пользователь
 
Регистрация: 29.09.2009
Сообщений: 12
По умолчанию

извините но в Delphi у меня стаж всего 3 мес. если можно подробнее для "особо одаренных" (я должен указать в txt файле все пути которые использую или привязать пути к екзешнику?)
Kos123 вне форума Ответить с цитированием
Старый 29.09.2009, 13:52   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я понимаю что все файлы необходимые проге находятся около нее?
я вижу у вас этому файлу путь указан такой Data/dblino.cds
а стоит писать ExtractFilePath(Application.ExeName )+'Data/dblino.cds'
тогда такой траблы не будет...будет искать файл в папке рядом с самим exe а не где то там.
еще вариант это добавить
Код:
SetCurrentDir(ExtractFilePath(Application.ExeName))
в начале работы проги
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.09.2009, 13:54   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Kos123
Для начала в режиме отладки посмотри что в переменных athObj, PathLink, Desc, Param находится, когда программа туда доходит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2009, 18:34   #9
Kos123
Пользователь
 
Регистрация: 29.09.2009
Сообщений: 12
По умолчанию

В режиме отладки:

PathObj := путь к папке программы + экзешник
PathLink := путь к папке программы + 'Quck Start.lnk' - ярлык
Desc - ничего не показывает
Param := '' - пусто
Kos123 вне форума Ответить с цитированием
Старый 30.09.2009, 12:10   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
PathObj := путь к папке программы + экзешник
Мдя... Весьмя информативно.
В общем ты однозначно пути неверные установил, ибо такое:
Код:
var
IObject : IUnknown;
SLink : IShellLink;
PFile : IPersistFile;
begin
IObject := CreateComObject(CLSID_ShellLink);
SLink := IObject as IShellLink;
PFile := IObject as IPersistFile;
with SLink do
begin
SetArguments('');
SetDescription('Ага');
SetPath('c:\temp');
end;
PFile.Save(PWChar(WideString('c:\temp\qq.lnk')), false);
end;
Работает нормально.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
после автозагрузки программа не работает Kos123 Свободное общение 3 29.09.2009 13:52
virtualbox: не работает сеть на компе после использования этой проги bill_gates Софт 0 05.07.2009 13:03
После переустановки винды не работает звук. Meldo Компьютерное железо 12 20.06.2009 10:35
Обновление набора данных после добавления в таблицу записей "внешней" программой dimmm БД в Delphi 5 21.04.2009 00:56
После копирования в другую директорию программа не работает Terikon Общие вопросы Delphi 8 31.03.2009 00:19