2013-03-21 1 views
22

Ho una DLL dove uso AllocConsole() e cout per visualizzare i dati per scopi di debug.
Ha funzionato bene ma da quando ho aggiornato il mio compilatore (Visual Studio 2012) al più recente la dll mostra solo la console ma non le stampe/couts.
Sono fuori di idee sul perché questo sta accadendo.
Qualche idea? viene visualizzataAllocConsole() non visualizza il cout

parte del mio codice

__declspec(dllexport) INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) 
{ 
    switch(Reason) 
    { 
    case DLL_PROCESS_ATTACH:  
     AllocConsole(); 

     DisableThreadLibraryCalls(hDLL); 

     // 
     DetourTransactionBegin(); 
     DetourUpdateThread(GetCurrentThread()); 
     DetourAttach(&(PVOID&)pSend, MySend); 
     if(DetourTransactionCommit() == NO_ERROR) 
      cout << "[" << MySend << "] successfully detoured." << endl; 

Ma niente.

risposta

48

Ricordo vagamente che potrebbe essere necessario reindirizzare lo stdout sulla console. Potrei sbagliarmi se (dato che hai avuto il tuo codice di lavoro in precedenza):

AllocConsole(); 
freopen("CONOUT$", "w", stdout); 
std::cout << "This works" << std::endl; 
+0

Ci in effetti ha funzionato. Dispari. Ma ha funzionato – madziikoy

+7

'freopen (" CONIN $ "," r ", stdin);' funziona anche come previsto. –

+1

Poiché '' freopen'' è depecrated (per problemi di sicurezza), dovresti usare '' freopen_s (& new_stdout, "CONOUT $", "w", stdout); '' dove '' new_stdout'' è un '' FILE' 'puntatore. – ub3rst4r

2

Questo funziona utilizzando vs2015 con la linea std::cout.clear()

if (!AllocConsole()) 
    MessageBox(NULL, L"The console window was not created", NULL, MB_ICONEXCLAMATION); 

FILE* fp; 

freopen_s(&fp, "CONOUT$", "w", stdout); 

printf("Hello console on\n"); 

std::cout.clear(); 

std::cout << "Cout line one." << std::endl; 

cout << "Cout line two." << std::endl; 

MessageBox(NULL, (L"Pause to see console output."), (L"Pause Here"), MB_OK | MB_SYSTEMMODAL | MB_ICONEXCLAMATION); 

fclose(fp); 

if (!FreeConsole()) 
    MessageBox(NULL, L"Failed to free the console!", NULL, MB_ICONEXCLAMATION); 
+0

Grazie davvero. Nient'altro ha funzionato per me su Visual Studio. E ho provato 2 soluzioni presumibilmente famose per circa un'ora ora. –