为什么 C++ DLL 中的多线程在构建时会出现错误 C3867?

Why multithreading in c++ DLL get error C3867 when building?

我用的是VS2019

正在尝试调用 DLL 中的线程。 运行 两个可执行文件同时 detach

当我 运行 一个普通的 c++ 程序时,以下线程工作

我收到错误

错误 C3867 'myClass::runexeone':语法不标准;使用“&”创建指向成员 myGateway C:\Users\user\Downloads\Demo\myGateway\myplugin.cpp 21

的指针

插件头文件

#include <windows.h>
#include <iostream>
#include <thread> 


#define MYPLUGIN_EXPORT __declspec(dllexport)

extern "C"
{
    MYPLUGIN_EXPORT void WINAPI OnStart();
}

pluging.cpp

#include "plugin.h"
using namespace std;

class myClass
{
public:
    myClass()
    {

    }
    ~myClass()
    {

    }
    void onStart()
    {
        std::thread(runexeone).detach();
        std::thread(runexetwo).detach();
    }

    void runexeone()
    {
        int exerunpne = system("cmd /C \"%MY_ROOT%\bin\Mytest.exe\" -ORBEndpoint iiop://localhost:12345 -d");
    }


    void runexetwo()
    {
        int exeruntwo = system("cmd /C \"%MY_ROOT%\bin\Mytest_2.exe\" -ORBEndpoint iiop://localhost:12345 -d");
    }

};

myClass& getmyclass()
{
    static myClass myclass;
    return myclass;
}


MYPLUGIN_EXPORT void WINAPI OnStart()
{
    getmyClass().onStart();
}

问题是 runexeone 是成员函数的非限定名称,而 std::thread 需要一些可执行的东西。 runexeone 不是。 VC++ 试图从上下文中猜测你的意思,但这个建议是不够​​的。即使你写了 &myClass::runexeone,它仍然不会起作用,因为 myClass::runexeone 还需要一个 this 指针。您可以通过 static.

来解决后一个问题

当只有一个问题时,编译器建议最有效。

正如 MSalters 已经提到的,您为 std::thread 的仿函数提供了错误的数据类型。如果你不能使方法静态化(你实际上至少可以为你的代码的当前状态,但为了让这不是在此处未说明),你可以这样做

  void onStart()
  {
    std::thread(std::bind(&myClass::runexeone, this)).detach();
  }

但是要小心你的 object/this 的 lifetime/existence!