2014-04-18 38 views
5

P/Invoke numaralı bir konsol uygulamasına sahip bir yerel C++ dll uygulamasına sahibim. Dll, çok konuşkan olan ve günlüklerini standart çıktılara yazan bazı parçacıklar oluşturur. Sorun, kullanıcı etkileşimlerim için Konsol'a ihtiyacım olmasıdır.Yönetilen sarıcıdan yerel DLL stdout/stderr'yi yeniden yönlendirin

dll stdout/stderr dosyasını null adresine nasıl yeniden yönlendirebilirim?

+0

Kodunuzu, ayrı bir işlemde C++ DLL'ye yapılan çağrıları değiştirecek şekilde değiştirebilir misiniz? Öyleyse, 'ProcessWindowStyle.Hidden' seçeneği ile ayrı bir işlemi başlatabilirsiniz. Tam olarak sizin aradığınız şey olmayabilir, ama işe yarayacaktı. – shf301

cevap

2

Bu işi yapmak için, sorunlu DLL olarak aynı C++ çalışma zamanına bağlanan bir yerel DLL oluşturmanız gerektiğini düşünüyorum. Stdout'u yeniden yönlendirmek için freopen'u kullanmanız gerekir. freopen: reverting back to original stream

C++ kod şu şekilde görünecektir: Bu kod için Kaynağım bu cevabı

#include <io.h> 

__declspec(dllexport) void RedirectStdOutputToNul(int *fd, fpos_t *pos) 
{ 
    fflush(stdout); 
    fgetpos(stdout, pos); 
    *fd = _dup(fileno(stdout)); 
    freopen("NUL", "w", stdout); 
} 

__declspec(dllexport) void RestoreStdOutput(int fd, fpos_t pos) 
{ 
    fflush(stdout); 
    _dup2(fd, fileno(stdout)); 
    close(fd); 
    clearerr(stdout); 
    fsetpos(stdout, &pos);  
} 

Sen p/böyle kodunuzdan o çağırabilirsiniz:

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] 
static extern void RedirectStdOutputToNul(out int fd, out long pos); 

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] 
static extern void RestoreStdOutput(int fd, long pos); 

Ve teşekkür şöyle diyebiliriz:

int fd; 
long pos; 

RedirectStdOutputToNul(out fd, out pos); 
print("boo"); 
RestoreStdOutput(fd, pos); 
print("yah"); 

Bu, bir dinamik için bir DLL bağlanır MSVC çalışma zamanı ve aynı bağlantıyı kod yazabilirsiniz.

+0

Downvoter'ın bir eleştiri sunmak isteyip istemediğini merak ediyorum. –

+0

+1 trollerle uğraşmamız gerekiyor. – lontivero

-2

Sorunu biraz kafam karıştı, C# uygulaması C++ veya başka bir şekilde mi çağırıyor?

Her iki durumda da yanıtım her ikisi için de aynıdır./Dev/null içine kusurlu dişin çıkışı (bir günlük olsa tercih olurdu ...) Boru

Eğer c üzerinde kontrol varsa ++ dll, kullanım: Else http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

: Redirecting standard input of console application

Pipolar harika. Terminaldeki çıkışı görmek istemediğimde düzenli olarak çıkışı null olarak yapıyorum ve sessiz bir çalışmaya nasıl sebep olabileceğimi hatırlamıyorum.