7

只是在试验,但我想知道是否有可能使这段代码工作(如编译):

void main() {
    int number = 5;

    DWORD(*dontThreadOnMe)(PVOID) = [](PVOID data) {
        int value = *(int*) data;

        cout << value << endl;
        cout << "This callback executed successsfully" << endl;
    };

    CreateThread(NULL, NULL, dontThreadOnMe, &number, NULL, NULL);
    cin.get();
}

我有一个令人烦恼的怀疑,因为LPTHREAD_START_ROUTINE回调的标准签名是如果没有添加(但语​​法上非法)标签DWORD WINAPI Callback(PVOID),我将无法编译它。说到这里, and (for say ) 属性WINAPI到底是什么?我从来没有真正理解为什么在某些情况下你可以在一个函数上有多个属性。WINAPICALLBACKWndProc

4

3 回答 3

15

实际上这对于 Visual C++ 2012 及更高版本是可能的;引用微软的 C++ 功能支持列表

此外,在 Visual Studio 2012 的 Visual C++ 中,无状态 lambda 可转换为函数指针。...我们已将无状态 lambda 转换为具有任意调用约定的函数指针。当您使用需要诸如 __stdcall 函数指针之类的 API 时,这一点很重要

因此,在 Visual C++ 2012 中,您可以执行以下操作:

unsigned int id;
HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex(0, 0,
    [](void* pData) -> unsigned int {
        // I'm a thread!
        return 0;
    }, pThreadData, 0, &id));

这意味着您还可以将 lambdas 与需要回调函数的其他 API 函数(例如EnumWindows()and之类的东西CreateDialogParam())一起使用。

于 2013-08-21T21:22:56.817 回答
3

您可以使用 auto 让事情变得不那么冗长 :)

auto dontThreadOnMe = [](LPVOID data) -> DWORD {
    int value = *(int*)data;
    std::cout << value << std::endl;
    std::cout << "This callback executed successsfully" << std::endl;
    return 0; //don't forget your return code!
};

int number = 42;
auto thread = CreateThread(nullptr, 0, dontThreadOnMe, &number, 0, nullptr);

或者,对于稍后找到此答案的复制粘贴成瘾者;),这就是您所需要的:

auto work = [](LPVOID data) -> DWORD { return 0; };
int thread_param = 42;
auto thread = CreateThread(nullptr, 0, work, &thread_param, 0, nullptr);
于 2014-07-22T04:17:45.513 回答
2

至少在 Mingw64 的当前*版本中,您可以指定 lambda 函数的调用约定,如下所示[]() WINAPI {}

CreateThread(
    nullptr, // lpThreadAttributes
    0,       // dwStackSize
    [](void *param) WINAPI -> DWORD { // lpStartAddress
        (void) param;
        return 0;
    },
    nullptr, // lpParameter
    0,       // dwCreationFlags
    nullptr  // lpThreadId
);

*) 使用 i686-w64-mingw32-g++-win32 (GCC) 6.3.0 20170516 测试。早期版本也可以工作。

于 2017-08-15T14:06:33.093 回答