从'DWORD(*)(void *)'到'DWORD(*)(void *)'的无效转换

时间:2010-12-20 17:06:02

标签: c++ multithreading

invalid conversion from 'DWORD (*)(void*)' to 'DWORD (*)(void*)'。 蛋糕==谎言 1 == 0

我不知道这意味着什么......我在这段代码中得到了它

HANDLE CPlugin::CreateWinampThread()    ||
{                                  __VVVVVVVV__
    hWinampThreadHandle = (HANDLE)CreateThread(NULL, 0, StartWinampThread, (void*)this, 0, &dwWinampThreadID);
    if (!hWinampThreadHandle)
        return 0;

     CloseHandle(hWinampThreadHandle);
     return hWinampThreadHandle;
}

.

DWORD  WINAPI CPlugin::StartWinampThread(void* lpParam)[...]

3 个答案:

答案 0 :(得分:5)

如果StartWinampThread是成员函数,则它必须是静态的。

答案 1 :(得分:2)

请参阅此处:in-c-is-it-safe-portable-to-use-static-member-function-pointer-for-c-api-callb了解为什么需要使用extern“C”

正确的方法是这样的:

HANDLE CPlugin::CreateWinampThread()    ||
{                                  __VVVVVVVV__
    hWinampThreadHandle = (HANDLE)CreateThread(NULL, 0, ::StartWinampThread, (void*)this, 0, &dwWinampThreadID);
    if (!hWinampThreadHandle)
        return 0;

     CloseHandle(hWinampThreadHandle);
     return hWinampThreadHandle;
}

.

// A callback function for C code must have C linkage.
// That is not possable for C++ static member functions.
extern "C" DWORD  WINAPI StartWinampThread(void* lpParam)
{
    // You can always call your static member function here.
    CPlugin::StartWinampThread(lpParam)
}

答案 2 :(得分:0)

是否与对象有关 - 对象的StartWinampThread方法有一个隐含的'this'参数,因为它是一个类的成员。

如果您将其更改为独立方法但保持相同的签名(即

)会发生什么情况
DWORD  WINAPI CPlugin::StartWinampThread(void* lpParam)[...]

要     DWORD WINAPI StartWinampThread(void * lpParam)[...]

(我知道这对你不起作用,我只是想知道它是否删除了编译器的抱怨)