2013-03-20 122 views
1

我想寫入一個隨機輸出,其中STD_OUTPUT_FILE可以。我想使用 WriteFile,但它似乎沒有寫任何東西。WriteFile標準輸出失敗

HANDLE outH = GetStdHandle (STD_OUTPUT_HANDLE); 
WriteFile(outH,param, strlen (param), &written_b, NULL); 
+2

您的過程是否有控制檯? – 2013-03-20 22:00:46

+0

你能展示參數的構造嗎?檢查WriteFile()和GetLastError()的結果。 – hmjd 2013-03-20 22:02:56

+0

param是好的。我檢查了它。 – coredump 2013-03-20 22:03:24

回答

0

我解決了它。

重定向標準輸出時發生錯誤,在該輸出應該讓它保持原樣時,它會發生錯誤。還不知道。我會更新我的答案。

0

您的代碼缺少任何形式的錯誤檢查。這是從網站複製的代碼或Stack Overflow答案的常見情況,爲了清晰和簡潔,常常省略錯誤檢查。但是,無論您自己編寫代碼,您都必須假定它可能會失敗並編寫代碼來處理這種情況。在這裏,你知道它失敗了,你還沒有回去添加錯誤檢查代碼來查看發生故障的位置。

讓我們添加錯誤檢查現在的代碼,指的是SDK文檔在必要的時候看到了API函數,你怎麼稱呼處理錯誤情況:現在

static void ReportError(const TCHAR* errorMsg) 
{ 
    MessageBox(NULL, errorMsg, NULL, MB_OK | MB_ICONERROR); 
} 

int _tmain(int argc, TCHAR* argv[]) 
{ 
    char param[] = "This is some output."; 
    DWORD written_b; 

    HANDLE outH = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (!outH) 
    { 
     ReportError(TEXT("No standard handles associated with this app.")); 
    } 
    else if (outH == INVALID_HANDLE_VALUE) 
    { 
     TCHAR errMsg[100]; 
     wsprintf(errMsg, TEXT("GetStdHandle() failed with error code %lu"), GetLastError()); 
     ReportError(errMsg); 
    } 
    else 
    { 
     if (!WriteFile(outH, param, strlen(param), &written_b, NULL)) 
     { 
     TCHAR errMsg[100]; 
     wsprintf(errMsg, TEXT("WriteFile() failed with error code %lu"), GetLastError()); 
     ReportError(errMsg); 
     } 
    } 

    return 0; 
} 

,如果出現問題,我們將不只知道它,但我們會知道爲什麼

好東西,因爲當我在我的電腦上運行這段代碼時,它工作得很好。因此,這個問題在你的應用程序中的其他地方存在於我們尚未見過的代碼中。錯誤處理代碼將幫助將其清除。

0

要使用調用窗口/控制檯寫入STDOUT,需要將生成的可執行文件鏈接到控制檯子系統。

LINK.EXE /編輯/子系統:控制檯{你的EXE這裏的名字}

這工作與舊VB6的環境中,我假設相同的可執行標誌適用於Visual C作爲好。