2012-01-26 25 views
5

我有一個第三方DLL,我加載到不是我的軟件,我使用AllocConsole()創建標準的Windows CLI窗口,所以我有一個簡單的方法輸出調試消息。使用STDIN與AllocConsole()

雖然我的問題是,它忽略了任何類型的輸入。 我只是想能夠使用我分配的控制檯,並使我能夠給它一些輸入。

+1

我假設這是在MS Windows上,因爲'AllocConsole'是一個微軟的API。適當地重新標記。 –

+1

它也在我的文章中說windows CLI,所以不需要做任何假設。感謝retag。 – Nowayz

回答

11

由於本福格特,我能夠導致控制檯需要輸入後,我做分配是:

freopen("CONIN$", "r", stdin); 
freopen("CONOUT$", "w", stdout); 
freopen("CONOUT$", "w", stderr); 

這還指示stdout和strerr相同的控制檯窗口,如果他們是出於某種原因指向其他地方。

+0

如果它幫助任何人,使用VS2013,我無法通過FreeConsole關閉控制檯,而無需「放回」stdout/stderr:freopen(「OUT」,「w」,stdout); – tmruss

2

您是否還將stdoutstderr重定向到控制檯?

我使用此代碼來訪問Windows應用程序的JavaVM輸出。

if(::AllocConsole()) 
    { 
     int hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); 
     FILE *hf = ::_fdopen(hCrt, "w"); 
     *stdout = *hf; 
     ::setvbuf(stdout, NULL, _IONBF, 0); 

     hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_ERROR_HANDLE), _O_TEXT); 
     hf = ::_fdopen(hCrt, "w"); 
     *stderr = *hf; 
     ::setvbuf(stderr, NULL, _IONBF, 0); 
    } 

在此之後,我可以看到從VM的所有stdoutstderr輸出。

+0

我已經指示stdout和stderr是的,但我仍然無法使用STDIN的CLI窗口。當我嘗試正確設置stdin時,窗口仍然拒絕輸入。 – Nowayz

+0

標準手柄與程序啓動後創建的控制檯沒有關聯。如果這是先完成的,其餘部分可能會起作用。 –

2

這是對我的作品的代碼:

freopen("CONOUT$", "w", stdout); 

你也許可以做到(當然打開讀取,)與CONIN$stdin類似的東西。

+0

謝謝你在正確的軌道上。 – Nowayz