Я так понимаю красивое решение задачи - это получить адрес вызвавшего приложение ярлыка средствами WINAPI. Что-то вроде ExtractFilePath(Application->ExeName) но для ярлыка.
Думалось, что поле "время последнего доступа" отражает факт запуска, и имеется простое решение задачи без параметра в командной строке. Поэтому и понадобился формат lnk. В реестре есть фичка [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem]
"NtfsDisableLastAccessUpdate"=dword:1; если отключить, то поле "время последнего доступа" в ярлыке будет меняться или нет?
Если для ярлыка оставить пустым поле "Рабочая папка", то из прогарммы можно получить текущий каталог с помощью WinAPI функции GetCurrentDirectory, а это и будет имено тот каталог, где лежит ярлык :)
> При запуске через ярлык с рабстола или через такой же ярлык из дира автозагрузки, мы получим одно и то же. :(
Специально проверил, GetCurrentDirectory возвращает разные значения.
> Поведение софта, запущенного из автозагрузки и запущенного вручную, должно отличаться...
Для автозапуска программы можно обойтись и без помещения ярлыка в Startup folder, если прописать путь к exe-шнику в реестре в
Еще вариант определения контекста запуска проги - по имени родительского процесса.
Теория: если прога запускается ярлыком с рабочего стола или из автозагрузки, то родительских процесс - explorer.exe, если из Total Commander, то totalcmd.exe, если из консоли, то cmd.exe.
Идея состоит в том, чтобы в автозагрузку запихнуть ярлык на батник, который запускает прогу. Тогда из автозагрузки прога запустится из процесса cmd.exe, а по ярлыку на раб. столе - из процесса explorer.exe. Остается проверить имя родительского процесса после старта проги.
Пример батника:
cd "C:\Users\Narthex\Documents\Visual Studio 2008\Projects\temp++\Debug\"
temp++.exe
Пример кода (определяет лишь PID, для имен требуется модификация, но идея и без этого ясна):
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <WinNT.h>
int main(int argc, char *argv[])
{
int pid = -1;
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Проблемма в том, что ПК подключен к доменной сети, он загружаєтся под локальнім админом, которій не может війти в домен, программа должна віполнятся под другим юзером, для того чтобі иметь доступ к сетевім ресурсам... Я решил задачу используя Launcher. Но можно ли всё это делать без использования стороннего ехе??
Когда то я пробовал этот метод, но в диспетчере задач имя юзера не менялось... Сейчас попробовал создать файл, и он действительно пренадлежит юзеру, под которым я логинюсь. Вот линк на проект который я нашел:
Страницы
Для всех юзеров можно разместить ярлыкb в папку С:\Doc&Settings\Default User\Desktop и С:\Doc&Settings\Default User\Start menu\Programs\Startup
Are you sure? Насчет "в принципе"?
Без ключа не никак.
"NtfsDisableLastAccessUpdate"=dword:1; если отключить, то поле "время последнего доступа" в ярлыке будет меняться или нет?
Если для ярлыка оставить пустым поле "Рабочая папка", то из прогарммы можно получить текущий каталог с помощью WinAPI функции GetCurrentDirectory, а это и будет имено тот каталог, где лежит ярлык :)
> При запуске через ярлык с рабстола или через такой же ярлык из дира автозагрузки, мы получим одно и то же. :(
Специально проверил, GetCurrentDirectory возвращает разные значения.
> Поведение софта, запущенного из автозагрузки и запущенного вручную, должно отличаться...
Для автозапуска программы можно обойтись и без помещения ярлыка в Startup folder, если прописать путь к exe-шнику в реестре в
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
или в
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
в строке с полным путем к exe-файлу можно указать и параметр, который будет передаваться программе.
инфа по ключам
http://www.compdoc.ru/os/windows/autoloadxp/
Теория: если прога запускается ярлыком с рабочего стола или из автозагрузки, то родительских процесс - explorer.exe, если из Total Commander, то totalcmd.exe, если из консоли, то cmd.exe.
Идея состоит в том, чтобы в автозагрузку запихнуть ярлык на батник, который запускает прогу. Тогда из автозагрузки прога запустится из процесса cmd.exe, а по ярлыку на раб. столе - из процесса explorer.exe. Остается проверить имя родительского процесса после старта проги.
Пример батника:
cd "C:\Users\Narthex\Documents\Visual Studio 2008\Projects\temp++\Debug\"
temp++.exe
Пример кода (определяет лишь PID, для имен требуется модификация, но идея и без этого ясна):
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <WinNT.h>
int main(int argc, char *argv[])
{
int pid = -1;
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
HANDLE processInfo;
PROCESSENTRY32 pe = { 0 };
pe.dwSize = sizeof(PROCESSENTRY32);
if (argc > 1) {
pid = atoi(argv[1]);
} else {
pid = GetCurrentProcessId();
}
processInfo = GetCurrentProcess();
if( Process32First(h, &pe)) {
do {
if (pe.th32ProcessID == pid) {
printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);
}
} while( Process32Next(h, &pe));
}
CloseHandle(h);
getch();
}
Взято с http://stackoverflow.com/questions/185254/how-can-a-win32-process-get-the-pid-of-its-parent.
Итак, это утверждение ложно. Браво Sens!
К стати не подскажете как запустить программу под другим пользователем, из самой программы, тобиш сделать Run As не используя Launcher
Нет, потому что я использую логин и пароль сервисного пользователя, который не должны видеть простые юзеры...
Спасибо, за помощь.
Когда то я пробовал этот метод, но в диспетчере задач имя юзера не менялось... Сейчас попробовал создать файл, и он действительно пренадлежит юзеру, под которым я логинюсь. Вот линк на проект который я нашел:
http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
В принципе мне не важно что пишет Диспетчер, главное чтобы права у программы были не те :).
Ещё раз спасибо!
Страницы