#include "stdafx.h"
#include "redirectdll.h"
#include <windows.h>
#include <winsock2.h>BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
    }
    return TRUE;
}LRESULT CALLBACK HookProc(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam){
MessageBox(NULL,"OK","Redirect",MB_OK);
return CallNextHookEx(hhk, nCode,  wParam, lParam);
}
//HookProc函数是去在这个cpp中定义的,但弄来弄去总是
LINK : warning LNK4089: all references to "USER32.dll" discarded by /OPT:REF,
在其它的exe中调用这个dll时找不到HookProc函数,这是为什么???!!!
who can help me????thank you!!!

解决方案 »

  1.   

    HookProc函数是我在这个CPP中定义的。
      

  2.   

    LINK : warning LNK4089: all references to "USER32.dll" discarded by /OPT:REF,这个不是错误定义改为:
    __declspec( dllexport ) LRESULT CALLBACK HookProc(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam){
    MessageBox(NULL,"OK","Redirect",MB_OK);
    return CallNextHookEx(hhk, nCode,  wParam, lParam);
    }输出函数必须指定 __declspec( dllexport ) ,或者在 .def 文件中指定
      

  3.   

    thank you In355Hz(好象一条狗) !!!!!!!!!!!!!!!!!
      

  4.   

    if you are programming hook ,i think you need not export  HookProc callback function.only export such as "installhook","unhook" function etc..
      

  5.   


    HHOOK hHook=NULL;
    HINSTANCE hDll=NULL;
    HOOKPROC hp=NULL;
    hDll=LoadLibrary("redirectdll.dll");
    hp=(HOOKPROC)GetProcAddress(hDll,"HookProc");//这里hp始终是0,找不到我在redirectdll.dll中定义的HookProc,为什么????
             hHook=SetWindowsHookEx(WH_CALLWNDPROC,hp,hDll,0);
      

  6.   

    why do you use hook in this way?if global hook ,you should call SetwindowsHookEx,not call HookProc.
    search previous hook example.
      

  7.   

    kingzai(studying C#) is right. What you need to do is exporting an ordinary function which calls SetWindowHookEx inside it. You will never need to call  HookProc by yourself,so it's unnecessary to export it.
      

  8.   

    HHOOK hHook=NULL;
    HINSTANCE hDll=NULL;
    HOOKPROC hp=NULL;
    hDll=LoadLibrary("redirectdll.dll");//这里可以正确导入
    hp=(HOOKPROC)GetProcAddress(hDll,"HookProc");//这里hp始终是0,找不到我在redirectdll.dll中定义的HookProc,为什么????
             hHook=SetWindowsHookEx(WH_CALLWNDPROC,hp,hDll,0);我感觉这个思路很对呀?我先在redirectdll.dll中定义一个HOOK过程,再在一个EXE中导入这个redirectdll.dll,找到HookProc函数在入口地址,再用SetWindowsHookEx把HOOK消息和这个HOOK过程联系起来,这个思路有什么不对吗?问题就是#include "stdafx.h"
    #include "redirectdll.h"
    #include <windows.h>
    #include <winsock2.h>
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }
    LRESULT CALLBACK HookProc(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam){
    MessageBox(NULL,"OK","Redirect",MB_OK);
    return CallNextHookEx(hhk, nCode,  wParam, lParam);
    }
    //HookProc函数是去在这个cpp中定义的,但弄来弄去总是
    LINK : warning LNK4089: all references to "USER32.dll" discarded by /OPT:REF,
    在其它的exe中调用这个dll时找不到HookProc函数,这是为什么???!!!
    我没用__declspec( dllexport ) LRESULT CALLBACK HookProc(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam)
      

  9.   

    还有我这个程序是要拦截其它程序对网络访问的数据,因为要patch其它程序进程中的函数汇编代码以获得像热ws2_32.dll中recv()函数的返回值,所以要把HOOK过程放在一个DLL中,这样当其它程序产生HOOK消息并调用LRESULT CALLBACK HookProc时,这个函数是在要拦截的程序的进程中,这样就可以patch这个程序的recv()函数了。
      

  10.   

    你一定要这样做也未尝不可。但是并不是最好的方法。比如说你在HOOKPROC中调用了CallNextHookEx,其中用到了一个hhk参数,这个参数是由SetWindowHookEx导出的如果你在主程序中调用SetWindowsHookEx,那你怎么把返回值传给hhk呢。那你又要增加一个导出变量或者导出函数。你看这样是不是要方便一些:#include "stdafx.h"
    #include "redirectdll.h"
    #include <windows.h>
    #include <winsock2.h>#pragma data_seg("shared")
    HINSTANCE glhInstance=NULL;
    HHOOK hHook=NULL;
    #pragma data_seg()
    #pragma comment(linker,"/section:shared,rws")BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
                            glhInstance=hModule
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }
    LRESULT CALLBACK HookProc(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam)
    {
    MessageBox(NULL,"OK","Redirect",MB_OK);
    return CallNextHookEx(hHook, nCode,  wParam, lParam);
    }__declspec(dllexport) void WINAPI SetHook()  //导出这个函数来安装钩子。
    {     
         hHook=SetWindowsHookEx(WH_CALLWNDPROC,HookProc,glhInstance,0);
    }