我有一個第三方DLL,我加載到不是我的軟件,我使用AllocConsole()創建標準的Windows CLI窗口,所以我有一個簡單的方法輸出調試消息。使用STDIN與AllocConsole()
雖然我的問題是,它忽略了任何類型的輸入。 我只是想能夠使用我分配的控制檯,並使我能夠給它一些輸入。
我有一個第三方DLL,我加載到不是我的軟件,我使用AllocConsole()創建標準的Windows CLI窗口,所以我有一個簡單的方法輸出調試消息。使用STDIN與AllocConsole()
雖然我的問題是,它忽略了任何類型的輸入。 我只是想能夠使用我分配的控制檯,並使我能夠給它一些輸入。
由於本福格特,我能夠導致控制檯需要輸入後,我做分配是:
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
這還指示stdout和strerr相同的控制檯窗口,如果他們是出於某種原因指向其他地方。
如果它幫助任何人,使用VS2013,我無法通過FreeConsole關閉控制檯,而無需「放回」stdout/stderr:freopen(「OUT」,「w」,stdout); – tmruss
您是否還將stdout
和stderr
重定向到控制檯?
我使用此代碼來訪問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的所有stdout
和stderr
輸出。
我已經指示stdout和stderr是的,但我仍然無法使用STDIN的CLI窗口。當我嘗試正確設置stdin時,窗口仍然拒絕輸入。 – Nowayz
標準手柄與程序啓動後創建的控制檯沒有關聯。如果這是先完成的,其餘部分可能會起作用。 –
這是對我的作品的代碼:
freopen("CONOUT$", "w", stdout);
你也許可以做到(當然打開讀取,)與CONIN$
和stdin
類似的東西。
謝謝你在正確的軌道上。 – Nowayz
我假設這是在MS Windows上,因爲'AllocConsole'是一個微軟的API。適當地重新標記。 –
它也在我的文章中說windows CLI,所以不需要做任何假設。感謝retag。 – Nowayz