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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 18:53   #1
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
Вопрос Автозапуск проги?!(Delphi)

Я для автозапуска проги использую Registry, вот ток не знаю по верному ли пути пошел. У меня когда обычно запускаю прогу, то она норм работает, правильно определяет место нахождения файла, а при автозапуске указывает путь C:\Documents and Setting\User\Мой_файл.dat, при том когда его там вовсе и нету. И можете подсказать где можно почитать про выделенный мною кучей слэшев фрагмент кода, где и зачем это применяется, что это такое если по подробней.

Код:
Var
  str:string;
  j,k:integer;
BEGIN
////////////////////////////////////////////////////////////////
  Reg:=TRegistry.Create;
  Try
    Reg.RootKey := HKEY_CURRENT_USER;
    IF Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True) Then
     Begin
      Reg.WriteString('ProcessesKill', Application.ExeName);
      Reg.CloseKey;
     End;
////////////////////////////////////////////////////////////////////
  Finally
   Reg.Free;
   {Поиск пути к файлу}
   str:=ExpandFileName(ProcessFileName);
   For j:=0 to Length(str) do
     Begin
       IF str[j]='\' Then
          k:=j;
     End;
   Delete(str,k,16);
   Writeln(str);
   Writeln(k);
   Writeln;
   SetCurrentDir(str); //Установка каталога, где файл имеем
   IF FileExists(ProcessFileName) Then
    Begin
      OpenFile;//Считываем из файла в динамич. память
      ProcessHead:=ProcessLIST;
      {Убиваем процессы}
      While ProcessLIST<>nil Do
       Begin
         ProcessTerminate(SearchPid(ProcessLIST^.process));
         Writeln('Process '+ProcessLIST^.process+' kiiled');
         ProcessLIST:=ProcessLIST^.next
       End
    End;
    ProcessHead:=ProcessLIST;
    Readln;
    {Application.Terminate }
  end;
END.
<----Весы Там.

Последний раз редактировалось Npwas; 14.06.2012 в 06:44.
Npwas вне форума Ответить с цитированием
Старый 14.06.2012, 09:09   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а мне логика непонятна..
1-х, вы в реестр пишете всегда? независимо от того, есть там уже запись или нет?
2-х. а что за ужас начинается после finally ?! что за переменная ProcessFileName ? Что в ней находится? смысл всего происходящего?

похоже, что Вы привели ВЫРВАННЫЙ из контекста кусок кода. он не является функционально полным/завершённым...


p.s. а в целом, имхо, подход к прописыванию своей программы в автозапуск - нормальный
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2012, 14:03   #3
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Я просто с реестром еще ни разу не работал, вот поэтому и получается у меня такая жуть, да кусок кода вырван, но я не думал, что для вас это будет затруднением, ProcessFileName это константа, хранящая в себе имя типизированного файла - 'ProcessBaza.dat', что хранит в себе процессы, которые убить надо!!! Вот весь кусок моей жути, если это вас просвятит в том, что я пытаюсь сделать:
Код:
program ProcessesKill;
  {$APPTYPE CONSOLE}
uses
  Windows,Messages,SysUtils,Forms,Tlhelp32,Registry;

CONST
   ProcessFileName='ProcessBaza.dat';

TYPE
  String40=string[40];
  PProcess = ^TProcess;
  TProcess = packed Record
      process:String40;
      next:PProcess
  end;
  FProcess = packed Record
      process:String40
  end;

Var
   Reg: TRegistry;
   ProcessHead,ProcessLIST: PProcess;
   ProcessF: FProcess;
   F:File of FProcess;

 {$R *.res}

{ОПРЕДЕЛЕНИЕ id Процесса}
FUNCTION SearchPid(processName_fc:string):Cardinal;
 Var
   hSnap:THandle;
   pe:TProcessEntry32;
 BEGIN
   pe.dwSize:=SizeOf(pe);
   hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  IF Process32First(hSnap,pe) Then
    While Process32Next(hSnap,pe) Do
      IF ExtractFileName(pe.szExeFile)=processName_fc Then
          Result:=pe.th32ProcessID;
 END;

