【问题标题】:c++11 lambda as callback of ReadFileExc++11 lambda 作为 ReadFileEx 的回调
【发布时间】:2014-03-31 07:27:56
【问题描述】:

这里是代码。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    auto f = CreateFile(L"file.txt", GENERIC_READ, FILE_SHARE_READ, nullptr, 
        OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    struct overlapped_buffer
    {
        OVERLAPPED o;
        char b[64];
    };

    overlapped_buffer ob = {};
    ReadFileEx(f, ob.b, sizeof(ob.b), &ob.o, [] (DWORD e, DWORD c, OVERLAPPED * o)
    {
        if( ERROR_SUCCESS == e ) printf("Error");
        else {
           auto ob = reinterpret_cast<overlapped_buffer *>(o);
           printf("> %.*s\n", c, ob->b);
        }
    } );

    SleepEx( 1000, TRUE );
    CloseHandle( f );
    printf("read file");
    return 0;
}

问题是我不知道如何解决智能感知错误。

2   IntelliSense: no suitable conversion function from "lambda []void (DWORD e, DWORD c, OVERLAPPED *o)->void" to "LPOVERLAPPED_COMPLETION_ROUTINE" exists  c:\kombea\portaudiofastplayer\test_lambda\test_lambda.cpp   19  43  test_lambda

在这种情况下,我能否创建一个 lambda 函数并将其用作 CALLBACK 函数?

【问题讨论】:

  • 您使用的是什么版本的 Visual Studio?您的代码将在 VS2010 中 not work
  • 代码真的可以编译吗? Intellisense 经常标记这样构建良好的东西。
  • 否,代码无法编译。编译器崩溃。 “错误 1:错误 C1001:编译器发生内部错误。”
  • 我正在使用 VS2010... 谢谢。不过,这是一个很大的失望。

标签: c++ c++11 callback lambda


【解决方案1】:

在 Mingw 4.8.1 和 VS2013 中运行良好..:

创建了一个名为“file.txt”的文件。向其中添加“Hello World”并保存。然后我运行以下命令并打印“Hello World”。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    auto f = CreateFile("file.txt", GENERIC_READ, FILE_SHARE_READ, nullptr,
                        OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    struct overlapped_buffer
    {
        OVERLAPPED o;
        char b[64];
    };

    overlapped_buffer ob = {};
    ReadFileEx(f, ob.b, sizeof(ob.b), &ob.o, [] (DWORD e, DWORD c, OVERLAPPED * o)
    {
        auto ob = reinterpret_cast<overlapped_buffer*>(o);
        printf("> %.*s\n", c, ob->b);
    });

    SleepEx(1000, TRUE);
    CloseHandle(f);
    return 0;
}

在VS2010中,至少编译如下:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>

int main()
{
    auto f = CreateFile(L"C:/Users/Brandon/Desktop/file.txt", GENERIC_READ, FILE_SHARE_READ, nullptr,
                        OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    struct overlapped_buffer
    {
        OVERLAPPED o;
        char b[64];
    };

    overlapped_buffer ob = {};

    ReadFileEx(f, ob.b, sizeof(ob.b), &ob.o, (LPOVERLAPPED_COMPLETION_ROUTINE) &[&] (DWORD e, DWORD c, OVERLAPPED* o)
    {
        std::cout<<"HERE\n"<<std::endl; //not being called.. already tried std::function..
    });

    //SleepEx(1000, TRUE);
    SleepEx(1000, false);
    CloseHandle(f);
    std::cin.get();
    return 0;
}

参数为 TRUE 的 SleepEx 导致它抛出......我不知道为什么......

即使当它遇到 SleepEx 时也会抛出异常,但是上面和下面的代码都将“Hello World”存储在重叠的缓冲区中..

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>

int main()
{
    auto f = CreateFile(L"file.txt", GENERIC_READ, FILE_SHARE_READ, nullptr,
                        OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
    struct overlapped_buffer
    {
        OVERLAPPED o;
        char b[64];
    };

    overlapped_buffer ob = {};

    struct cb
    {
        static void callback(DWORD e, DWORD c, OVERLAPPED* o)
        {
            auto ptr = reinterpret_cast<overlapped_buffer*>(o);
            std::cout<<ptr->b<<"\n";
        }
    };

    ReadFileEx(f, ob.b, sizeof(ob.b), &ob.o, (LPOVERLAPPED_COMPLETION_ROUTINE) cb::callback);

    SleepEx(1000, TRUE);
    CloseHandle(f);
    std::cin.get();
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多