Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;修改驱动程序,获得“;无法从重载函数“转换”;错误_C++_Windows Ce_Drivers - Fatal编程技术网

C++ c++;修改驱动程序,获得“;无法从重载函数“转换”;错误

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

Im修改我的显示驱动程序以获取从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:“类型转换”:无法从“重载函数”转换为“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);