我正在尝试创建一个线程来处理ZIP归档:

 HANDLE hThread = CreateThread(
        NULL,
        0,
        ZipProcess,
        (LPVOID) cmdline.c_str(),
        0,
        NULL);


我在lpParameter中将命令行参数作为字符串传递。

我不断收到此错误:


  ...类型为'void(MyClass ::)(std :: string){
  (MyClass ::)(std :: basic_string)}'不匹配
  'LPTHREAD_START_ROUTINE {aka long unsigned int()(void)}'|


我已经尝试了几件事-通过引用,writing to a bufferreinterpret_cast等传递,但是错误仍然存​​在。如何解决这个问题?

最佳答案

您正在寻找错误的位置。编译器抱怨第三个参数,线程过程。您的错误看起来像是GCCish,这表明在Error的意义上传入了参数3 ...

要解决此问题,您需要一个实际上与功能需要匹配的功能签名(这是LPTHREAD_START_ROUTINE typedef的扩展版本),即:

DWORD (WINAPI *lpStartAddress)(LPVOID)


您定义的三个问题是:


您的函数不使用WINAPI(A.K.A __stdcall)调用约定。
您的函数具有std::string参数而不是LPVOID(A.K.A. void *)。
您的职能是班级成员。您需要一个静态成员或一个自由函数,以使其不期望使用其他this参数,从而导致签名不匹配。

09-06 03:38