2014-04-18 11 views
5

Ho un'app console C# in una dll nativa C++. La DLL crea alcuni thread che sono molto chiacchieroni e scrivono i loro log in output standard. Il problema è che ho bisogno di console per le mie interazioni utente.Reindirizza lo stdout/stderr nativo della DLL dal wrapper gestito

Come posso reindirizzare lo stdout/stderr della dll su null?

+0

È possibile modificare il codice in modo che effettui le chiamate alla DLL C++ in un processo separato? In tal caso, è possibile avviare il processo separato con l'opzione 'ProcessWindowStyle.Hidden'. Potrebbe non essere esattamente quello che stai cercando, ma funzionerebbe. – shf301

risposta

2

Penso che, per fare questo lavoro, sarà necessario creare una DLL nativa che si colleghi allo stesso runtime di C++ come la fastidiosa DLL. Dovrai quindi utilizzare freopen per reindirizzare lo stdout. La mia fonte di questo codice è questa risposta: freopen: reverting back to original stream

Il codice C++ sarebbe simile a questa:

#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);  
} 

È possibile P/Invoke che dal codice come questo:

[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); 

E voi potrebbe chiamarlo in questo modo:

int fd; 
long pos; 

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

Tutto ciò si basa sulla DLL che collega a un dinamico Runtime MSVC e sei in grado di scrivere codice che si collega allo stesso.

+0

Mi chiedo se il downvoter vorrebbe offrire una critica. –

+0

+1 abbiamo a che fare con i troll. – lontivero

-2

Sono un po 'confuso dalla domanda, l'app C# richiama il C++ o viceversa?

In entrambi i casi, la mia risposta è la stessa per entrambi. Inviare l'output del thread incriminato in/dev/null (un registro sarebbe preferibile se ...)

Se avete il controllo del C++ dll, uso: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

Else: Redirecting standard input of console application

Le pipe sono fantastiche. Tiro regolarmente l'output in null quando non voglio vedere l'output sul terminale, e non mi va di ricordare come provocare una corsa silenziosa.

Problemi correlati