2012-04-19 2 views
0

모두로 구성되어 있습니다 ... 저는 방금 Windows API를 사용하여 프로세스와 스레드를 만드는 방법을 배우기 시작했습니다. 스레드가 화면에 정수를 표시하도록하려면 코드가 작동하지만 char 배열을 사용할 때는 작동하지 않습니다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 코드 :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

아마도 유니 코드로 컴파일되지만 char 배열을 출력 할 것입니다. 증상이 인코딩 불일치처럼 들리고 ANSI char 배열과 일치하지 않는 유니 코드 출력 함수가 불일치로 인해 많은 물음표가 나타납니다.

다른 말로하면, 귀하의 코드가 StringCchPrintfStringCchPrintfW으로 해석한다고 가정합니다. 그리고 dataArray->value을 넘길 때 wchar_t*이 아닌 char*을 전달하여 계약을 이행하지 못합니다.

대신 char 대신 wchar_t 또는 TCHAR을 사용하십시오. 또는 버전의 출력 기능을 호출하십시오. 또는 ANSI 용으로 컴파일하십시오.

+0

감사합니다 ... __wchar_t__는 매력처럼 작동했습니다! 또한 __strcpy() __를 __wcscpy()로 변경해야했습니다 __ 다시 한 번 감사드립니다! – zkristic

+0

'TCHAR'과 일치시키기 위해'_tcscpy'를 사용할 수 있습니다.하지만 훨씬 더 나아 가기 전에 텍스트 인코딩을해야 할 필요가 있다고 생각합니다. 그것은 조금 두려워하지 않는 mish-mash 오른쪽입니다. –

+0

나는 정말로 텍스트 인코딩 맨 ​​위에 있어야한다 ...이 것은 어제부터 나를 괴롭 히고 있었다! 제목 (인코딩 및 C/C++의 사용법)과 관련하여 볼 가치가있는 페이지에 대한 링크가 있습니까? 친애하는! – zkristic

관련 문제