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.
fonte
2014-04-21 18:50:47
È 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