Вроде бы простая задача...

Раздел форума: 

Аватар пользователя admin

Автор темы: 

mike
Парни, вот такая задача: приложение (есть исходники) имеет кроме экзешника в том же дире ещё и сопутствующие файлы -- БД, ини и ещё кое-что, поэтому в автозагрузку копипастят с рабстола линк на экзешник. Предложите наиболее простой способ, как сделать так, чтобы приложение чувствовало, откуда оно запущено: из автозагрузки или вручную. Торможу; когда-то делал, но склероз. Решение со стартовыми пускачами, пожалуйста, не предлагайте, это тривиально, но не проходит; нужно, чтобы именно приложение чувствовало.
 

Страницы

Аватар пользователя Savely
>Решение со стартовыми пускачами

Who is Mr. Putin? Чтобы не предлагать, надо хоть понять, что такое "стартовые пускачи". :))

Аватар пользователя mike
Приложение.
Аватар пользователя Savely
т.е. ты имешь в виду прогу, запускающую из себя нужную?
Аватар пользователя mike
Да
Аватар пользователя Макс Курмаз
Я так понял, что рабочий каталог для приложения в ярлыке тоже прописан, и по полному пути к экзешнику определить не получается.

А в окружении ничего подходящего нет? или может ярлычок как-то подправить (хоть бы тупо ключик добавить)?

Аватар пользователя mike
>может ярлычок как-то подправить (хоть бы тупо ключик добавить)?

Ну в Линуксе это несложно (ярлычок "desktop configuration file" имеет атрибуты с произвольным содержанием), а как в Виндовс?

Аватар пользователя Savely
Я, видимо, туплю, но хоть убей не понимаю, чем запуск ярлыка с рабстола отличается от запуска этого же ярлыка из автозагрузки...
Аватар пользователя dol
2 mike (old student)

В Виндовс тоже можно добавить ключ запуска в ярлык в поле Target после пути к программе

Как я понимаю, тебе нужно знать, где расположена папка в которой находится БД. Эсли пишеш на .Net то используй Application.StartupPath...

Аватар пользователя mike
>хоть убей не понимаю, чем запуск ярлыка с рабстола отличается от запуска этого же ярлыка из автозагрузки...

