本人最近学习Hook技术,照着http://www.vccode.net/forum_view.asp?forum_id=16&view_id=2216中的例子写了一个全局的鼠标钩子程序,不过例子好象是在VC6.0下写的,而我是在.NET2005下照着做的,编译是通过了,但是链接时总是出现错误,如下MouseHooker.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall Cmousehook::~Cmousehook(void)" (__imp_??1Cmousehook@@UAE@XZ),该符号在函数 "public: virtual __thiscall CMouseHookerDlg::~CMouseHookerDlg(void)" (??1CMouseHookerDlg@@UAE@XZ) 中被引用
MouseHookerDlg.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall Cmousehook::~Cmousehook(void)" (__imp_??1Cmousehook@@UAE@XZ)
MouseHookerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall Cmousehook::Cmousehook(void)" (__imp_??0Cmousehook@@QAE@XZ),该符号在函数 "public: __thiscall CMouseHookerDlg::CMouseHookerDlg(class CWnd *)" (??0CMouseHookerDlg@@QAE@PAVCWnd@@@Z) 中被引用
MouseHookerDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall Cmousehook::starthook(struct HWND__ *)" (__imp_?starthook@Cmousehook@@QAEHPAUHWND__@@@Z),该符号在函数 "protected: virtual int __thiscall CMouseHookerDlg::OnInitDialog(void)" (?OnInitDialog@CMouseHookerDlg@@MAEHXZ) 中被引用
E:\My projects\Visual Studio Projects\MouseHooker\Debug\MouseHooker.exe : fatal error LNK1120: 3 个无法解析的外部命令这是怎么回事,是不是在2005中HOOK的开发有变???急~~~~~请达人给予诊治,十分感谢!!!

解决方案 »

  1.   

    在你的工程设置里面 的link项里加入dll的.lib文件就可以了
      

  2.   

    to  zt9788(zt)
      我在项目属性里没有找到你说的LINK项啊,我用的是.NET2005中文版,那项对应的中文名称是什么?连接器这一项里面有个子项"输入",里面有个"延迟加载的DLL",是不是这一项啊
      

  3.   

    to  huangwc(地主)
        使用你的方法问题解决了,谢谢
      

  4.   

    但是现在还是有些问题,使用全局钩子时是生成DLL来调用的,但是我还写了一个线程钩子,就写在调用程序中,怎么还是出现三个类似错误 error LNK2001: 无法解析的外部符号下面是我的部分源码:
    ------------------------GlobalV.h------------------------------
    #include <windows.h>
    #include "string.h"
    #include "stdio.h" HHOOK hHook;//鼠标钩子句柄 
    CPoint point;//鼠标位置信息 
    CChildView *pView; // 鼠标钩子函数用到的输出窗口指针 //全局函数
    LRESULT CALLBACK MouseProc (int nCode, WPARAM wParam, LPARAM lParam)
    {//是鼠标移动消息 
    if(wParam == WM_MOUSEMOVE || wParam == WM_NCMOUSEMOVE) 

    point=((MOUSEHOOKSTRUCT*)lParam)->pt; //取鼠标信息 
    pView->Invalidate(); //窗口重画 

    return CallNextHookEx(hHook,nCode,wParam,lParam); //传递钩子信息 

    ----------------------------------------------------------------------------------ChildView.cpp----------------------#include "stdafx.h"
    #include "MouseHook.h"
    #include "ChildView.h"
    #include "GlobalV.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif// CChildViewCChildView::CChildView()
    {
    pView=this;//获得输出窗口指针 
    hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,0,GetCurrentThreadId()); 
    }CChildView::~CChildView()
    {
    if(hHook) 
    UnhookWindowsHookEx(hHook); 
    }BEGIN_MESSAGE_MAP(CChildView, CWnd)
    ON_WM_PAINT()
    END_MESSAGE_MAP()// CChildView 消息处理程序BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
    {
    if (!CWnd::PreCreateWindow(cs))
    return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE;
    cs.style &= ~WS_BORDER;
    cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
    ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL); return TRUE;
    }void CChildView::OnPaint() 
    {
    CPaintDC dc(this); // 用于绘制的设备上下文

    char str[256]; 
    sprintf(str,"x=%d,y=%d",point.x,point.y); //构造字符串 
    dc.TextOut(0,0,(CString)str); //显示字符串 

    // 不要为绘制消息而调用 CWnd::OnPaint()
    }------------------------------------------------------------------------
    报错如下:
    ChildView.obj : error LNK2001: 无法解析的外部符号 "struct HHOOK__ * hHook" (?hHook@@3PAUHHOOK__@@A)
    ChildView.obj : error LNK2001: 无法解析的外部符号 "class CChildView * pView" (?pView@@3PAVCChildView@@A)
    ChildView.obj : error LNK2001: 无法解析的外部符号 "class CPoint point" (?point@@3VCPoint@@A)
      

  5.   

    你没有导出你的函数名(类名)   在编译的时候   采用默认的C++的编译方法的话  编译器为为每一个函数添加一个附加值  所有它的真实的函数名(类名)并不是你自己定义那个(可以用CMD->DUMPBIN  或 DEPENDS查看到)  所有你要导出你的正确的文件名
    具体两种方式:
    _declspecl(dellexport) 

    定义一个.def文件  加入工程
    具体办法楼主找找资料