自己写的一个DLL,叫HookDll。然后在ViewDesktop程序中调用它。
首先在ViewDesktop的cpp文件中声明了:
_declspec(dllimport)  void SetHook();
然后调用了DLl里面的函数:SetHook();然后在 工程--设置---连接 里面设定了导入库文件:D:\HookDll\Debug\HookDll.lib 
(HookDll.dll跟HookDll.lib已经被复制到了D:\HookDll\Debug文件目录下面)出现LINK2001错误如下:
ViewDesktopDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl SetHook(void)" (__imp_?SetHook@@YAXXZ)
Debug/ViewDesktop.exe : fatal error LNK1120: 1 unresolved externals下面是DLL文件内容:
HookDll.cpp内容
//#include <windows.h>
#include   <afxwin.h>HHOOK g_hMouse=NULL;//用来保存钩子句柄
 
//在应用程序处理之后调用钩子。
CFile log_file=CFile("C:\\tangaowen.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
//钩子函数
LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//在lParam里面检查所收到的消息。
    CTime time=CTime::GetCurrentTime ();
CString string_time; string_time.Format ("%d年%d月%d日%d时%d分%d秒:",time.GetYear (),time.GetMonth (),time.GetDay (),time.GetHour (),time.GetMinute (),time.GetSecond ());
    log_file.Write (string_time,string_time.GetLength ());//向日志文件中写入事件发生的时间

DWORD PID=0;//用来保存进程ID
HANDLE handle;//用来保存进程句柄
LPTSTR  temp[50];//用来保存路径    LPMSG msg=(LPMSG)lParam;
    GetWindowThreadProcessId(msg->hwnd,&PID);//由消息里面接收消息的窗口句柄得到进程ID。
handle=OpenProcess(PROCESS_QUERY_INFORMATION,false,PID);//获得进程句柄,并且赋予进程PROCESS_QUERY_INFORMATION的access right.

if(msg->message==WM_LBUTTONDBLCLK)//如果是鼠标双击消息。
{// GetProcessImageFileName(handle,temp,100);
        return  CallNextHookEx(g_hMouse,nCode,wParam,lParam);
}
    return  CallNextHookEx(g_hMouse,nCode,wParam,lParam);
}
          //安装钩子过程的函数
void SetHook()
{
g_hMouse=SetWindowsHookEx(WH_CALLWNDPROCRET,CallWndRetProc,GetModuleHandle("HookDll"),0);}下面是HookDll.def文件内容:
LIBRARY HookDll
EXPORT 
SetHook  @1下面是ViewDesktop中对SetHook()函数的调用:
BOOL CViewDesktopDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here SetHook(); //DLL中函数在这里被调用

return TRUE;  // return TRUE  unless you set the focus to a control
}请前辈们看看是什么原因呢???在线等,急!万分感谢。

解决方案 »

  1.   

    导入库文件没设置对,再看项目设置。
    你也可以用#pragma comment(lib, "D:\HookDll\Debug\HookDll.lib")这种方式来导入。
      

  2.   

     我是按照书上说明的例子来设置的啊,那么应该怎么设置呢?如果是按照
    #pragma comment(lib, "D:\HookDll\Debug\HookDll.lib")来设置,我放在*.cpp下面,运行还是出现错误?
    另应该是#pragma comment(lib, "D:\\HookDll\\Debug\\HookDll.lib")吧,如果不加\\,会提示不能找到
    D:HookDllDebugHookDll.lib
      

  3.   

    究竟是编译出错还是运行出错?
    加上下面这行后出什么错?
    #pragma comment(lib, "D:\\HookDll\\Debug\\HookDll.lib")
      

  4.   

    编译没错,连接有错。ViewDesktopDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl SetHook(void)" (__imp_?SetHook@@YAXXZ)
    Debug/ViewDesktop.exe : fatal error LNK1120: 1 unresolved externals 
      

  5.   

    Dll的cpp中,把void SetHook()
    改成
    __declspec(dllexport) void SetHook(void)
      

  6.   

    改了,编译链接都没有错误,但是运行的时候出现对话框:“无法定位程序输入点,setHook位于HooKDll.dll动态链接库中”的提示。
      

  7.   

    你把DLL和EXE都重新生成,然后把DLL与EXE文件放在同一目录下执行。
      

  8.   

    呵呵,忘了将新的 DLL复制过去,可以执行了,但是运行的时候就自己关闭了,这个问题算是解决了,谢谢大牛!!!