0

皆さん...WindowsAPIを使用してプロセスとスレッドを作成する方法を学び始めたところです。スレッドが画面に整数を表示したい場合、私のコードは機能しますが、文字の配列を使用すると機能しません...誰かが私が間違っていることを教えてもらえますか?コード:

#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に変更し、メインで同じことを行うと、出力は正しくなります。助言がありますか?ありがとうございました!

4

1 に答える 1

4

おそらくUnicode用にコンパイルしていますが、char配列を出力しています。症状はエンコーディングの不一致のように聞こえます。Unicode出力関数がANSIchar配列と不一致であるのは、多くの疑問符が表示される不一致です。

言い換えれば、私はあなたのコードがとして解決StringCchPrintfされると仮定しますStringCchPrintfW。そして、あなたは、あなたが通過するときchar*ではなく、通過することによって契約を履行することに失敗します。wchar_t*dataArray->value

forの代わりにwchar_tまたはを使用します。または、出力関数のAバージョンを呼び出します。または、ANSI用にコンパイルします。TCHARchardataArray->value

于 2012-04-19T17:49:22.013 に答える