C++ c++;修改驱动程序,获得“;无法从重载函数“转换”;错误
Im修改我的显示驱动程序以获取从USB端口发送的更新通知。到目前为止还算不错,但我有以下存货:C++ c++;修改驱动程序,获得“;无法从重载函数“转换”;错误,c++,windows-ce,drivers,C++,Windows Ce,Drivers,Im修改我的显示驱动程序以获取从USB端口发送的更新通知。到目前为止还算不错,但我有以下存货: GPEFlat::GPEFlat() { PBOOT_ARGS args; ULONG fbSize; ULONG fbOffset; ULONG offsetX; ULONG offsetY; BOOL bFoundArgs = FALSE; BOOL m_MouseD
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:“类型转换”:无法从“重载函数”转换为“LPTHREAD\u START\u例程”驱动程序\display\vgaflat
所以这行代码是:HANDLE m_hCursorThread=CreateThread(NULL,0,(LPTHREAD_START_例程)MouseEventThread,NULL,0,NULL);
不起作用。得到一些指向非静态方法的指针。
我该怎么做?
问候语由于函数指针与成员函数指针不同,因此
MouseEventThread
必须是一个静态
函数。静态方法可以用作普通函数指针,但非静态成员函数不能
如果需要引用类成员,那么一个非常简单的解决方案是使用静态包装函数,它获取对象的实例(构造函数中的this
),然后使用该实例指针调用实际的成员函数
差不多
class GPEFlat
{
// ...
private:
static DWORD MouseEventThreadWrapper(LPVOID instance)
{ return reinterpret_cast<GPEFlat*>(instance)->MouseEventThread(); }
// ...
};
需要理解的是函数(包括静态方法)和非静态方法是不同的<代码>创建事件需要一个函数。您必须这样做,它不能与
GPEFlat::MouseEventThread
一起工作,因为这是一个方法。不过,您可以给它一个调用GPEFlat::MouseEventThread
的函数。通常是这样做的
DWORD WINAPI thread_starter(LPVOID that)
{
return ((GPEFlat*)that)->MouseEventThread();
}
...
CreateThread(NULL, 0, thread_starter, this, 0, NULL);
请注意,我将
这个
传递给创建线程
,这非常重要CreateThread
将其传递给thread\u starter
中的参数that
,该参数使用that
调用您一直想要调用的方法。感谢您的快速回复。但是,您能否更详细地说明如何做到这一点?我将用您的手柄m_hcursorThread替换出现问题的线路。。。。我该如何继续?代码typedef,我应该在哪里写呢?我这样写:DWORD MouseEventThreadWrapper//HANDLE m_hCursorThread=CreateThread(NULL,0,(LPTHREAD_START_例程)((MyMethodType)MouseEventThread),NULL,0,NULL);handlem_hCursorThread=CreateThread(NULL,0,(LPTHREAD_START_例程)mouseeventtThreadWrapper,this,0,NULL);然后我会得到一个错误,如果我没有声明MouseEvent,我会得到一个错误。如果我声明我得到“无对象文件”generated@user2605871现在将MouseEventThreadWrapper
声明为构造函数中的局部变量。再看看我的答案,我在类中将其声明为静态方法。当我尝试此操作时,我得到错误:“thread_starter”:未声明的标识符指向CreaThread。。。重新定义;之前的定义是一个未知的标识符-指向DWORD WINAPI..@user2605871 thread_starter是一个函数,您应该像其他函数一样对其进行原型化。将DWORD WINAPI线程放入启动器(LPVOID)代码>位于代码顶部附近。谢谢,现在没有错误。我想我必须把它全部建起来,看看它是如何工作的!
DWORD WINAPI thread_starter(LPVOID that)
{
return ((GPEFlat*)that)->MouseEventThread();
}
...
CreateThread(NULL, 0, thread_starter, this, 0, NULL);