从 void(WINAPI*)(..) 到 LPVOID 的强制转换无效

invalid cast from void(WINAPI*)(...) to LPVOID

本文关键字:转换 无效 void WINAPI LPVOID      更新时间:2023-10-16

我正在尝试在QT中使用此代码[RasDialAsync.c](https://github.com/pauldotknopf/WindowsSDK7-Samples/blob/master/netds/ras/rasdialasync/RasDialAsync.c),我只有一个错误无法弄清楚。 这是什么? 我该如何解决这个问题? 这是函数头:
My RasDialFunc 函数 :

void WINAPI RasDialFunc(UINT unMsg,
                    RASCONNSTATE rasconnstate,
                    DWORD dwError )


这是我代码的一部分:

LPRASDIALPARAMS lpRasDialParams = NULL;   // Structure to store the RasDial parameters
HRASCONN        hRasConn = NULL;          // Handle to RAS connection
DWORD           nRet = 0;                 // Return value from a function
lpRasDialParams = (LPRASDIALPARAMS) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RASDIALPARAMS));
if (NULL == lpRasDialParams)
{
    qDebug() << "HeapAlloc failedn";
}
lpRasDialParams->dwSize =sizeof(RASDIALPARAMS);
StringCchCopy(lpRasDialParams->szEntryName, CELEMS(lpRasDialParams->szEntryName), rasConn);
StringCchCopy(lpRasDialParams->szUserName, CELEMS(lpRasDialParams->szUserName), username);
StringCchCopy(lpRasDialParams->szPassword, CELEMS(lpRasDialParams->szPassword), password);
hRasConn = NULL;
nRet = RasDial(NULL, NULL, lpRasDialParams, 0,&RasDialFunc, &hRasConn);
if (nRet != 0)


这是错误

main.cpp:202: error: invalid conversion from 'void (__attribute__((__stdcall__)) *)(UINT, tagRASCONNSTATE, DWORD) {aka void (__attribute__((__stdcall__)) *)(unsigned int, tagRASCONNSTATE, long unsigned int)}' to 'LPVOID {aka void*}' [-fpermissive]
     nRet = RasDial(NULL, NULL, lpRasDialParams, 0,&RasDialFunc, &hRasConn);
                                                                          ^

以下这些评论是我的答案:

从技术上讲,在函数指针和 对象指针。该标准允许它们具有不同的尺寸。为 无论好坏,WinAPI 都需要在许多地方进行这样的转换 (我似乎记得也有一些POSIX函数可以)。 MSVC编译器从未抱怨过这样的转换,但是您正在使用 海湾合作委员会,它似乎想对此迂腐。我怀疑有 可能是一些命令行选项,可以让 GCC 接受它 - 看 为此(我本人不熟悉海湾合作委员会)。– 伊戈尔·坦德特尼克


reinterpret_cast - E4z9

最终代码是:

    nRet = RasDial(NULL, NULL, lpRasDialParams, 0,reinterpret_cast<void*>(&RasDialFunc) , &hRasConn);