使用CreatThread api创建线程后,控制台上的输出包含问号

时间:2012-04-19 17:34:05

标签: c multithreading winapi

大家......我刚刚开始学习如何使用Windows API创建进程和线程。如果我希望线程在屏幕上显示整数但是在使用字符数组时它不起作用我的代码确实有效...有人能告诉我我做错了什么吗?代码:

#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#include<tchar.h>
#include<strsafe.h>
#include<string.h>

#define N 4
#define bufferSize 255

DWORD WINAPI Threader(LPVOID Parameter);

typedef struct Data {
    char value[bufferSize];
} Data, *pToData;

int main()
{
    int i;
    char c[bufferSize];
    pToData threadData[N];
    HANDLE handleArray[N];
    DWORD threadID[N];

    FILE *file=fopen("niti.txt", "r");

    for(i=0; i<N; i++)
    {
        fscanf(file, "%s", c);
        threadData[i] = (pToData) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Data));
        strcpy(threadData[i]->value, c);
        handleArray[i]=CreateThread(NULL, 0, Threader, threadData[i], 0, &threadID[i]);
    }

    WaitForMultipleObjects(N, handleArray, TRUE, INFINITE);

    for(i=0; i<N; i++)
    {
        CloseHandle(handleArray[i]);
        if(threadData[i] != NULL)
        {
            HeapFree(GetProcessHeap(), 0, threadData[i]);
            threadData[i] = NULL;
        }
    }

    fclose(file);

    return 0;
}

DWORD WINAPI Threader(LPVOID Parameter)
{
    HANDLE hStdOut;
    TCHAR messageBuffer[bufferSize];
    size_t cchStringSize;
    DWORD dwChars;
    pToData dataArray;
    char temp[bufferSize];

    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdOut == INVALID_HANDLE_VALUE )
        return 1;

    dataArray=(pToData)Parameter;

    StringCchPrintf(messageBuffer, bufferSize, TEXT("Parameter = %s\n"), dataArray->value); 
    StringCchLength(messageBuffer, bufferSize, &cchStringSize);
    WriteConsole(hStdOut, messageBuffer, (DWORD)cchStringSize, &dwChars, NULL);

    return 0;
}

如果我将结构中的更改为 int 并在 main 中执行相同操作,则输出正确无误。有什么建议? 谢谢!

1 个答案:

答案 0 :(得分:4)

您可能正在编译Unicode但输出char数组。您的症状听起来像编码不匹配,并且Unicode输出函数与ANSI字符数组不匹配是导致许多问号的不匹配。

换句话说,我假设您的代码将StringCchPrintf解析为StringCchPrintfW。然后,当您通过char*时,您通过传递wchar_t*而不是dataArray->value来履行合同。

wchar_t使用TCHARchar代替dataArray->value。或者调用 A 版本的输出函数。或者为ANSI编译。