【问题标题】:invalid cast from void(WINAPI*)(...) to LPVOID从 void(WINAPI*)(...) 到 LPVOID 的无效转换
【发布时间】:2017-01-02 23:21:19
【问题描述】:

我正在尝试在 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);
                                                                          ^

【问题讨论】:

  • static_cast(&RasDialFunc)
  • @IInspectable 我猜是this one
  • 从技术上讲,在函数指针和对象指针之间进行强制转换是非法的。该标准允许它们具有不同的尺寸。无论好坏,WinAPI 在很多地方都需要这样的转换(我似乎记得也有一些 POSIX 函数这样做)。 MSVC 编译器从来没有抱怨过这样的演员阵容,但你使用的是 GCC,这似乎想学究气。我怀疑可能有一些命令行选项会让 GCC 接受它 - 寻找它(我自己不熟悉 GCC)。
  • 嗯,错误信息提示-fpermissive 命令行选项。你试过吗?就像我说的,我对 GCC 知之甚少,除了它存在这一事实。
  • reinterpret_cast 怎么样?

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


【解决方案1】:

以下评论是我的回答:

从技术上讲,在函数指针和 对象指针。该标准允许它们具有不同的尺寸。为了 无论好坏,WinAPI 在很多地方都需要这样的演员表 (我似乎还记得有一些 POSIX 函数也可以)。 MSVC 编译器从未抱怨过这样的演员阵容,但你正在使用 GCC,它似乎想对此迂腐。我怀疑有 可能是一些让 GCC 接受它的命令行选项 - 看 为此(我自己不熟悉 GCC)。 – Igor Tandetnik


reinterpret_cast - E4z9

最后的代码是:

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

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多