В том-то и проблема, что ничем, если ярлык копипастирован. :( Однако, помнится, я его правил, но склероз, блин...

>папка в которой находится БД...

Путь к БД (которая может переключаться приложением, ODBC или BDE не исплоьзуются) прописывается в ини-файле, который находится в том же дире, что и экзешник. Конечно, предвижу советы заюзать "регини" или писать инифайл всегда в системный дир. Но это не выход, т.к. требование: инифайл д.б. вместе с экзешником, чтобы при смене железа не терялся.

Аватар пользователя dol
2 mike (old student)

Пиши в ICQ 480919100, помогу

Аватар пользователя dol
2 mike

На C# это выглядит так:

string fileName = Path.Combine(Application.StartupPath,"fileName.ini");

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

Аватар пользователя mike
Конечно, функция Application.StartupPath - возвращает строковую переменную, которая представляет собой путь к диру приложения от корня ОС; ну и что? При запуске через ярлык с рабстола или через такой же ярлык из дира автозагрузки, мы получим одно и то же. :(
Аватар пользователя Макс Курмаз
Грубо говоря, нам нужно узнать, в какой папке лежит ярлык, который запустил наш экзешник. (а как узнать папку запуска программы, так об этом и первокурсники знают). Отсюда вопрос: можем ли мы узнать, кто запустил наш экзешник (не процесс и не поток, а именно исполнимый файл). Узнав полный путь, мы и определим то, что нужно по условию задачи.

Поскольку я в ОСах не силен (когда учился, был только DOS), то сходу ответить не смогу. Мне кажется, что единственное, где может храниться эта информация, это environment приложения. Или может где-то есть список последних запущенных программ? Тогда искомый ярлык будет предпоследним в списке.

Аватар пользователя Слава
А параметр передать нельзя?

типа один ярлык "app.exe -1" а другой "app.exe -2"

Аватар пользователя mike
>ярлык "app.exe -1"

Как передавать параметры при запуске экзешника знают все студенты, но то через экзешник, а не ярлык, который имеет расширение не .exe, а .lnk. Вот, например, что содержит файл ярлыка IAR Embedded Workbench.lnk:

LFO :+0/E:\01IARIR:1common$cmmon01binbnL2IarIdePm.exe0IrIde

Pm.exeE:\IAR

Кто-нибудь знает, можно ли его редактировать и как редактировать?

Аватар пользователя mike
Как создавать ярлыки программными средствами я знаю, но всё равно туплю, как решить задачу. Возможно, надо, чтобы прога при первом запуске находила свои ярлыки, созданные вручную, и более тонко заменяла их, но как?
Аватар пользователя Слава
Вот описание lnk формата:

http://www.stdlib.com/art6-Shortcut-File-Format-lnk.html

Аватар пользователя Al
Если это рассчитано на честных людей, т.е. не как средство защиты, то можно в ярлыке прописывать запуск программы с каким-либо строковым параметром-флагом, который свистит - "я пускаюсь с ярлыка" (/link например). Программе при запуске видно это ну и далее как надо. А если прога запускается иным любым другим способом - значит без параметра и без ярлыка. Я в этом случае выдаю юзерам прогу с готовым ярлыком, но при этом жестко оговариваю расположение программы на диске С и требования в способу запуска. Можно даже при запуске не с моего ярлыка говорить - "программа запущена неправильно!" ))
Аватар пользователя Savely
И все равно я туплю... В чем проблема-то? Не задача, а именно проблема? При запуске из автозагрузки прога не находит INI-файл/БД или что? Или юзер не должен иметь возможности запускать прогу из автозагрузки?
Аватар пользователя mike
2Savely. Мда, нередко приходится объяснять, почему вопрос. :( Отвечаю. Поведение софта, запущенного из автозагрузки и запущенного вручную, должно отличаться. Софтина, запущенная из автозагрузки, должна пополнить БД, выполнить кой-какие расчёты и всё, не показываясь на экране, если оборудование исправно и режимы в норме. Она же, запущенная вручную, никуда не прячется и позволяет работать с ней, как заблагорассудится, скажем, печатать отчёты.

2Слава. Спасибо за ссылку; думаю, как воспользоваться. Огорчает, что XP не изменяет в ярлыке время последнего доступа, оставляя его нулевым. Решение могло бы быть красивым: определять по содержимому этого поля, какой ярлык сработал. Или в XP нужно что-то настроить? :(

Аватар пользователя dol
Этот код позволит тебе создавать ярлыки на десктопе и автозапуске:

using IWshRuntimeLibrary;

...

static class CreateShortcuts

{

public static bool CreateShortCut(string PathToApp, string ProdName)

{

try

{

//Ярлык на десктоп

object shortAdr = (object)"Desktop";

WshShell shell = new WshShell();

string link = ((string)shell.SpecialFolders.Item(ref shortAdr)) + ProdName + ".lnk";

IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(link);

shortcut.Description = ProdName;

shortcut.TargetPath = PathToApp + ProdName + ".exe";

shortcut.WorkingDirectory = PathToApp;

shortcut.Save();

//Ярлык в авторан

string x = System.Environment.GetFolderPath(Environment.SpecialFolder.Startup);

shortcut = (IWshShortcut)shell.CreateShortcut(x + ProdName + ".lnk");

shortcut.Description = ProdName;

shortcut.TargetPath = PathToApp + @"\Launcher" + ProdName + ".exe";

shortcut.WorkingDirectory = PathToApp;

shortcut.Save();

return true;

}

catch

{

return false;

}

}

}

Аватар пользователя mike
>Этот код позволит тебе...

Я уже писал, что создавать ярлыки из программы для меня не проблема. Речь не о том, а об определении сработавшего ярлыка, да ещё к тому же сделанного ручками.

Но всё равно пасиб за участие.

Аватар пользователя mike
Всё, решено. Особая благодарность Славе за ссылку на lnk-формат. Далее просто: в ярлык в поле аргументов пишем идентификатор; в проге заюзываем GetCommandLine(void), возвращающую путь к экзешнику+идентификатор, если он есть, и прога понимает, откуда запущена.

Всем спасибо! Парни, заметьте, что ни один X даже не пытался тут себя проявить. :)

Аватар пользователя Макс Курмаз
Если я правильно понял, задача свелась опять же к банальному приписыванию ключика к имени экзешника? Ну тогда неинтересно.
Аватар пользователя dol
Думаю перед запуском программы нужно всё таки сканировать папки Автозапуск и Десктоп. Проверять ярлыки, и эсли они не соответствуют тому что надо, заменять их, а юзеру предлагать выбор, что делать дальше. Просто не исключается вариант что в автозапуск попадёт ярлык с ненужным ключем, и наоборот... А про ключ в ярлыках я писал ещё в начале...:)
Аватар пользователя mike
>задача свелась опять же к банальному приписыванию ключика...

Всё банально, если знаешь, КУДА. :)

2dol. ОК, учту.

Аватар пользователя Savely
+1 Максу. Я так и не понял, в чем была проблема, если она решалась ключом в командной строке...
Аватар пользователя Savely
Майк, ты не знал половины ответа на вопрос (каковая нужна для адекватного ответа)...

Ну, и, ессно, не смог сформулировать задачу потенциальному исполнителю... Я честно хотел помочь, но без вменяемого ТЗ - это обычно не выходит.

Народ в общем "гадал" - ну, и угадал для тебя направление поиска...

Аватар пользователя mike
>...ты не знал половины ответа на вопрос... не смог сформулировать задачу... я честно хотел помочь... народ ..."гадал"...

Я, разумеется, засранец, а Макс Д'Артаньян, но реально помог мне Слава; совет dol'я я уже учёл, засим прошу пардону, если задел чьи-то амбиции.

Аватар пользователя Макс Курмаз
По-моему, про ключик мы говорили в самом начале. И если проблема была всего лишь правке .lnk-файла... А ведь можно было придумать и более интересное решение.

И к тому же у пользователей с разными учетными записями будут разные папки autorun и desktop, что тоже придется учитывать при правке ярлыков.

Страницы