在网上找到一篇资料提到在DLL的Project的Begin……end部分加上一些代码就可以实现在调用DLL的进程退出时执行一些功能,我于是写了一个程序,将DLL注入到explorer.exe中然后用强行结束其进程,可是MyDLLHandler中的代码根本就没有执行,请问这是为什么?应该怎样才能实现在explorer.exe退出时执行MyDLLHandler中的代码呢?
library Project1;uses
Windows,
Func in 'Func.pas';{$R *.res}exports
MyFunc;procedure MyDLLHandler(dwReason: DWORD);
var
reg:HKEY;
size:Cardinal;
data:PChar;
begin
if dwReason=DLL_Process_Detach then
begin
GetMem(data,128);
GetWindowsDirectory(data,128);
data:=pchar(data);
size:=Length(data);
RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce'),0,KEY_ALL_ACCESS,reg);
RegSetValueEx(reg, pChar('Test'), 0, REG_SZ, Data, size);
RegCloseKey(reg);
end;
end;begin
DLLProc:=@MyDLLHandler;
MyDLLhandler(DLL_PROCESS_ATTACH);
end.
library Project1;uses
Windows,
Func in 'Func.pas';{$R *.res}exports
MyFunc;procedure MyDLLHandler(dwReason: DWORD);
var
reg:HKEY;
size:Cardinal;
data:PChar;
begin
if dwReason=DLL_Process_Detach then
begin
GetMem(data,128);
GetWindowsDirectory(data,128);
data:=pchar(data);
size:=Length(data);
RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce'),0,KEY_ALL_ACCESS,reg);
RegSetValueEx(reg, pChar('Test'), 0, REG_SZ, Data, size);
RegCloseKey(reg);
end;
end;begin
DLLProc:=@MyDLLHandler;
MyDLLhandler(DLL_PROCESS_ATTACH);
end.
解决方案 »
- 请教delphi学习进阶
- 报错类型不匹配 qry.filter
- 等待定时器的时间是否会收到其它操作的影响(不包含等待定时器本身的操作函数)
- 关于stringGrid焦点控制的问题。。(与mouse有关)
- 为什么会这样?
- 怎样把image的图片导入word中?
- 不要再问我《delphi从入门到精通》和《delphi 开发人员指南》的下载地址了!
- 做Calculated类型的计算字段所遇到的问题
- 请问,钩子可以不放DLL中而放在程序的EXE中吗?(200分求解)
- CB编的dll,其中有TDBGrid* DBGrid, 在delphi中应怎样写呀?
- 多线程访问数据库,出现“连接占线导致另一个”错误。。。请高手指教!
- *************关于DBGRIDEH的问题????????????
DLLProc:=@MyDLLHandler;
end.就可以了,你断点跟踪一下,可以执行到的!
begin
if dwReason=DLL_Process_Detach then
begin
MessageBox(0,'gg','ff',0);
end;
end;
begin
DLLProc:=@MyDLLHandler;
end.
我写成这样,将DLL注入到Notepad.exe中,可是关闭notepad.exe时没有弹出我想要的对话框啊
要不,先自建一个exe,然后执行,看看DLL有没有进去先?
http://community.csdn.net/Expert/topic/4968/4968118.xml?temp=.9955713
教我,送你分。:B
我的例子。
A.exe,B.Dll,
写了一个程序,将你给我的代码写在里面。
然后,用一个OpenDialog分别选择A.exe和B.Dll。
不管A.exe是先开启注入,还是先注入开启。
在执行(动态)调用B.Dll/Test的时候,还是报错。说明没有真的注入,或者说在同一个进程中。
注入后你怎么调用的?
要在DLL的中的PAS中写,注入后就自动运行Test的代码啦
initialization
hThreadHandle := CreateThread(nil, 0, @Test, nil, 0, dwThreadID);finalization
if (hThreadHandle <> 0) then
TerminateThread(hThreadHandle, 0);
不会用initialization呀(汗)procedure Test(App:TApplication);stdcall;
var frm,men:TComponent;
begin
frm :=App.FindComponent('frmMain');
if frm<>nil then//***************
begin
men :=(frm as TForm).FindComponent('About1');
if men<>nil then
(men as TMenuItem).Click;
end;
end;exports
Test;var hThreadHandle,dwThreadID:HWND;
initialization
hThreadHandle := CreateThread(nil, 0, @Test, nil, 0, dwThreadID);finalization
if (hThreadHandle <> 0) then
TerminateThread(hThreadHandle, 0);
begin
end.
hThreadHandle := CreateThread(nil, 0, @Test, nil, 0, dwThreadID);//必须要用CreateThreadfinalization
if (hThreadHandle <> 0) then
TerminateThread(hThreadHandle, 0);