如何从Windows线程函数返回char *

时间:2017-08-02 21:12:56

标签: c windows multithreading winapi

你好这是一个多层次的问题,但基本上我希望我的线程函数返回一个char *,然后我希望能够在线程终止后访问该结果。

目前我在我的线程函数结束时将char *类型转换为DWORD :( openPorts是我的char *)

DWORD openPortsD = (DWORD)openPorts;

然后立即返回openPortsD。但这似乎没有用。

我的线程创建逻辑如下:

for (int j = 0; j < MAX_THREADS; j++)
{
  pDataArray[j] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));

  if(pDataArray[j] == NULL)
  {
      ExitProcess(2);
  }
  pDataArray[j]->ip = ip;

  hThreadArray[j] = CreateThread(NULL, 0, connectPortW,  pDataArray[j], 0, &dwThreadIdArray[j]);

  if (hThreadArray[j] == NULL) 
  {
     ExitProcess(3);
  }
}

在我遍历我的线程后,我等待我的线程,然后释放/关闭它们,如:

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

for(int j = 0; j < MAX_THREADS; j++)
{
  CloseHandle(hThreadArray[j]);
  if(pDataArray[j] != NULL)
  {
    HeapFree(GetProcessHeap(), 0, pDataArray[j]);
    pDataArray[j] = NULL;    // Ensure address is not reused.
  }
}

现在第二部分将是如何获得返回值。我理解我应该使用GetExitCodeThread(),但我不确定如何使用它来运行多个线程。此外,由于返回值将是DWORD,我如何取回原始字符串?

1 个答案:

答案 0 :(得分:1)

您已经将结构传递给线程,最好的解决方案是为其添加一个字段以供线程填充。

typedef struct {
  const char *ip;
  const char *openports;
} MYDATA, *PMYDATA;

DWORD CALLBACK connectPortW(LPVOID ThreadParam)
{
  PMYDATA data = (PMYDATA) ThreadParam;
  data->openports = allocatestringandfillitwithlistofports(data->ip);
  return 0;
}

...

WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
for(int j = 0; j < MAX_THREADS; j++)
{
  CloseHandle(hThreadArray[j]);
  if(pDataArray[j] != NULL)
  {
    parseandfreeports(pDataArray[j]);
    HeapFree(GetProcessHeap(), 0, pDataArray[j]);
    pDataArray[j] = NULL;    // Ensure address is not reused.
  }
}

如果这是一个IP端口列表,那么最好将端口存储在SHORT而不是字符串数组中。

如注释中所述,您可以分配一些内存并将其作为32位应用程序中的线程退出代码返回,但由于64-it指针不适合4字节,因此无法将其移植到64位位。