C ++ 11 лямбда в качестве обратного вызова ReadFileEx

0

Вот код.

#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;
}

Проблема заключается в том, что я не знаю, как разрешить ошибку intellisense.

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

Могу ли я создать лямбда-функцию и использовать ее в качестве функции CALLBACK в этом случае?

  • 0
    Какую версию Visual Studio вы используете? Ваш код не будет работать в VS2010.
  • 0
    Код на самом деле компилируется? Intellisense часто помечает такие вещи, которые прекрасно работают.
Показать ещё 2 комментария
Теги:
callback
c++11
lambda

1 ответ

0
Лучший ответ

Прекрасно работает в 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;
}

SleepEx с параметром TRUE вызывает его бросок. Я не знаю, почему..

Даже это бросает, когда он попадает в 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню