c ++修改驱动程序,得到"无法转换重载函数"错误

时间:2013-10-04 13:09:29

标签: c++ windows-ce drivers

我修改我的显示驱动程序以获取从USB端口发送的更新通知。到目前为止一切顺利,但我得到了关注:

    GPEFlat::GPEFlat()
{
    PBOOT_ARGS args;
    ULONG      fbSize;
    ULONG      fbOffset;
    ULONG      offsetX;
    ULONG      offsetY;
    BOOL       bFoundArgs = FALSE;

    BOOL        m_MouseDisabled = TRUE;
    HANDLE      m_hAttachEvent = CreateEvent(NULL, FALSE, FALSE, L"MouseAttached");
    HANDLE      m_hDetachEvent = CreateEvent(NULL, FALSE, FALSE, L"MouseDetached");
    HANDLE      m_hCursorThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseEventThread, NULL, 0, NULL);

DWORD 
GPEFlat::MouseEventThread(void)
{
    DWORD   rc = TRUE;
    HANDLE  handles[2];
    handles[0] = m_hAttachEvent;
    handles[1] = m_hDetachEvent;

产生的错误是:     错误1错误C2440:'type cast':无法从'overloaded-function'转换为'LPTHREAD_START_ROUTINE'drivers \ display \ vgaflat

所以行:HANDLE m_hCursorThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MouseEventThread,NULL,0,NULL); Dosnt工作。得到一些指示,它可能是非静态方法。 我该怎么办? 问候

2 个答案:

答案 0 :(得分:0)

MouseEventThread必须是static函数,因为函数指针与成员函数指针相同。静态方法可以用作普通函数指针,但非静态成员函数不能。

如果需要引用类成员,那么一个非常简单的解决方案是使用静态包装函数,它接受对象的实例(构造函数中的this),然后使用该函数调用实际的成员函数实例指针。

这样的东西
class GPEFlat
{
    // ...

private:
    static DWORD MouseEventThreadWrapper(LPVOID instance)
        { return reinterpret_cast<GPEFlat*>(instance)->MouseEventThread(); }

    // ...
};

使用此包装函数创建线程,将this作为参数传递给它:

GPEFlat::GPEFlat()
{
    // ...

    HANDLE      m_hCursorThread = CreateThread(
        NULL, 0, (LPTHREAD_START_ROUTINE)MouseEventThreadWrapper, this, 0, NULL);
}

答案 1 :(得分:0)

要理解的是,函数(包括静态方法)和非静态方法是不同的东西。 CreateEvent期望一个功能。你必须给它,它不适用于GPEFlat::MouseEventThread,因为这是一种方法。你可以做的是给它一个调用GPEFlat::MouseEventThread的函数。通常这样做就像这样

DWORD WINAPI thread_starter(LPVOID that)
{
    return ((GPEFlat*)that)->MouseEventThread();
}

...

CreateThread(NULL, 0, thread_starter, this, 0, NULL);

请注意,我将this传递给CreateThread,这非常重要。 CreateThread将其传递给that中的thread_starter参数,该参数使用that来调用您想要一直调用的方法。