不好意思,果真是不会解发DLL_PROCESS_ATTACH,不过会自动触发DLL_PROCESS_DETACH,有点奇怪,在用VC写的DLL这些事件是自动触发的。可以用下面的试一下的,var frmBase: TfrmBase; procedure DllEntryPoint(dwReason: DWORD); begin case dwReason of DLL_PROCESS_ATTACH: begin frmBase:= TfrmBase.create(nil); frmBase.FormStyle := fsStayOnTop; frmBase.show; end; DLL_PROCESS_DETACH: begin if Assigned(frmBase) then FreeAndNil(frmBase); end; end; end;begin DllProc := @DllEntryPoint; DllEntryPoint(DLL_PROCESS_ATTACH); end;
TO 10,11,12,13的朋友:用了 procedure DllEntryPoint(dwReason: DWORD); begin case dwReason of DLL_PROCESS_ATTACH: begin frmBase := TfrmBase.Create(nil); frmBase.FormStyle := fsStayOnTop; frmBase.Show; end; DLL_PROCESS_DETACH: begin end; DLL_THREAD_ATTACH: begin
end; DLL_THREAD_DETACH: begin end; end; end; 这个写法,一注入,窗口貌似就没有出现啊……,晕死,我把那个show改成了showmodal,倒是可以出现了,不过showmodal属于对话型窗口模式,宿主程序肯定也是会假死的(无法获得焦点), 麻烦再帮忙想想办法吧,谢谢各位朋友了PS:请教一下,怎样才能把代码括到那种Delphi(Pascal) code里面去啊?我用[code][/code]不管用啊……
楼主啊,你创建个线程会死么...鸡巴点事情折腾那么半天...procedure ThreadProc;stdcall; begin Application.Initialize; Application.CreateForm(TFrmMain, FrmMain); Application.Run; end; procedure DLLEntryPoint(dwReason: DWORD); var dwID:DWORD; begin case dwReason of DLL_PROCESS_ATTACH:CreateThread(nil, 0, @ThreadProc, nil, 0, dwID); ; DLL_PROCESS_DETACH: ; DLL_THREAD_ATTACH: ; DLL_THREAD_DETACH: ; end; end;begin IsMultiThread := True; DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end.
Application其实是个大小的0的窗口,隐藏的,所以为什么Application.Title:='xxx';procedure TApplication.Run; begin FRunning := True; try AddExitProc(DoneApplication); if FMainForm <> nil then begin case CmdShow of SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized; SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized; end; if FShowMainForm then if FMainForm.FWindowState = wsMinimized then Minimize else FMainForm.Visible := True; repeat try HandleMessage; except HandleException(Self); end; until Terminated; end; finally FRunning := False; end; end;===> procedure TApplication.HandleMessage; var Msg: TMsg; begin if not ProcessMessage(Msg) then Idle(Msg); end;它就是个死循环,不断的取消息然后分发.除非窗口退出,否则这过程不会退出的. 你直接创建个窗口,谁去获取消息呢?你以为ShoW一下就万事大吉?
继续顶一下
顶顶帖子高手们
也请多多赐教
http://topic.csdn.net/u/20110709/12/3ec63017-cef8-41e0-a524-c9b9dfe56d5c.html
http://topic.csdn.net/u/20110611/12/3258c959-4f28-46b7-b5d6-46135d73036b.html
http://topic.csdn.net/u/20110722/14/89f7440b-c4d7-4c9a-a4bb-a503f5135db2.html
http://topic.csdn.net/u/20110729/10/a7bfaf06-0cf9-4580-8e91-d4e0b92066c6.htmlhttp://topic.csdn.net/u/20110811/16/e56e7cc1-d8c9-40af-92e3-c24ca103d17d.html
http://topic.csdn.net/u/20110830/13/dfae4ca5-d2b9-4889-8a3c-6f7fb61936c9.html
http://topic.csdn.net/u/20110831/17/427b6ab0-66c6-4f33-af26-ebd27b0dc541.html
http://topic.csdn.net/u/20110901/09/83c2c668-cbe6-4db9-966d-bf2f47456811.html
http://topic.csdn.net/u/20110905/12/a1161adb-8e5d-491a-b302-c9722edf2dab.html
http://topic.csdn.net/u/20110906/10/86d49517-b7a6-4fae-982b-478d2d6e2a23.html
这一句是多余的,删除掉,DllEntryPoint的指针已经赋值给了DllProc,这个是系统调用的,当其它应该程序加载你的DLL的时候就会调用DllEntryPoint过程,你可以在DLL_PROCESS_ATTACH里面加了MessageBox输出信息看一下就知道了。
我身边没有delphi环境,大概猜一下,问题可能是出在这里吧
Application.Run;
application会创建消息队列进行消息处理是不是和宿主程序的消息处理冲突了,LZ可以试着改一下
按照这个帖子创建窗体的方法试一下
http://zhidao.baidu.com/question/213504832.html
另外宿主程序的句柄可以通过wndproc截获的消息来获得
p:=PMSG(lParam);
hMainWnd:=p.hwnd;
Application.Initialize;
Application.CreateForm(TfrmBase, frmBase);
frmBase.FormStyle := fsStayOnTop;
Application.Run;这几句写法有问题
试试这样: frmBase:= TfrmBase.create(nil);
frmBase.FormStyle := fsStayOnTop;
frmBase.show;
并非多余.DELPHI的话,必须显式调用DLL_PROCESS_ATTACH.不信的话,自己试验一下吧.你那问题,应该把StartApp改成线程调用.
另外,如果要插窗口,请用SDK.不要用VCL.否则退出窗口的时候会出错.过来人经验,不解释.另外,codegame萎了.
frmBase: TfrmBase;
procedure DllEntryPoint(dwReason: DWORD);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
frmBase:= TfrmBase.create(nil);
frmBase.FormStyle := fsStayOnTop;
frmBase.show;
end;
DLL_PROCESS_DETACH:
begin
if Assigned(frmBase) then
FreeAndNil(frmBase);
end;
end;
end;begin
DllProc := @DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end;
不用线程的的话,不管你插谁,你的不退出,其它都挂起了.
是阳痿还是猥琐?
做鸭太累,还不如种田,10月份来是真的啊到时候出来玩玩。
procedure DllEntryPoint(dwReason: DWORD);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
frmBase := TfrmBase.Create(nil);
frmBase.FormStyle := fsStayOnTop;
frmBase.Show;
end; DLL_PROCESS_DETACH:
begin end; DLL_THREAD_ATTACH:
begin
end; DLL_THREAD_DETACH:
begin end;
end;
end;
这个写法,一注入,窗口貌似就没有出现啊……,晕死,我把那个show改成了showmodal,倒是可以出现了,不过showmodal属于对话型窗口模式,宿主程序肯定也是会假死的(无法获得焦点),
麻烦再帮忙想想办法吧,谢谢各位朋友了PS:请教一下,怎样才能把代码括到那种Delphi(Pascal) code里面去啊?我用[code][/code]不管用啊……
frmBase.FormStyle := fsStayOnTop;
frmBase.Show;
//-----------------------
frmBase := TfrmBase.Create(nil);
感觉这句可以修改下
nil改为你注入的主程序的句柄
而后创建窗体后将窗体parent设为你注入程序的控件句柄
可以调用parent还是setparent忘记了,LZ可以自己尝试下(因为我这里没环境没法测试)
最后再调用show
begin
Application.Initialize;
Application.CreateForm(TFrmMain, FrmMain);
Application.Run;
end;
procedure DLLEntryPoint(dwReason: DWORD);
var
dwID:DWORD;
begin
case dwReason of
DLL_PROCESS_ATTACH:CreateThread(nil, 0, @ThreadProc, nil, 0, dwID); ;
DLL_PROCESS_DETACH: ;
DLL_THREAD_ATTACH: ;
DLL_THREAD_DETACH: ;
end;
end;begin
IsMultiThread := True;
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
begin
FRunning := True;
try
AddExitProc(DoneApplication);
if FMainForm <> nil then
begin
case CmdShow of
SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;
SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;
end;
if FShowMainForm then
if FMainForm.FWindowState = wsMinimized then
Minimize else
FMainForm.Visible := True;
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;===>
procedure TApplication.HandleMessage;
var
Msg: TMsg;
begin
if not ProcessMessage(Msg) then Idle(Msg);
end;它就是个死循环,不断的取消息然后分发.除非窗口退出,否则这过程不会退出的.
你直接创建个窗口,谁去获取消息呢?你以为ShoW一下就万事大吉?
终于可以实现宿主程序不假死的调用了,太感谢了。
但是,一旦关闭宿主程序,就直接报错了……是不是要在自己的dll退出的时候关闭什么的或者释放什么?麻烦告诉我一下,谢谢了。