Вот код.
#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 в этом случае?
Прекрасно работает в 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;
}