2013-03-21 15 views
22

Mam DLL, gdzie używam AllocConsole() i cout do wyświetlania danych do celów debugowania.
Zwykle działa dobrze, ale od czasu aktualizacji mojego kompilatora (Visual Studio 2012) do najnowszej biblioteki dll po prostu pokazuje konsolę, ale nie drukuje/couts.
Nie mam pojęcia, dlaczego tak się dzieje.
Każdy pomysł? zostanie wyświetlonyAllocConsole() nie wyświetla cout

Część mojego kodu

__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; 

ale nic.

Odpowiedz

48

Niejasno pamiętam, że może zajść potrzeba przekierowania standardowego wyjścia do konsoli. Mogę się mylić, choć (ponieważ miał swój kod pracujący wcześniej):

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

Będziemy To faktycznie pracował. Dziwny. Ale pracował. – madziikoy

+7

'freopen (" CONIN $ "," r ", stdin);' działa również zgodnie z oczekiwaniami. –

+1

Ponieważ '' freopen'' jest depecrowany (ze względów bezpieczeństwa), powinieneś użyć '' freopen_s (& new_stdout, "CONOUT $", "w", stdout); '' gdzie '' new_stdout'' jest plikiem '' FILE' 'wskaźnik. – ub3rst4r

2

Działa przy użyciu vs2015 z linią 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

Dziękuję bardzo. Nic więcej nie działało dla mnie w Visual Studio. I próbowałem 2 rzekomo znanych rozwiązań od około godziny. –