2012-04-19 5 views
0

)で構成されています... Windows APIを使用してプロセスとスレッドを作成する方法を学び始めました。スレッドが画面上に整数を表示するようにするにはコードが機能しますが、文字配列を使用するときには機能しません...何か間違っているのか誰かに教えてもらえますか?コード:CreatThread 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型に私の構造体にを変更し、メインで出力を同じことを行う場合は、正しいです。助言がありますか? ありがとうございました!

答えて

4

おそらくUnicode用にコンパイルされていますが、char配列を出力しています。あなたの症状はエンコーディングの不一致のように聞こえ、Unicodeの出力関数はANSIのchar配列に対して誤ってマッチしているため、多くの疑問符が返されます。

つまり、あなたのコードでStringCchPrintfStringCchPrintfWと解決されると仮定します。そして、あなたはdataArray->valueを渡すときwchar_t*ではなくchar*を渡すことによって契約を満たすことができません。

使用wchar_tまたはTCHARの代わりdataArray->valueためchar。または、バージョンの出力機能を呼び出します。または、ANSI用にコンパイルします。

+0

ありがとうございます... __wchar_t__は魅力的でした! __strcpy()__を__wcscpy()に変更しなければならなかった__再び、ありがとう! – zkristic

+0

'_tcscpy'を使って' TCHAR'にマッチさせることができますが、もっと先に進む前にテキストエンコーディングの上に乗る必要があると思います。それは私が恐れていない、ちょっとしたミッシュマッシュなのです。 –

+0

私は本当にテキストエンコーディングの上に乗るべきです...このことは昨日以来私を悩ませていました!件名(エンコードとC/C++での使用法)に関して、それらを調べる価値のあるページへのリンクがありますか?宜しくお願いします! – zkristic

関連する問題