从void(WI​​NAPI *)(...)到LPVOID的无效转换

时间:2017-01-02 23:21:20

标签: c++ qt winapi visual-c++ qt5

我试图在QT中使用此代码[RasDialAsync.c](https://github.com/pauldotknopf/WindowsSDK7-Samples/blob/master/netds/ras/rasdialasync/RasDialAsync.c),我只有一个错误,我无法弄明白。这是什么 ?我怎样才能解决这个问题 ?这是函数头:
我的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 failed\n";
}
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);
                                                                          ^

1 个答案:

答案 0 :(得分:0)

以下评论是我的回答:

  

在技术上,在函数指针和函数之间进行转换是非法的   对象指针。该标准允许它们具有不同的尺寸。对于   无论好坏,WinAPI都需要在很多地方进行演员表演   (我似乎记得也有一些POSIX功能也可以)。   MSVC编译器从不抱怨这样的演员,但你正在使用   海湾合作委员会,似乎想要迂腐。我怀疑那里   可能是一些命令行选项,将使GCC接受它 - 看   为此(我自己不熟悉海湾合作委员会)。 - Igor Tandetnik


  

reinterpret_cast - E4z9

最终的代码是:

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