会思考的树 发表于 2011-3-30 09:16:56

辅助中的DLL通信的问题!

首先说一下我的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中都定义一个消息:#define WM_AUTOMOVE            WM_USER+101
EXE中发送消息:
void CLoaderDlg::OnBtnMoveto()
{
    UpdateData();
    ::SendMessage(m_hCHWnd,WM_AUTOMOVE,m_ItemX,m_ItemY);
}
DLL中的回调时这样写的:
LRESULT    CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    try
    {
      if (nCode == HC_ACTION)
      {
            switch(((PCWPSTRUCT)lParam)->message)
            {
            case WM_AUTOMOVE:
                  OutToHookLog("移动到坐标: %d,%d",((PCWPSTRUCT)lParam)->wParam, ((PCWPSTRUCT)lParam)->lParam);
                  PGAME_ITEMPOS    pstItemPos = new GAME_ITEMPOS;
                  RtlZeroMemory(pstItemPos, sizeof(GAME_ITEMPOS));
                  pstItemPos->x = (float)((PCWPSTRUCT)lParam)->wParam;
                  pstItemPos->y = (float)((PCWPSTRUCT)lParam)->lParam;
                  CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AutoPath, pstItemPos, 0, NULL);

                break;
            }

            bStartHook = TRUE;
      }
    }
    catch (...)
    {
      OutToHookLog("catch error...");
    }

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

gggxxx 发表于 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的吧

zhangjian950617 发表于 2011-3-30 09:19:16

你的问题不是消息收不到,它们已经通了,你的问题的怎么传递参数。

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

然后在说吧。
页: [1]
查看完整版本: 辅助中的DLL通信的问题!