我修改我的显示驱动程序以获取从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工作。得到一些指示,它可能是非静态方法。 我该怎么办? 问候
答案 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
来调用您想要一直调用的方法。