看流星社区

 找回密码
 注册账号
查看: 2857|回复: 3

[Delphi] 辅助中的DLL通信的问题!

[复制链接]

该用户从未签到

发表于 2011-3-30 09:16:56 | 显示全部楼层 |阅读模式
首先说一下我的DLL..
DLL是通过远程插入的方式插入到游戏中.在DLL中我用消息钩子的方法来钩住发给游戏窗体的消息
代码:
  fpd:=FindWindow(nil, 'WGdll.txt - 记事本');
  GameTid:=GetWindowThreadProcessId(fpd,nil);
  hHk :=SetWindowsHookExA(WH_GETMESSAGE,@HookProc,HInstance,GameTid);

消息回调处理.用的是论坛里的朋友给出的一个测试代码..
const
  WM_mymgs= WM_USER+104;

function HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;
var
  st:PMessage;
begin
  st:=pmessage(LParam);
  if st.WParam = WM_mymgs then
    showmessage('ok!');
  Result := CallNextHookEx(hHk,nCode,WParam,LParam);
end;


可以正常拦到自定义的信息....显示OK

但是比如说,我想把游戏中要用到的一些打怪的CALL或者其他的CALL都放到DLL中来.插入到游戏中..
然后通过辅助程序(EXE),发一个自定义的消息给游戏,DLL会拦下来自己运行..
经测试,选怪的CALL和普通攻击的CALL 都可以正常成功.但是有些CALL是带参数的.不知道高手们是怎么传到DLL的呢...

该用户从未签到

发表于 2011-3-30 09:18:36 | 显示全部楼层
这个容易,不过我不懂D,只能看,不会写,我举个C的例子,希望对LZ有帮助。
我举一个走路的例子。
在EXE和DLL中都定义一个消息:
  1. #define WM_AUTOMOVE            WM_USER+101
复制代码
EXE中发送消息:

  1. void CLoaderDlg::OnBtnMoveto()
  2. {
  3.     UpdateData();
  4.     ::SendMessage(m_hCHWnd,WM_AUTOMOVE,m_ItemX,m_ItemY);
  5. }
复制代码
DLL中的回调时这样写的:

  1. LRESULT    CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
  2. {
  3.     try
  4.     {
  5.         if (nCode == HC_ACTION)
  6.         {
  7.             switch(((PCWPSTRUCT)lParam)->message)
  8.             {
  9.             case WM_AUTOMOVE:
  10.                     OutToHookLog("移动到坐标: %d,%d",((PCWPSTRUCT)lParam)->wParam, ((PCWPSTRUCT)lParam)->lParam);
  11.                     PGAME_ITEMPOS    pstItemPos = new GAME_ITEMPOS;
  12.                     RtlZeroMemory(pstItemPos, sizeof(GAME_ITEMPOS));
  13.                     pstItemPos->x = (float)((PCWPSTRUCT)lParam)->wParam;
  14.                     pstItemPos->y = (float)((PCWPSTRUCT)lParam)->lParam;
  15.                     CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AutoPath, pstItemPos, 0, NULL);

  16.                 break;
  17.             }

  18.             bStartHook = TRUE;
  19.         }
  20.     }
  21.     catch (...)
  22.     {
  23.         OutToHookLog("catch error...");
  24.     }

  25.     return CallNextHookEx(g_hHook,nCode,wParam,lParam);
  26. }
复制代码
这样就OK了,SendMessage本来就支持传递参数的嘛,嘿嘿。

该用户从未签到

发表于 2011-3-30 09:18:57 | 显示全部楼层
SendMessag是要等到他运行成功才返回的

我现在用的是postMessage..

procedure TForm1.Button2Click(Sender: TObject);
var
Str:char;
  GameTid:THandle;
begin
Str := 'o';
fpd:=FindWindow(nil,'WGdll.txt - 记事本');
GetWindowThreadProcessId(fpd,@GameTid);
Memo1.Lines.Add(IntToStr(GameTid) + '--' + inttostr(fpd) + '---' + str);
postmessage(fpd,WM_mymgs,Integer(PChar(str)),0);
end;

在DLL就是显示不出来发过来的字符.上面的代码应该是VC的吧

该用户从未签到

发表于 2011-3-30 09:19:16 | 显示全部楼层
你的问题不是消息收不到,它们已经通了,你的问题的怎么传递参数。

所以,什么postmessage,sendMessage都无所谓了。
我不懂Delphi,我觉得你发消息这里没有问题的。
你看一下你的DLL代码吧,那个showmessage('ok!');能弹出来么?
然后调试下看看参数传递过去了没。

然后在说吧。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-28 19:04

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表