2014-04-18 10 views
5

मेरे पास C# कंसोल ऐप है जो P/Invoke एक मूल C++ डीएल में है। डीएलएल कुछ धागे बनाता है जो बहुत चंचल होते हैं और मानक लॉग में अपने लॉग लिखते हैं। समस्या यह है कि मुझे अपने उपयोगकर्ता इंटरैक्शन के लिए कंसोल की आवश्यकता है।प्रबंधित रैपर से देशी डीएलएल stdout/stderr को रीडायरेक्ट करें

मैं डीएलएल स्टडआउट/stderr को null पर कैसे रीडायरेक्ट कर सकता हूं?

+0

क्या आप अपना कोड बदल सकते हैं ताकि यह सी ++ डीएलएल को एक अलग प्रक्रिया में कॉल कर सके? यदि ऐसा है तो आप 'ProcessWindowStyle.Hidden' विकल्प' के साथ अलग प्रक्रिया लॉन्च कर सकते हैं। यह वही नहीं हो सकता है जो आप खोज रहे हैं, लेकिन यह काम करेगा। – shf301

उत्तर

2

मुझे लगता है कि इस काम को करने के लिए आपको एक देशी डीएलएल बनाने की आवश्यकता होगी जो परेशानी डीएलएल के समान सी ++ रनटाइम से लिंक हो। फिर आपको stdout को पुनर्निर्देशित करने के लिए freopen का उपयोग करने की आवश्यकता होगी। freopen: reverting back to original stream

सी ++ कोड इस प्रकार दिखाई देगा: इस कोड के लिए मेरे स्रोत इस जवाब है

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

आप पी/आह्वान कर सकते हैं कि आपके कोड से इस तरह:

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

और तुम इसे इस तरह कॉल कर सकते हैं:

int fd; 
long pos; 

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

यह सब एक गतिशील से जुड़े डीएलएल पर निर्भर करता है एमएसवीसी रनटाइम और आप उस कोड को लिखने में सक्षम हैं जो समान लिंक करता है।

+0

मुझे आश्चर्य है कि डाउनवॉटर एक आलोचना पेश करना चाहेगा। –

+0

+1 हमें ट्रोल से निपटना होगा। – lontivero

-2

मैं आपके प्रश्न से थोड़ा उलझन में हूं, क्या सी # ऐप सी ++ या अन्य तरीकों से आह्वान करता है?

किसी भी तरह से, मेरी प्रतिक्रिया दोनों के लिए समान है। पाइप/dev/बातिल में हमलावर धागे के उत्पादन (एक लॉग हालांकि बेहतर होगा ...)

आप ग पर नियंत्रण है, तो ++ DLL, उपयोग: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

वरना: Redirecting standard input of console application

पाइप अद्भुत हैं। जब मैं टर्मिनल पर आउटपुट नहीं देखना चाहता हूं, तो मैं नियमित रूप से पाइप आउटपुट को शून्य में डालता हूं, और मुझे याद नहीं है कि चुप चलने का तरीका कैसा चल रहा है।

संबंधित मुद्दे