0

我修改了我的显示驱动程序以获取从 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' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE' drivers\display\vgaflat

所以这一行: HANDLE m_hCursorThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseEventThread, NULL, 0, NULL); 不工作。得到了一些可能指向非静态方法的指针。我该怎么做?问候

4

2 回答 2

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);
}
于 2013-10-04T13:14:19.770 回答
0

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

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

...

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

请注意,我传递thisCreateThread,这非常重要。将其传递给inCreateThread的参数,该参数用于调用您一直想要调用的方法。thatthread_starterthat

于 2013-10-04T13:17:21.803 回答