c++ - 取消IoEx : Function pointer typedef

标签 c++ function pointers typedef cancelio

以下代码是从 MS Async Filter 复制的。假定以下代码正在调用 CancelIo 或 CancelIoEx。无论如何,我看不到在哪里调用了 CancelIoEx。假设 typedef 代表 CancelIoEx 但从未被调用。 bResult = (pfnCancelIoEx)(m_hFile, NULL); 这行到底在做什么?

// Cancel: Cancels pending I/O requests.
HRESULT CFileStream::Cancel()
{
    CAutoLock lock(&m_CritSec);

    // Use CancelIoEx if available, otherwise use CancelIo.

    typedef BOOL (*CANCELIOEXPROC)(HANDLE hFile, LPOVERLAPPED lpOverlapped);

    BOOL bResult = 0;
    CANCELIOEXPROC pfnCancelIoEx = NULL;


    HMODULE hKernel32 = LoadLibrary(L"Kernel32.dll");

    if (hKernel32){

        //propably bad code !!! Take Care.
        bResult = (pfnCancelIoEx)(m_hFile, NULL);

        FreeLibrary(hKernel32);
    }
    else {

        bResult = CancelIo(m_hFile);
    }

    if (!bResult) {

        return HRESULT_FROM_WIN32(GetLastError());
    }
    return S_OK;
}

最佳答案

假设这就是全部代码,它有一个严重的错误。这:

CANCELIOEXPROC pfnCancelIoEx = NULL;

pfnCancelIoEx 定义为指向其签名与 CancelIoEx 的签名相匹配的函数的指针。指针被初始化为空值,明显的意图是稍后将其指向 CancelIoEx

该函数在 Kernel32.dll 中定义,因此加载它是合乎逻辑的下一步。如果成功,代码应该继续这样做:

pfnCancelIoEx = GetProcAddress(hKernel32, "CancelIoEx");

然后它应该检查结果。但是,它不会执行任何一项操作。

接下来,在这一行:

bResult = (pfnCancelIoEx)(m_hFile, NULL);

它尝试调用pfnCancelIoEx 指向的函数。但是,此指针从未从其初始空值更改,因此这将尝试取消引用空指针,从而导致未定义的行为并可能导致崩溃。

关于c++ - 取消IoEx : Function pointer typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109681/

相关文章:

c++ - OpenGL 在给定的空间和相机中创建一个房间

c++ - 交换插入排序

多次调用时 Javascript 函数不起作用

c# - 在不命名类的情况下使用类中的静态函数

c++ - 有没有办法检查指针是否悬空?

c - free() 函数不起作用

使用指针的 C 矩阵乘法

C++ - 为 std::vector<double> 创建新的构造函数?

c++ - 当 C++ 中没有更多的标准输入时,如何让我的程序完成?

php - mysql在php函数中选择*或所需参数