如题,DLL是一个钩子程序,我要把它加载到一个现有的程序中,在钩子里的回调函数中的实现部分,可以用主程序中的一个函数来实现.所以我想知道怎么在DLL中调用主程序的函数.

解决方案 »

  1.   

    如何导出函数,如何传递函数指针?给几段代码,可以不>>
      

  2.   

    一、使用函数指针传递,就需要在加载DLL成功后,调用DLL内部的函数进行进行了二、消息方式就是发送给目标窗口一个已经注册的消息,让它执行某个函数并传回结果(我认为这种方法比较好,因为它符合现在的编程模式。)
      

  3.   

    在 dll 中应该有一个函数 比如 SetMyCallBackFun(LPVOID lpvoid)
    然后导出这个函数
    在 dll 中 实现 调用这个函数指针就可以了,不过这个函数指针必须是全局或者静态的函数否则如果是一个成员函数则需要 在 ecx把 this 指针 传入
    以上。
    一点儿看法。
      

  4.   

    我提出一种方法,大家看对不:
    主程序内:
    bool fa(){};Dll:
    typedef bool (*PF)();
    PF g_pfa;
    void Init(PF pf){g_pfa = pf;}//该函数为导出函数
    当加载dll时,主程序调用Init(fa);则之后Dll中就可以用g_pfa()来执行了.
      

  5.   

    justin_bkdrong(流浪的云:我们看法一致
      

  6.   

    blackt(blackt) 的方法不行,我试过的
      

  7.   

    AIDI3(艾迪)  你的第二种方法:"消息方式就是发送给目标窗口一个已经注册的消息,让它执行某个函数并传回结果(我认为这种方法比较好,因为它符合现在的编程模式。)"是否自己做过???
    晚上没来没想到有这么多的回贴,谢谢大家啦,我的QQ是:29700048.希望大家加我,帮助我解决这个问题,这几天愁坏我了.
      

  8.   

    自定义消息
    PostMessage
    SendMessage
      

  9.   

    to wangjia184(我就是传说中的SB):
    如果主程序中没有消息循环呢??
      

  10.   

    1、dll需要有个函数指针变量DllFunc
    2、dll需要暴露一个参数为函数指针的、用以设置该函数指针变量的函数SetFunc
    3、exe将自己的函数ExeFunc作为参数调用dll的SetFunc(ExeFunc)函数
    4、dll用ExeFunc指针赋值给DllFunc
    5、dll使用该DllFunc函数
      

  11.   

    to  sinall():如果在dll中的一个普通的函数中这么使用的确可以,但是在一个钩子中的回调函数中这么做就不行了。我现在也遇到的这个问题,搞不懂..............
      

  12.   

    我的消息是WM_TIMER,请问该怎么做,够个简单的代码类的回复,好不好
      

  13.   

    AIDI3(艾迪)  你的第二种方法:"消息方式就是发送给目标窗口一个已经注册的消息,让它执行某个函数并传回结果(我认为这种方法比较好,因为它符合现在的编程模式。)"是否自己做过???这种完全可以,你可以直接编写1. const UINT WM_MYMESSAGE = ::RegisterWindowMessage(_T("MyMessage"));加入到DLL 和消息处理文件中。
     
    2. ON_REGISTERED_MESSAGE(WM_MYMESSAGE , OnMyMsg)//加入到消息处理文件中, 再加入一个消息处理函数OnMyMsg 你就可以了。而在DLL中,你要做的就是LRESULT lResult = ::SendMessage(hWnd, WM_MYMESSAGE, wParam, lParam);其中hWnd 为程序主窗口的句柄,想办法得到它。
      

  14.   

    我需要调用的消息是个WM_TIMER消息.我实现的代码如下
    //全局钩子,DLL中的捕捉POST消息的回调函数
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    { PMSG pmsg = (PMSG)lParam;        switch(pmsg->message)
    {
    case(0x1789):
                            PostMessage(HWND_BROADCAST,WM_TIMER,4,0);
          break;
    case(0x178C):
          PostMessage(HWND_BROADCAST,WM_USER+1001,0,0);
          break;
                       }
        return CallNextHookEx(hkb, nCode, wParam, lParam);}
    现在的问题是PostMessage(HWND_BROADCAST,WM_TIMER,4,0);主程序收到了,并响应了这个消息,但是 PostMessage(HWND_BROADCAST,WM_USER+1001,0,0);却没有响应.
      

  15.   

    回复人: AIDI3(艾迪) ( ) 信誉:98 支持消息这种方式!
      

  16.   

    to------>AIDI3(艾迪)   什么意思啊