(天热,请大家帮忙看完) 代码不长,不多说了,直接看:下面这个是Hook.cpp文件的代码,最后生成Hook.dll文件的#include <windows.h>HHOOK g_hMouse;
HINSTANCE g_hInst;BOOL WINAPI DllMain( HINSTANCE  hModule,DWORD  dwReason,LPVOID  lpvReserved )
{
    g_hInst=hModule; //dll被加载时会传递一个该模块的句柄hModule
}LRESULT CALLBACK MouseProc(   //鼠标钩子过程
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
    return 1;  //返回非0值表示已经处理,无须向下传递了。
}void SetHook()
{
    g_hMouse = ::SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);//最后个参数0表示此钩子过程与运行在同一桌面下的所有线程相关了,即全局钩子。
}接下来是模板定义文件Hook.def的内容,用于在dll中导出函数LIBRARY "Hook"EXPORTS
SetHook接着生成了Hook.dll,就开始调用了。下面是HookTestDlg.cpp中调用dll函数的代码:#include "stdafx.h"
#include "HookTest.h"
#include "HookTestDlg.h"#pragma comment(lib, "..\\Release\\Hook.lib")   //链接引入库文件#ifdef _DEBUG
#define new DEBUG_NEW
#endif......_declspec(dllimport) void SetHook();  //函数声明,_declspec(dllimport)表示来自外部dll文件BOOL CHookTestDlg::OnInitDialog()
{
CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE); // TODO: 在此添加额外的初始化代码         SetHook();  //调用dll中的函数。 编译没问题, 为什么运行到这里就失败了呢?弹出一个框,提示:应用程序初始化(0xc0000142)失败。 return TRUE; 
}
问题就在SetHook();那行。不知道什么原因,请高手释疑,谢谢。

解决方案 »

  1.   

    VS2008下编写的
    有VS08的朋友可以帮测试下   很短的代码
      

  2.   

    .dll或者.lib的位置绝对不会错的
      郁闷ing
      

  3.   


    不要这么绝对吧,我看一定是.dll位置错了
      

  4.   

    你可以把exe和dll一起调试的啊
      

  5.   

    应该是dll文件位置不对,你不会放也release下了吧。
      

  6.   

    你的DLL放到了调用程序同一个目录中去了吗
      

  7.   

    呵呵 DLL放在工程目录下!!你仔细看下!!
      

  8.   

    不是Dll位置的问题吧~
     我将Dll放到Release目录和当前目录下都试过了  还是那个问题耶
      

  9.   

    运行的时候dll需要和你的exe同一个目录的
      

  10.   


    是的  I'm sure.各位看看  我代码没什么问题吧?~
      

  11.   

    DLL的位置放错时,编译链接不会出错,如果LIB文件放错了位置,编译链接才会出错,你的EXE文件和DLL文件一定要放在一起
      

  12.   

    首先确定一下是exe的问题,还是dll问题(将SetHook注释掉)
    其次若正常将SetHook()置为空函数()
    若仍会出现上述问题, 可能dll加载有问题, 尝试一下动态链接(Loadlibrary)
    若正常将SetWindowsHookEx换成别的API试试,
      

  13.   

    你确定你生成了Hook.lib文件了么   我记得有一次我找半天DLL没生成这个文件
    你可以动态载入试试,这样容易观察哪步出错
      

  14.   


    你没生成.lib   是因为你没写模板定义文件 
    我是写的,所以生成dll同时 有.lib文件
      

  15.   


    你这个办法  我很赞同  我也试过1.不是exe问题,这个Test只是雕了下dll函数,别的什么都没做2.将Test程序中的SetHook()注释掉,没有任何问题3.SetHook()函数体中什么都不写,也没问题,写个MessageBox也没问题4.用Loadlibrary动态加载dll,也出现这个问题5.SetWindowsHookEx的问题?  不是吧?  我按书上来的. 视频上用的VC6.0演示的  也没问题
      

  16.   

    纠正一下上面的3
    .SetHook()函数体中什么都不写,也是有这个问题的,写个MessageBox也有问题
      

  17.   

    在你的dll函数的定义前加一个修饰符试一下extern "C" _declspec(dllimport) void SetHook();  //函数声明,_declspec(dllimport)表示来自外部dll文件你这个问题应该是找不到函数入口的
      

  18.   

    谢谢楼上的朋友,不是extern "C"的问题经过我研究发现:   我将DllMain函数去掉就没问题了奇怪啊奇怪...   何解???
      

  19.   

    即使DllMain函数中什么代码都不写,也还是不行
    必须去掉DllMain函数方可终于有些眉目,但不知何解???
      

  20.   


    你建的是MFC的dll工程吗?这工程自带了DllMain
      

  21.   

    dll工程是Win32的空工程Test工程是MFC的
      

  22.   

    建议 g_hInst 用 Loadlibrary 获取
      

  23.   

    谢谢所有路过这里帮我看代码的朋友  谢谢你们
     
    我找到问题所在了,现告诉大家:注意看我的DllMain函数,是不是少了个return语句啊~   哈哈一个小疏漏居然折腾到现在,要命的是这个错误VS居然编译不报出来汗呐~那个书上也没有return  再汗各位引以为戒啊~  别像我这么粗心谢谢各位  100分散给全部
      

  24.   

    Hook.h
    怎么写的?g_hMouse = ::SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,g_hInst,0);
      

  25.   


    只是个全局钩子的小测试程序,没写Hook.h  就一个Hook.cpp
      

  26.   

    __declspec(dllexport) void SetHook()
    {}