Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проконсультируйте... запуск dll 
:(
    Опции темы
Zdvig
Дата 3.5.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.5.2005

Репутация: нет
Всего: 1



Пишу простенькую программу в виде dll, для записи времени включения и выключения компьютера.
Запускать dll нужно без участия дополнительных программ, кроме самой winlogon.exe (winXP). Для этого используется
автозагрузка dll через реестр: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\

Dll запускается, делает запись, но не выгружается из памяти. Это пол беды. Но при попытки выключения, перезагрузки
или смене пользователя ничего не происходит. Dll как бы не дает разрешение на выход из системы. Как это можно исправить или подправить?

Код программы:


Код

library suser64;

uses
  SysUtils,
  windows;

var
 S,WD,FileLog:String;
 F:System.Text;
 aw : Array[0..MAX_PATH] of char;


Procedure GetFP; stdcall;      //определение системной папки System32
begin
 GetSystemDirectory(aw, sizeof(aw));
 WD:=(StrPas(aw));
 FileLog:=WD+'\suser.log';
end;

Procedure SaveFileLogon; stdcall;  //сохранение лога при входе в систему (Событие "logon" в разделе реестра выше)
begin
 GetFP;
 S := FormatDateTime('( dddd  d mmmm  yyyy г.  -  hh:mm:ss )', Now);
 System.Assign(F,FileLog);
 If FileExists(FileLog) = false Then Rewrite(F);
 Append(F);
 WriteLn(F,'Вход: '+S);
 System.Close(F);
end;

Procedure SaveFileLogoff; stdcall;  //сохранение лога при выходе из системы (Событие "logoff" в разделе реестра выше)
begin
 GetFP;
 S := FormatDateTime('( dddd  d mmmm  yyyy г.  -  hh:mm:ss )', Now);
 System.Assign(F,FileLog);
 If FileExists(FileLog) = false Then Rewrite(F);
 Append(F);
 WriteLn(F,'Выход: '+S);
 System.Close(F);
end;


exports SaveFileLogon,
        SaveFileLogoff;

begin
 
end.


Это сообщение отредактировал(а) Zdvig - 3.5.2005, 13:02
--------------------
Лампочка - ожерелье голых поп. Вся любовь - оп-хоп-хоп!
PM MAIL   Вверх
Rouse_
Дата 3.5.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Сделай экспорт ветви реестра где ты производишь регисрацию библиотеки и кинь его сюда...


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Zdvig
Дата 3.5.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.5.2005

Репутация: нет
Всего: 1



реестр:


Присоединённый файл ( Кол-во скачиваний: 32 )
Присоединённый файл  suser.reg
--------------------
Лампочка - ожерелье голых поп. Вся любовь - оп-хоп-хоп!
PM MAIL   Вверх
Rouse_
Дата 3.5.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Ну во первых прототип функций выглядит как

Код

VOID Event_Handler_Function_Name(
  PWLX_NOTIFICATION_INFO pInfo
);



вот тебе описание структуры:
Код

  PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
  {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
  _WLX_NOTIFICATION_INFO = record
    Size: ULONG;
    Flags: ULONG;
    UserName: PWSTR;
    Domain: PWSTR;
    WindowStation: PWSTR;
    hToken: HANDLE;
    hDesktop: HDESK;
    pStatusCallback: PFNMSGECALLBACK;
  end;
  {$EXTERNALSYM _WLX_NOTIFICATION_INFO}
  WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
  {$EXTERNALSYM WLX_NOTIFICATION_INFO}
  TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
  PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;



Соответственно вот тебе примерный обработчик:
Код

procedure WLEventLogon(var pInfo: TWlxNotificationInfo);

Это раз, во вторых не вижу где у тебя отработчики на DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH
Добавлено @ 15:09
т.е.
Код

procedure WLEventLogon(var pInfo: TWlxNotificationInfo); stdcall;
естественно smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Zdvig
Дата 3.5.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.5.2005

Репутация: нет
Всего: 1



А по подробнее можно, куда это вписывать и как эти процедуры будут выглядеть полностью?

DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH - я незнаю как их правильно мспользовать. Смотрел много примеров, но так и непонял их основного назначения...

Мне интересно, что "подвешивает" систему в программе?

Это сообщение отредактировал(а) Zdvig - 3.5.2005, 17:30
--------------------
Лампочка - ожерелье голых поп. Вся любовь - оп-хоп-хоп!
PM MAIL   Вверх
Girder
Дата 4.5.2005, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(Zdvig @ 3.5.2005, 18:08)
Мне интересно, что "подвешивает" систему в программе?
Выход в никуда... smile Т.е. должно быть "Ret +4" ... а у тебя "Ret" smile

Цитата(Zdvig @ 3.5.2005, 18:08)
А по подробнее можно, куда это вписывать и как эти процедуры будут выглядеть полностью?
Код
library suser64;

uses
  SysUtils,
  windows;

var
 S,WD,FileLog:String;
 F:System.Text;
 aw : Array[0..MAX_PATH] of char;

Type
 _WLX_NOTIFICATION_INFO = packed record
    Size: DWord;
    Flags: DWord;
    UserName: PWideChar;
    Domain: PWideChar;
    WindowStation: PWideChar;
    hToken: DWord;
    hDesktop: HDESK;
    pStatusCallback: Pointer;
  end;



Procedure GetFP; stdcall;      //определение системной папки System32
begin
 GetSystemDirectory(aw, sizeof(aw));
 WD:=(StrPas(aw));
 FileLog:=WD+'\suser.log';
end;

procedure SaveLog(const Str:String);
begin
 GetFP;
 S := FormatDateTime('( dddd  d mmmm  yyyy г.  -  hh:mm:ss )', Now);
 System.Assign(F,FileLog);
 If FileExists(FileLog) = false Then Rewrite(F);
 Append(F);
 WriteLn(F,Str+S);
 System.Close(F);
end;

procedure SaveFileLogon(var Info: _WLX_NOTIFICATION_INFO); stdcall;  //сохранение лога при входе в систему (Событие "logon" в разделе реестра выше)
var s:string;
begin
 try
  s:=Info.UserName;
  SaveLog('Вход('+s+'): ');
 except
 end;
end;

procedure SaveFileLogoff(var Info: _WLX_NOTIFICATION_INFO); stdcall;  //сохранение лога при выходе из системы (Событие "logoff" в разделе реестра выше)
var s:string;
begin
 try
  s:=Info.UserName;
  SaveLog('Выход('+s+'): ');
 except
 end;
end;

exports SaveFileLogon,
        SaveFileLogoff;

begin
 
end.


Это сообщение отредактировал(а) Girder - 4.5.2005, 02:17


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Rouse_
Дата 4.5.2005, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



По большому счету я бы написал примерно вот таким образом:

Код

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : WinlogonEventDemo
//  * Purpose   : Winlogon event demo
//  * Author    : Alexander (Rouse_) Bagel
//  * Version   : 1.00
//  ****************************************************************************
//

library WinlogonEventDemo;

uses
  Windows;

type

  //
  // Non-GINA notification DLLs
  //

  PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;
  {$EXTERNALSYM PFNMSGECALLBACK}
  TFnMsgeCallback = PFNMSGECALLBACK;

  PWLX_NOTIFICATION_INFO = ^WLX_NOTIFICATION_INFO;
  {$EXTERNALSYM PWLX_NOTIFICATION_INFO}
  _WLX_NOTIFICATION_INFO = record
    Size: ULONG;
    Flags: ULONG;
    UserName: PWideChar;
    Domain: PWideChar;
    WindowStation: PWideChar;
    hToken: THandle;
    hDesktop: HDESK;
    pStatusCallback: PFNMSGECALLBACK;
  end;
  {$EXTERNALSYM _WLX_NOTIFICATION_INFO}
  WLX_NOTIFICATION_INFO = _WLX_NOTIFICATION_INFO;
  {$EXTERNALSYM WLX_NOTIFICATION_INFO}
  TWlxNotificationInfo = WLX_NOTIFICATION_INFO;
  PWlxNotificationInfo = PWLX_NOTIFICATION_INFO;

procedure OutputDebugString(Value: String; const pInfo: TWlxNotificationInfo); 
resourcestring
  Path = '\suser.log';
var
  hOFStruct: TOFStruct;
  hFile: THandle;
  BytesWrite, Len, Flags: DWORD;
  SystemPath: array of Char;
  FilePath: String;
  FindData: TWin32FindData;
begin
  Len := GetSystemDirectory(nil, 0);
  SetLength(SystemPath, Len - 1);
  if GetSystemDirectory(@SystemPath[0], Len) > 0 then
  begin
    FilePath := String(SystemPath) + Path;
    ZeroMemory(@hOFStruct, SizeOf(TOFStruct));
    if FindFirstFile(PChar(FilePath), FindData) <> INVALID_HANDLE_VALUE then
      Flags := OF_READWRITE or OF_SHARE_EXCLUSIVE
    else
      Flags := OF_CREATE or OF_SHARE_EXCLUSIVE;
    hFile := OpenFile(PChar(FilePath), hOFStruct, Flags);
    if hFile <> HFILE_ERROR then
    try
      Value :=
        'NOTIFY: User "' + pInfo.UserName +
        '" entering ' + Value +
        ' on WindowStation "' + pInfo.WindowStation +
        '", Domain "' + pInfo.Domain + '"'; 
      Len := GetFileSize(hFile, nil);
      SetLength(SystemPath, Len);
      if ReadFile(hFile, SystemPath[0], Len, BytesWrite, nil) then
        Value := String(SystemPath) + #13#10 + Value;
      if WriteFile(hFile, Value[1], Length(Value), BytesWrite, nil) then
        FlushFileBuffers(hFile);
    finally
      _lclose(hFile);
    end;
  end;
end;

// Here is the entrance function for the DLL.
procedure DLLEntryPoint(dwReason: DWORD);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
      // Disable DLL_THREAD_ATTACH & DLL_THREAD_DETACH
      // notification calls. This is a performance optimization
      // for multithreaded applications that do not need
      // thread-level notifications of attachment or detachment.

      DisableThreadLibraryCalls(HInstance);
    end;
    DLL_PROCESS_DETACH:
    begin
      // Dummee
    end;
  end;
end;

// Here is the event handler for the Winlogon Logon event.
procedure WLEventLogon(var pInfo: TWlxNotificationInfo); stdcall;
begin
  if SizeOf(TWlxNotificationInfo) = pInfo.Size then
    // Print the name of the handler to debug output.
    OutputDebugString('WLEventLogon', pInfo);
end;

// Here is the event handler for the Winlogon Logoff event.
procedure WLEventLogoff(var pInfo: TWlxNotificationInfo); stdcall;
begin
  if SizeOf(TWlxNotificationInfo) = pInfo.Size then
    // Print the name of the handler to debug output.
    OutputDebugString('WLEventLogoff', pInfo);
end;


exports
  WLEventLogon,
  WLEventLogoff;

begin
  // library initialization code
  DllProc := @DLLEntryPoint;
  DllProc(DLL_PROCESS_ATTACH);
end.


Это сообщение отредактировал(а) Rouse_ - 4.5.2005, 10:38


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Zdvig
Дата 4.5.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.5.2005

Репутация: нет
Всего: 1



Girder

Огромное тебе спасибо! Действительно работает! Только небольшая просьба, если есть еще глюки явные в программе, напиши, может подправить что...


Rouse_

Идея интересна, dll почти ничего не весит smile Только вот неработает... Проблема так и осталась, windows не завершает работу...
--------------------
Лампочка - ожерелье голых поп. Вся любовь - оп-хоп-хоп!
PM MAIL   Вверх
Rouse_
Дата 4.5.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(Zdvig @ 4.5.2005, 16:41)
Идея интересна, dll почти ничего не весит  Только вот неработает... Проблема так и осталась, windows не завершает работу...

smile
Странно. у меня все в порядке.
XP SP2

DLL лежит в C:\WINDOWS\system32
реестр выглядит как:

Цитата
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WinlogonEventDemo]
"Asynchronous"=dword:00000000
"DllName"="WinlogonEventDemo.dll"
"Impersonate"=dword:00000000
"logon"="WLEventLogon"
"logoff"="WLEventLogoff"


С логом тоже вроде все нормально...

Цитата
NOTIFY: User "rouse" entering WLEventLogon on WindowStation "WinSta0", Domain "MBS"
NOTIFY: User "rouse" entering WLEventLogon on WindowStation "WinSta0", Domain "MBS"
NOTIFY: User "rouse" entering WLEventLogoff on WindowStation "WinSta0", Domain "MBS"
NOTIFY: User "rouse" entering WLEventLogon on WindowStation "WinSta0", Domain "MBS"
NOTIFY: User "rouse" entering WLEventLogon on WindowStation "WinSta0", Domain "MBS"
NOTIFY: User "rouse" entering WLEventLogoff on WindowStation "WinSta0", Domain "MBS"
NOTIFY: User "Rouse" entering WLEventLogon on WindowStation "WinSta0", Domain "IT6"

Добавлено @ 16:35
ЗЫ: Собирал я данную чтуку под Дельфи семеркой с первым сервиспаком...


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Zdvig
Дата 4.5.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.5.2005

Репутация: нет
Всего: 1



Хм, я имя dll поменял. В коде не смотрел, есть ли зависимость?
Система таже, только Delphi 7 без с'паков.

Самое главное в dll, так это запись времени ее загрузки и выгрузки, ради чего я вобщем-то все и делаю. Можно это добавить в твой код? Я его толком не смотрел, разбираться надо, а ты раз написал, сможешь быстро вствить smile
--------------------
Лампочка - ожерелье голых поп. Вся любовь - оп-хоп-хоп!
PM MAIL   Вверх
Girder
Дата 5.5.2005, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Rouse_ я тут твой пример... немного переписал.
Zdvig проверь.
Код
library suser64;

uses
  Windows;

var DTLC:Boolean=false;

type
  PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;
  _WLX_NOTIFICATION_INFO = record
    Size: ULONG;
    Flags: ULONG;
    UserName: PWideChar;
    Domain: PWideChar;
    WindowStation: PWideChar;
    hToken: THandle;
    hDesktop: HDESK;
    pStatusCallback: PFNMSGECALLBACK;
  end;

procedure OutputDebugString(Value: String; var pInfo: _WLX_NOTIFICATION_INFO);
const
  Path = 'suser.log';
var
  hFile: THandle;
  BytesWrite, Len: DWORD;
  SystemPath:String;
  FilePath: String;
  ST:_SystemTime;
  fStr,ST_Str:String;
  t:array [0..5] of integer;
begin
 try
  GetLocalTime(ST);
  SetLength(ST_Str,21);
  fStr:='%02d:%02d:%04d - %02d:%02d:%02d';
  t[0]:=ST.wDay;
  t[1]:=ST.wMonth;
  t[2]:=ST.wYear;
  t[3]:=ST.wHour;
  t[4]:=ST.wMinute;
  t[5]:=ST.wSecond;
  wvsprintf(PChar(ST_Str),PChar(fStr),PChar(@t));
  Len:=GetSystemDirectory(nil, 0);
  SetLength(SystemPath, Len-1);
  if GetSystemDirectory(PChar(SystemPath),Len)>0 then
  begin
    if SystemPath[Len]='\' then FilePath :=SystemPath+Path else FilePath :=SystemPath+'\'+Path;
    hFile:=CreateFile(PChar(FilePath),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    if hFile<>INVALID_HANDLE_VALUE then
     begin
      try
      Value :=
        'NOTIFY: User "' + pInfo.UserName +
        '" entering ' + Value +
        ' on WindowStation "' + pInfo.WindowStation +
        '", Domain "' + pInfo.Domain + '" ('+ST_Str+')'+#13+#10;
        SetFilePointer(hFile,0,nil,FILE_END);
        WriteFile(hFile,Value[1],Length(Value),BytesWrite, nil);
      except
      end;
       CloseHandle(hFile);
     end;
  end;
  SetLength(ST_Str,0);
  SetLength(SystemPath,0);
 except
 end;
end;

// Here is the event handler for the Winlogon Logon event.
procedure SaveFileLogon(var pInfo: _WLX_NOTIFICATION_INFO); stdcall;
begin
  if SizeOf(_WLX_NOTIFICATION_INFO) = pInfo.Size then
    // Print the name of the handler to debug output.
    OutputDebugString('WLEventLogon', pInfo);
end;

// Here is the event handler for the Winlogon Logoff event.
procedure SaveFileLogoff(var pInfo: _WLX_NOTIFICATION_INFO); stdcall;
begin
  if SizeOf(_WLX_NOTIFICATION_INFO) = pInfo.Size then
    // Print the name of the handler to debug output.
    OutputDebugString('WLEventLogoff', pInfo);
end;

exports
  SaveFileLogon,
  SaveFileLogoff;

begin
  // library initialization code
  if DTLC=false then
   DisableThreadLibraryCalls(HInstance); //Не беспокоить :)
  DTLC:=true;
end.



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Rouse_
Дата 5.5.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Girder, твой вариант также отработал без проблем.

Только смысла вот в этом я не вижу:
Цитата(Girder @ 5.5.2005, 02:02)
  if DTLC=false then
  DisableThreadLibraryCalls(HInstance); //Не беспокоить smile
  DTLC:=true;

Так как этот код выполниться только при первой загрузке библиотеки, все остальные загрузки библиотеки в другие адресные пространства будут нотифицироваться при помощи DLL_PROCESS_ATTACH и в остальных процессах данный код не выполниться smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Girder
Дата 5.5.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(Rouse_ @ 5.5.2005, 10:56)
Так как этот код выполниться только при первой загрузке библиотеки, все остальные загрузки библиотеки в другие адресные пространства будут нотифицироваться при помощи DLL_PROCESS_ATTACH и в остальных процессах данный код не выполниться smile
Знаю... но:
1. Смотря как её грузят.
2. По большому счету... считаю что вообще можно удалить DisableThreadLibraryCalls(подумаеш... будут беспокоить smile )
И самое главное...
3. Кому придет в голову... её ещё грузить? smile



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Rouse_
Дата 5.5.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(Girder @ 5.5.2005, 11:05)
Кому придет в голову... её ещё грузить?

Ну я просто думаю вперед, вдруг ему захочется развивать библиотеку, встраивать туда еще что-либо smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Zdvig
Дата 5.5.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.5.2005

Репутация: нет
Всего: 1



Библиотеку 99,9% что никто не загрузит больше, если winlogon.exe не глюкнет smile Программа, как понятно уже, используется специально для скрытого мониторинга времени. Добавлять защиту от второго запуска или еще что не нужно.
При загрузке-пишет лог, при смене пользователя, также пишет. Если работают оба пользователя, т.е. dll вызывается и одновременно работет 2 раза - проблем нет. При перезагрузке, пишется время выхода для обоих пользователей. Видно этим занимается winlogon.exe

Тестировал на XP sp1, sp2, Win2003 Server

Girder
Цитата
Zdvig проверь.


Работает, но не выгружет виндовс. Проблема так и остается. Первый твой способ прошел отлично.




Насчет развивать библиотеку, да, думаю вставить туда снятие скриншотов smile

Это сообщение отредактировал(а) Zdvig - 5.5.2005, 16:45
--------------------
Лампочка - ожерелье голых поп. Вся любовь - оп-хоп-хоп!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.