为什么 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!
我用的是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!