{ОТКЛЮЧЕНИЕ ПРОЦЕССА}
FUNCTION ProcessTerminate(dwPID:Cardinal):Boolean;
 Var
   hToken:THandle;
   SeDebugNameValue:Int64;
   tkp:TOKEN_PRIVILEGES;
   ReturnLength:Cardinal;
   hProcess:THandle;
 BEGIN
   Result:=false;
   // Добавляем привилегию SeDebugPrivilege
   // Для начала получаем токен нашего процесса
   IF not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
        or TOKEN_QUERY, hToken ) Then
    exit;
   // Получаем LUID привилегии
   IF not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue )
     Then
       Begin
        CloseHandle(hToken);
        exit;
       End;
   tkp.PrivilegeCount:= 1;
   tkp.Privileges[0].Luid := SeDebugNameValue;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   // Добавляем привилегию к нашему процессу
   AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp)  ,tkp,ReturnLength);
   IF GetLastError()<> ERROR_SUCCESS  Then
          exit;
   // Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
   // завершить и системный процесс
   // Получаем дескриптор процесса для его завершения
   hProcess:=OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
   IF hProcess =0  Then
             exit;
   // Завершаем процесс
   IF not TerminateProcess(hProcess, DWORD(-1)) Then
        exit;
   CloseHandle( hProcess );
   // Удаляем привилегию
   tkp.Privileges[0].Attributes := 0;
   AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
   IF GetLastError() <>  ERROR_SUCCESS Then
         exit;
   Result:=true;
 END;

PROCEDURE OpenFile;
 Var
   tmp:PProcess;
   PROCEDURE Input(process_pr:String40);
    Var
     tmp: PProcess;
    BEGIN
     IF ProcessLIST=nil Then
      Begin
        New(ProcessLIST);
        tmp:=ProcessLIST;
        ProcessHead:=ProcessLIST
      End
     Else
      Begin
        tmp:=ProcessLIST;
        While tmp^.next<>nil do
                tmp:=tmp^.next;
        New(tmp^.next);
        tmp:=tmp^.next;
      End;
     tmp^.next:=nil;
     tmp^.process:=process_pr;
    END;
 BEGIN
   AssignFile(F,ExpandFileName(ProcessFileName));
   Reset(F);
   tmp:=ProcessLIST;
   While not Eof(F) do
    Begin
      Read(F,ProcessF);
      Input(ProcessF.process)
    End;
   CloseFile(F);
 END;

Var
  str:string;
  j,k:integer;
BEGIN
  Reg:=TRegistry.Create;
  Try
    Reg.RootKey := HKEY_CURRENT_USER;
    IF Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True) Then
     Begin
      Reg.WriteString('ProcessesKill', Application.ExeName);
      Reg.CloseKey;
     End;
  Finally
   Reg.Free;
   {Поиск пути к файлу}
   str:=ExpandFileName(ProcessFileName);
   For j:=0 to Length(str) do
     Begin
       IF str[j]='\' Then
          k:=j;
     End;
   Delete(str,k,16);
   Writeln(str);
   Writeln(k);
   Writeln;
   SetCurrentDir(str); //Установка каталога, где файл имеем
   IF FileExists(ProcessFileName) Then
    Begin
      OpenFile;//Считываем из файла в динамич. память
      ProcessHead:=ProcessLIST;
      {Убиваем процессы}
      While ProcessLIST<>nil Do
       Begin
         ProcessTerminate(SearchPid(ProcessLIST^.process));
         Writeln('Process '+ProcessLIST^.process+' kiiled');
         ProcessLIST:=ProcessLIST^.next
       End
    End;
    ProcessHead:=ProcessLIST;
    Readln;
    {Application.Terminate }
  end;
END.
<----Весы Там.
Npwas вне форума Ответить с цитированием
Старый 14.06.2012, 14:06   #4
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Да в реестр я всегда пишу, подругому просто не знаю как, поэтому надеюсь, что посоветуете где можно про это поподробнее почитать и подскажите с чего начать стоит!!!
<----Весы Там.
Npwas вне форума Ответить с цитированием
Старый 14.06.2012, 21:22   #5
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Люди, направьте кто-нибудь салагу на верный путь!!!
<----Весы Там.
Npwas вне форума Ответить с цитированием
Старый 14.06.2012, 21:32   #6
QunneD
C++ &amp;amp; PHP &amp;amp; Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

Очередная лоло зараза в процессе черновой разработки? :D

Читайте на здоровье, http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Насчет исходника в целом, очень много лишнего, куча в куче.

И лишние библиотеки тоже можно какбэ отключить, достаточно просто использовать windows.h/tlhelp32.h
QunneD вне форума Ответить с цитированием
Старый 14.06.2012, 21:40   #7
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
По умолчанию

Спасиб!!! Просто когда сам по своей инциативе куда-то лезешь, то не всегда знаешь куда лучше!!! А библиотек стоко по привычке, я их потом обрубаю(лишние)!!!
<----Весы Там.
Npwas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автозапуск проги kotaina Общие вопросы Delphi 8 13.04.2011 07:15
Автозапуск приложения Delphi Sk!f Фриланс 17 21.10.2009 12:01
Автозапуск, Delphi north Помощь студентам 19 06.08.2009 15:48
[Delphi] Автозапуск Рамик Помощь студентам 13 04.08.2009 22:25
Автозапуск проги! blackstersl Общие вопросы Delphi 3 21.12.2008 02:57