【求助】SetWindowsHookEx返回为NULL,使用GetLastError得到结果87,不知道错在哪里

最近看windows钩子,但是自己按照别人的帖子写,总是不成功,求助各位大佬,看看是为什么。
使用的是VS 2017,系统环境是WIN10

//plugin.dll中的部分代码
LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    if ((wParam == VK_HOME) && (lParam&(1 << 31)) == 0)
    {
        MessageBox(NULL, L"alert", L"你好,test", MB_OKCANCEL);
        if (dlgForm == NULL) {
            dlgForm = new CPwin;
            dlgForm->Create(IDD_DLG_MAIN);
        }
        dlgForm->ShowWindow(SW_SHOW);
    }
    return CallNextHookEx(0, code, wParam, lParam);
}
HHOOK __stdcall SetKeyBoardHook(DWORD dwThreadId)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    HMODULE hPlugin = GetModuleHandle(L"plugin.dll");//项目生成的是plugin.dll
    //可以跟踪到这里,hPlugin指针正常
    //返回钩子指针一直是NULL
    KeyBoardHookId = SetWindowsHookEx(WH_KEYBOARD, &KeyBoardProc, hPlugin, dwThreadId);
    //获取到错误为87
    DWORD re = GetLastError();
    return KeyBoardHookId;
}

//主程序代码相关代码

using namespace std;
list<HWND> m_hwndFind = list<HWND>();
map<HWND, HHOOK> m_hwndHooked = map<HWND, HHOOK>();

void CHookTestDlg::OnBnClickedBtnStart()
{
    // TODO: 在此添加控件通知处理程序代码
    m_hwndFind.clear();
    list<HWND>().swap(m_hwndFind);

    EnumWindows(CHookTestDlg::EnumWindowsProc, NULL);
    list<HWND>::iterator itor;
    for (itor = m_hwndFind.begin(); itor != m_hwndFind.end(); itor++) {
        if (m_hwndHooked.count(*itor) == 0) {
            char cTitle[129] = { 0 };
            GetWindowTextA(*itor, cTitle, 128);
            //GetClassNameA(*itor, cTitle, 128);
            if (strcmp(cTitle, "计算器") == 0) {
                DWORD dwProcId;
                GetWindowThreadProcessId(*itor, &dwProcId);
                HHOOK hook = (HHOOK)SetKeyBoardHook(dwProcId);
                m_hwndHooked[*itor] = hook;
            }
        }
    }
}

BOOL CHookTestDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    if (::GetWindowLong(hWnd, GWL_STYLE)&WS_VISIBLE)
    {
        m_hwndFind.push_back(hWnd);
        EnumChildWindows(hWnd, CHookTestDlg::EnumWindowsProc, NULL);
    }
    return TRUE;
}

解决了嘛?