本帖最后由 sogekisyu 于 2011-09-07 16:44:29 编辑

解决方案 »

  1.   

    学习学习先
    继续顶一下
    顶顶帖子高手们
    也请多多赐教
    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
      

  2.   

    DllEntryPoint(DLL_PROCESS_ATTACH);
    这一句是多余的,删除掉,DllEntryPoint的指针已经赋值给了DllProc,这个是系统调用的,当其它应该程序加载你的DLL的时候就会调用DllEntryPoint过程,你可以在DLL_PROCESS_ATTACH里面加了MessageBox输出信息看一下就知道了。
      

  3.   

    http://blog.sina.com.cn/s/blog_5921f9ae0100g8if.html
      

  4.   

    LZ这个程序里,dll代码不全吧,没有消息处理函数么?
      

  5.   

    有消息处理函数啊,不过,这么说吧,我只写一个没有任何消息处理的窗体在dll里面,宿主程序照样会假死啊……
      

  6.   

    一般宿主程序假死的原因可能是因为dll中的消息处理函数写的有问题,wndproc没有在处理完消息后把消息继续传递
    我身边没有delphi环境,大概猜一下,问题可能是出在这里吧
    Application.Run;
    application会创建消息队列进行消息处理是不是和宿主程序的消息处理冲突了,LZ可以试着改一下
    按照这个帖子创建窗体的方法试一下
    http://zhidao.baidu.com/question/213504832.html 
    另外宿主程序的句柄可以通过wndproc截获的消息来获得
           p:=PMSG(lParam);
          hMainWnd:=p.hwnd;
      

  7.   


      Application.Initialize;
      Application.CreateForm(TfrmBase, frmBase);
      frmBase.FormStyle := fsStayOnTop;
      Application.Run;这几句写法有问题
    试试这样:  frmBase:= TfrmBase.create(nil);  
      frmBase.FormStyle := fsStayOnTop;
      frmBase.show;
      

  8.   


    并非多余.DELPHI的话,必须显式调用DLL_PROCESS_ATTACH.不信的话,自己试验一下吧.你那问题,应该把StartApp改成线程调用.
    另外,如果要插窗口,请用SDK.不要用VCL.否则退出窗口的时候会出错.过来人经验,不解释.另外,codegame萎了.
      

  9.   

    不好意思,果真是不会解发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;
      

  10.   

    其实是因为  Application.Run;是阻塞的.明白了么
    不用线程的的话,不管你插谁,你的不退出,其它都挂起了.
      

  11.   

    我一直用VCL好像没发现问题,退出也正常。难道人品问题?
    是阳痿还是猥琐?
      

  12.   

    先退出窗口,再退出NOTEPAD,NOTEPAD会出错.听说你去做鸭了,甚想念.
      

  13.   

    退窗口不要把DLL卸载,让宿主退出时候自己卸载。
    做鸭太累,还不如种田,10月份来是真的啊到时候出来玩玩。
      

  14.   

    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]不管用啊……
      

  15.   

      frmBase := TfrmBase.Create(nil);
       frmBase.FormStyle := fsStayOnTop;
       frmBase.Show;
    //-----------------------
      frmBase := TfrmBase.Create(nil);
    感觉这句可以修改下
    nil改为你注入的主程序的句柄
    而后创建窗体后将窗体parent设为你注入程序的控件句柄 
    可以调用parent还是setparent忘记了,LZ可以自己尝试下(因为我这里没环境没法测试)
    最后再调用show
      

  16.   

    熊猫哥,那个注入的程序是另外一个exe,我水平很菜,不会将宿主的handle传给这个dll……,不过还是谢谢熊猫哥
      

  17.   

    我给你的链接你看过了么?宿主的handle是在createform时传进去的啊,找到的方法有很多,findwindos是最简单的一个
      

  18.   

    ^_^,关键是,我想把explorer或者winlogon当成宿主,那些没有窗体啊
      

  19.   

    楼主啊,你创建个线程会死么...鸡巴点事情折腾那么半天...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.
      

  20.   

    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一下就万事大吉?
      

  21.   

    TO:26楼
    终于可以实现宿主程序不假死的调用了,太感谢了。
    但是,一旦关闭宿主程序,就直接报错了……是不是要在自己的dll退出的时候关闭什么的或者释放什么?麻烦告诉我一下,谢谢了。
      

  22.   

    恩,是VCL的问题,但是,怎样转化成SDK呢……,真的菜的要命……,好多基础知识都不知道