<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>System Administration on kenji.blog</title><link>http://kenji.blog/hi/categories/system-administration/</link><description>Recent content in System Administration on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 16:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/system-administration/index.xml" rel="self" type="application/rss+xml"/><item><title>PowerShell और C++ का एकीकरण: सिस्टम प्रबंधन स्वचालन तकनीक</title><link>http://kenji.blog/hi/p/powershell-cpp-system-automation/</link><pubDate>Sat, 12 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/powershell-cpp-system-automation/</guid><description>&lt;img src="http://kenji.blog/p/powershell-cpp-system-automation/img/eyecatch.jpg" alt="Featured image of post PowerShell और C++ का एकीकरण: सिस्टम प्रबंधन स्वचालन तकनीक" />&lt;h2 id="परचय">परिचय
&lt;/h2>&lt;p>Windows सिस्टम प्रबंधन और स्वचालन (automation) में, PowerShell एक वास्तविक मानक उपकरण (de facto standard tool) बन गया है। Active Directory का प्रबंधन, फ़ाइल सिस्टम का संचालन, नेटवर्क कॉन्फ़िगरेशन में बदलाव आदि जैसे हर कार्य को स्क्रिप्ट द्वारा लिखा जा सकता है। हालाँकि, जहाँ PowerShell सर्वशक्तिमान है, वहीं इसके स्क्रिप्टिंग भाषा-विशिष्ट प्रदर्शन की सीमाएँ हैं और बहुत निम्न-स्तरीय (low-level) Windows API तक पहुँचने में संघर्ष करने जैसी परिस्थितियाँ भी मौजूद हैं।&lt;/p>
&lt;p>यहाँ एक शक्तिशाली समाधान &amp;ldquo;C++ के साथ एकीकरण&amp;rdquo; है। C++ मूल निष्पादन गति (native execution speed) और Win32 API व COM ऑब्जेक्ट्स तक पूर्ण पहुँच प्रदान करता है। PowerShell की &amp;ldquo;उच्च उत्पादकता और लचीलापन&amp;rdquo; को C++ के &amp;ldquo;अत्यधिक प्रदर्शन और निम्न-स्तरीय नियंत्रण&amp;rdquo; के साथ जोड़कर, एंटरप्राइज़ वातावरण में बेहद जटिल और बड़े पैमाने पर सिस्टम प्रबंधन कार्यों को अनुकूलित (optimize) करना संभव हो जाता है।&lt;/p>
&lt;p>इस लेख में, हम PowerShell और C++ को द्विदिश रूप (bidirectionally) से जोड़ने के लिए विशिष्ट आर्किटेक्चर, कार्यान्वयन (implementation) विधियों, और मेमोरी प्रबंधन व स्ट्रिंग रूपांतरण के सर्वोत्तम अभ्यासों (best practices) के बारे में बहुत विस्तार से बताएंगे।&lt;/p>
&lt;h2 id="powershell-और-c-क-एक-सथ-कय-जड">PowerShell और C++ को एक साथ क्यों जोड़ें?
&lt;/h2>&lt;h3 id="1-परदरशन-performance-क-समओ-क-पर-करन">1. प्रदर्शन (Performance) की सीमाओं को पार करना
&lt;/h3>&lt;p>PowerShell में .NET Framework (या .NET Core / .NET) पर चलने वाले इंटरप्रिटेड (interpreted) और डायनेमिकली टाइप्ड (dynamically typed) भाषा के तत्व हैं। इसलिए, बड़ी मात्रा में टेक्स्ट को संसाधित (process) करते समय, जटिल एन्क्रिप्शन प्रक्रियाएँ करते समय, या लाखों इवेंट लॉग्स का विश्लेषण करते समय, निष्पादन गति और मेमोरी की खपत एक बाधा (bottleneck) बन सकती है।&lt;/p>
&lt;p>आइए गणना की जटिलता (computational complexity) और प्रसंस्करण समय (processing time) के मॉडल पर विचार करें। यह मानते हुए कि किसी कार्य का कुल प्रसंस्करण समय $T_{total}$ है, अकेले PowerShell के साथ प्रसंस्करण समय और C++ पर ऑफलोड (offload) किए जाने पर प्रसंस्करण समय को निम्नानुसार तैयार किया जा सकता है।&lt;/p>
$$ T_{total}^{(PS)} = N \times (t_{overhead} + t_{compute}^{(PS)}) $$$$ T_{total}^{(C++)} = t_{interop} + N \times t_{compute}^{(C++)} $$&lt;p>यहाँ, $N$ संसाधित किए जाने वाले तत्वों की संख्या है, $t_{overhead}$ PowerShell के लूप प्रसंस्करण से जुड़ा ओवरहेड है, $t_{compute}$ प्रति तत्व शुद्ध गणना समय है, और $t_{interop}$ P/Invoke आदि द्वारा सीमा कॉलिंग (boundary calling) का ओवरहेड है।&lt;/p>
&lt;p>जब $N$ पर्याप्त रूप से बड़ा होता है, $t_{overhead} \gg 0$ और $t_{compute}^{(PS)} > t_{compute}^{(C++)}$, इसलिए प्रारंभिक $t_{interop}$ का भुगतान करके भी C++ को प्रसंस्करण सौंपना (ऑफलोड करना) समग्र विलंबता (latency) को नाटकीय रूप से कम कर देता है।&lt;/p>
&lt;h3 id="2-नटव-win32-api-तक-पहच">2. नेटिव Win32 API तक पहुँच
&lt;/h3>&lt;p>यद्यपि &lt;code>Add-Type&lt;/code> का उपयोग करके C# के माध्यम से Win32 API को कॉल करना अकेले PowerShell के साथ संभव है, लेकिन सीधे C# / PowerShell में जटिल संरचनाओं (structures) और कॉलबैक फ़ंक्शंस (जैसे: मिनीफ़िल्टर ड्राइवर नियंत्रण, उन्नत प्रक्रिया मेमोरी हेरफेर) को परिभाषित करना बहुत मुश्किल है। C++ में लिपटे (wrapped) एक नेटिव DLL बनाकर और उसे PowerShell से कॉल करके, टाइप-सेफ (type-safe) और विश्वसनीय सिस्टम नियंत्रण संभव हो जाता है।&lt;/p>
&lt;h2 id="powershell-स-c-नटव-dll-क-कल-करन">PowerShell से C++ नेटिव DLL को कॉल करना
&lt;/h2>&lt;p>सबसे आम एकीकरण पैटर्न भारी प्रसंस्करण या सिस्टम-विशिष्ट प्रसंस्करण को C++ DLL के रूप में लागू करना और उसे PowerShell स्क्रिप्ट से कॉल करना है।&lt;/p>
&lt;h3 id="c-सइड-dll-करयनवयन-win32-api-और-कसटम-लजक">C++ साइड DLL कार्यान्वयन (Win32 API और कस्टम लॉजिक)
&lt;/h3>&lt;p>सबसे पहले, एक C++ DLL बनाएं जिसमें एक एक्सपोर्ट फ़ंक्शन हो जिसे PowerShell से कॉल किया जा सके। यहाँ एक साधारण C++ कोड का उदाहरण दिया गया है जो &amp;ldquo;बड़े पैमाने पर स्ट्रिंग डेटा एन्क्रिप्शन/डिक्रिप्शन, या जटिल हैश गणना फ़ंक्शन&amp;rdquo; की कल्पना करता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// NativeLib.cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// P/Invoke के साथ आसानी से कॉल करने के लिए C लिंकेज और __stdcall निर्दिष्ट करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">extern&lt;/span> &lt;span class="s">&amp;#34;C&amp;#34;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">__declspec&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dllexport&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="kr">__stdcall&lt;/span> &lt;span class="n">ComputeHeavyTask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">multiplier&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">dataSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// जानबूझकर भारी प्रसंस्करण का अनुकरण (simulation)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">dataSize&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">multiplier&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// स्ट्रिंग को संसाधित करने वाला फ़ंक्शन (Unicode समर्थन के लिए LPWSTR का उपयोग करता है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">__declspec&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dllexport&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="kr">__stdcall&lt;/span> &lt;span class="n">ProcessSystemString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LPCWSTR&lt;/span> &lt;span class="n">inputString&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">LPWSTR&lt;/span> &lt;span class="n">outputBuffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">bufferSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">inputString&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">outputBuffer&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inputString&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// कुछ जटिल स्ट्रिंग प्रसंस्करण (उदाहरण: सिस्टम पहचानकर्ता (identifier) जोड़ना)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;PROCESSED_&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">str&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">size_t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">bufferSize&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// बफर ओवररन (buffer overrun) से बचाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">wcscpy_s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">outputBuffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bufferSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="ममर-परबधन-और-सटरग-रपतरण-bstr-lpwstr">मेमोरी प्रबंधन और स्ट्रिंग रूपांतरण (&lt;code>BSTR&lt;/code>, &lt;code>LPWSTR&lt;/code>)
&lt;/h3>&lt;p>C++ और PowerShell (.NET) के बीच डेटा का आदान-प्रदान करते समय ध्यान देने योग्य सबसे महत्वपूर्ण बातें &lt;strong>स्ट्रिंग एन्कोडिंग&lt;/strong> और &lt;strong>मेमोरी प्रबंधन&lt;/strong> हैं।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>LPCWSTR&lt;/code> / &lt;code>LPWSTR&lt;/code>&lt;/strong>: C/C++ वाइड स्ट्रिंग पॉइंटर (UTF-16LE)। यह मानक रूप से Windows API के &lt;code>W&lt;/code> फ़ंक्शंस में उपयोग किया जाता है। P/Invoke में &lt;code>CharSet = CharSet.Unicode&lt;/code> निर्दिष्ट करके, यह स्वचालित रूप से .NET के &lt;code>String&lt;/code> और &lt;code>StringBuilder&lt;/code> के साथ मार्शल (marshal) हो जाता है।&lt;/li>
&lt;li>&lt;strong>&lt;code>BSTR&lt;/code>&lt;/strong>: COM (Component Object Model) में प्रयुक्त लंबाई-उपसर्ग (length-prefixed) वाली वाइड स्ट्रिंग। मेमोरी को &lt;code>SysAllocString&lt;/code> और &lt;code>SysFreeString&lt;/code> के साथ प्रबंधित किया जाना चाहिए। P/Invoke में &lt;code>[MarshalAs(UnmanagedType.BStr)]&lt;/code> निर्दिष्ट करें।&lt;/li>
&lt;/ul>
&lt;p>जब C++ साइड नई मेमोरी आवंटित करता है और इसे PowerShell साइड को वापस करता है, तो यह सवाल उठता है कि मेमोरी कौन मुक्त (free) करेगा (स्वामित्व (ownership))। उपर्युक्त &lt;code>ProcessSystemString&lt;/code> फ़ंक्शन में, हम मानक Win32 API पैटर्न को अपनाते हैं जहाँ &amp;ldquo;कॉल करने वाला (PowerShell) द्वारा पूर्व-आवंटित बफर (&lt;code>outputBuffer&lt;/code>) में C++ परिणाम लिखता है&amp;rdquo;। यह मेमोरी लीक को रोकता है।&lt;/p>
&lt;h3 id="powershell-सइड-म-add-type-और-pinvoke">PowerShell साइड में &lt;code>Add-Type&lt;/code> और P/Invoke
&lt;/h3>&lt;p>C++ DLL (&lt;code>NativeLib.dll&lt;/code>) को संकलित (compile) करने के बाद, हम इसे PowerShell स्क्रिप्ट से कॉल करते हैं। हम &lt;code>Add-Type&lt;/code> का उपयोग करके C# के P/Invoke सिग्नेचर को गतिशील रूप से संकलित (dynamically compile) करते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># PowerShell Script: Invoke-NativeDLL.ps1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$signature&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="sh">@&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">using System;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">using System.Runtime.InteropServices;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">using System.Text;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">public class NativeInterop
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> // C++ का ComputeHeavyTask परिभाषित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> [DllImport(&amp;#34;NativeLib.dll&amp;#34;, CallingConvention = CallingConvention.StdCall)]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> public static extern int ComputeHeavyTask(int multiplier, int dataSize);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> // C++ का ProcessSystemString परिभाषित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> [DllImport(&amp;#34;NativeLib.dll&amp;#34;, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh"> public static extern bool ProcessSystemString(string inputString, StringBuilder outputBuffer, int bufferSize);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sh">&amp;#39;@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># C# कोड को PowerShell सत्र में संकलित करें और जोड़ें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Add-Type&lt;/span> &lt;span class="n">-TypeDefinition&lt;/span> &lt;span class="nv">$signature&lt;/span> &lt;span class="n">-PassThru&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. भारी संख्यात्मक गणना (numerical calculation) कॉल&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$result&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">NativeInterop&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">ComputeHeavyTask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">100000000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Compute Task Result: &lt;/span>&lt;span class="nv">$result&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. स्ट्रिंग प्रसंस्करण कॉल&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$input&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;SYSTEM_NODE_001&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$bufferSize&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">256&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># C++ साइड को लिखने के लिए बफर के रूप में StringBuilder का उपयोग करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$outputBuffer&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Text&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">StringBuilder&lt;/span> &lt;span class="n">-ArgumentList&lt;/span> &lt;span class="nv">$bufferSize&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$success&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">NativeInterop&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">ProcessSystemString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$outputBuffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$bufferSize&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$success&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Processed String: &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$outputBuffer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">ToString&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;String processing failed.&amp;#34;&lt;/span> &lt;span class="n">-ForegroundColor&lt;/span> &lt;span class="n">Red&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="आरकटकचर-वजअलइजशन">आर्किटेक्चर विज़ुअलाइज़ेशन
&lt;/h3>&lt;p>निम्नलिखित अनुक्रम आरेख (sequence diagram) PowerShell से C++ DLL में कॉलिंग प्रवाह (flow) और मेमोरी एक्सचेंज को दर्शाता है।&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant PS as &amp;#34;PowerShell स्क्रिप्ट&amp;#34;
participant CLR as &amp;#34;.NET CLR (P/Invoke)&amp;#34;
participant CPP as &amp;#34;C++ नेटिव DLL&amp;#34;
PS-&amp;gt;&amp;gt;CLR: &amp;#34;ProcessSystemString कॉल करें&amp;#34;
note right of CLR: &amp;#34;System.String को LPCWSTR में मार्शल करें&amp;#34;
note right of CLR: &amp;#34;StringBuilder संदर्भ पास करें&amp;#34;
CLR-&amp;gt;&amp;gt;CPP: &amp;#34;ProcessSystemString(LPCWSTR, LPWSTR, int)&amp;#34;
CPP-&amp;gt;&amp;gt;CPP: &amp;#34;नेटिव स्ट्रिंग हेरफेर निष्पादित करें&amp;#34;
CPP-&amp;gt;&amp;gt;CPP: &amp;#34;परिणाम को LPWSTR बफर में लिखें&amp;#34;
CPP--&amp;gt;&amp;gt;CLR: &amp;#34;bool लौटाएं (सफलता)&amp;#34;
note left of CLR: &amp;#34;संशोधित StringBuilder बफर पढ़ें&amp;#34;
CLR--&amp;gt;&amp;gt;PS: &amp;#34;निष्पादन नियंत्रण लौटाएं&amp;#34;
PS-&amp;gt;&amp;gt;PS: &amp;#34;संसाधित स्ट्रिंग आउटपुट करें&amp;#34;
&lt;/pre>
&lt;h2 id="c-स-powershell-क-कल-करन">C++ से PowerShell को कॉल करना
&lt;/h2>&lt;p>अब यह विपरीत दृष्टिकोण है। ऐसे मामले हो सकते हैं जहाँ आप गतिशील रूप से (dynamically) C++ में निर्मित सिस्टम सेवा या डेस्कटॉप एप्लिकेशन से PowerShell स्क्रिप्ट को निष्पादित करना चाहते हैं और उसके परिणाम प्राप्त करना चाहते हैं। उदाहरण के लिए, जब कोई C++ मॉनिटरिंग एजेंट किसी विशिष्ट विसंगति (anomaly) का पता लगाता है, तो वह PowerShell की उपचारात्मक स्क्रिप्ट (remediation script) चलाता है।&lt;/p>
&lt;p>दृष्टिकोण मुख्य रूप से दो हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>प्रक्रिया प्रारंभ (&lt;code>CreateProcess&lt;/code> / &lt;code>_popen&lt;/code>)&lt;/strong>: &lt;code>powershell.exe&lt;/code> को एक स्वतंत्र प्रक्रिया के रूप में प्रारंभ करना और मानक इनपुट/आउटपुट को पाइप से जोड़ना।&lt;/li>
&lt;li>&lt;strong>PowerShell होस्टिंग API (C++/CLI के माध्यम से)&lt;/strong>: PowerShell रनटाइम को उसी प्रक्रिया के भीतर होस्ट करना।&lt;/li>
&lt;/ol>
&lt;p>इस लेख में, हम सिस्टम प्रोग्रामिंग में सबसे मजबूत और बहुमुखी &lt;strong>पाइपलाइन का उपयोग करके CreateProcess&lt;/strong> विधि के बारे में बताएंगे।&lt;/p>
&lt;h3 id="createprocess-और-अनम-anonymous-पइपस-क-मधयम-स-नषपदन">CreateProcess और अनाम (Anonymous) पाइप्स के माध्यम से निष्पादन
&lt;/h3>&lt;p>निम्नलिखित C++ कोड अनाम पाइप (Anonymous Pipes) बनाता है, &lt;code>powershell.exe&lt;/code> को बाल प्रक्रिया (child process) के रूप में शुरू करके स्क्रिप्ट निष्पादित करता है, और मानक आउटपुट (standard output) से परिणाम पढ़ता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">ExecutePowerShellScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">script&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">HANDLE&lt;/span> &lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SECURITY_ATTRIBUTES&lt;/span> &lt;span class="n">sa&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sa&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">nLength&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SECURITY_ATTRIBUTES&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sa&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">bInheritHandle&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TRUE&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// पाइप हैंडल को बाल प्रक्रिया में विरासत (inherit) में दें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">sa&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">lpSecurityDescriptor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. पाइप बनाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">CreatePipe&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">sa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s">&amp;#34;Error: CreatePipe failed.&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. बाल प्रक्रिया (PowerShell) के स्टार्टअप जानकारी को सेट करना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">STARTUPINFOA&lt;/span> &lt;span class="n">si&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ZeroMemory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">si&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">STARTUPINFOA&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">cb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">STARTUPINFOA&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">dwFlags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">STARTF_USESTDHANDLES&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">STARTF_USESHOWWINDOW&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hStdOutput&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hStdError&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">si&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">wShowWindow&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SW_HIDE&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// विंडो छिपाएं
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PROCESS_INFORMATION&lt;/span> &lt;span class="n">pi&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ZeroMemory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PROCESS_INFORMATION&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// कमांड लाइन का निर्माण (सरलीकृत संस्करण जो बायपास नीति के साथ Base64 एन्कोडिंग आदि से बचता है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">cmd&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;powershell.exe -NoProfile -NonInteractive -Command &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">script&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">cmdBuffer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cmd&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">cmd&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">end&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cmdBuffer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sc">&amp;#39;\0&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 3. प्रक्रिया बनाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">CreateProcessA&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cmdBuffer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TRUE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">si&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s">&amp;#34;Error: CreateProcess failed.&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// पैरेंट प्रोसेस (parent process) में राइट पाइप की आवश्यकता नहीं है इसलिए इसे बंद करें (यदि बंद नहीं किया गया, तो Read ब्लॉक हो जाएगा)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hWritePipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 4. परिणाम पढ़ना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DWORD&lt;/span> &lt;span class="n">bytesRead&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ReadFile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">bytesRead&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">bytesRead&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">buffer&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">bytesRead&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sc">&amp;#39;\0&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 5. क्लीनअप
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">WaitForSingleObject&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hProcess&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">INFINITE&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hProcess&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">hThread&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hReadPipe&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// PowerShell में प्रक्रिया सूची प्राप्त करने और CPU उपयोग द्वारा सॉर्ट करने का आदेश
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">psCommand&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 | Format-Table Name, CPU, Id&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Executing PowerShell from C++...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ExecutePowerShellScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">psCommand&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Result:&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="windows-रजसटर-और-powershell-क-एककरण">Windows रजिस्ट्री और PowerShell का एकीकरण
&lt;/h3>&lt;p>C++ से स्क्रिप्ट चलाते समय, डायनेमिक कॉन्फ़िगरेशन मानों (dynamic configuration values) या निष्पादन पथों (execution paths) को हार्डकोड करने से बचना चाहिए। कई मामलों में, C++ एप्लिकेशन &lt;strong>Windows रजिस्ट्री&lt;/strong> से सेटिंग्स पढ़ते हैं।&lt;/p>
&lt;p>एंटरप्राइज़ सिस्टम में वह आर्किटेक्चर पसंद किया जाता है जहाँ C++ साइड &lt;code>RegOpenKeyEx&lt;/code> और &lt;code>RegQueryValueEx&lt;/code> का उपयोग करके &lt;code>HKLM\SOFTWARE\MyApp&lt;/code> से PowerShell स्क्रिप्ट का पथ प्राप्त करता है, और इसे उपर्युक्त &lt;code>CreateProcess&lt;/code> में तर्क (argument) के रूप में पास करता है।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;C++ एजेंट सेवा&amp;#34;] --&amp;gt;|RegQueryValueEx| B[&amp;#34;Windows रजिस्ट्री&amp;#34;]
B --&amp;gt;|Return Script Path| A
A --&amp;gt;|CreateProcess| C[&amp;#34;powershell.exe&amp;#34;]
C --&amp;gt;|Execute| D[&amp;#34;व्यवस्थापक स्क्रिप्ट (उदा., Restart-Service)&amp;#34;]
D --&amp;gt;|stdout via Pipe| C
C --&amp;gt;|ReadFile| A
A --&amp;gt;|Log| E[&amp;#34;इवेंट व्यूअर / लॉग फ़ाइल&amp;#34;]
&lt;/pre>
&lt;h2 id="परदरशन-वशलषण-performance-analysis-और-ऑफलडग-offloading-क-लभ">प्रदर्शन विश्लेषण (Performance Analysis) और ऑफलोडिंग (Offloading) के लाभ
&lt;/h2>&lt;p>हम इस तरह के जटिल आर्किटेक्चर को क्यों अपनाते हैं? एक विशिष्ट परिदृश्य के रूप में, &amp;ldquo;कई गीगाबाइट की कस्टम IIS लॉग फ़ाइलों के पार्सिंग (parsing)&amp;rdquo; पर विचार करें।&lt;/p>
&lt;p>जब आप PowerShell में &lt;code>Get-Content&lt;/code> का उपयोग करते हैं और रेगुलर एक्सप्रेशन (regular expressions) का उपयोग करके इसे पंक्ति-दर-पंक्ति पार्स करते हैं, तो ऑब्जेक्ट निर्माण और कचरा संग्रहण (Garbage Collection: GC) के ओवरहेड के कारण CPU समय की बड़ी मात्रा का उपभोग होता है।&lt;/p>
&lt;p>स्क्रिप्ट निष्पादन में मेमोरी आवंटन संख्या $A$ और GC ट्रिगर संख्या $G$ निम्नानुसार अनुपातिक (proportional) हैं:&lt;/p>
$$ G \propto \sum_{i=1}^{N} A_i $$&lt;p>जब प्रसंस्करण को C++ नेटिव कोड में स्थानांतरित (offload) किया जाता है, तो मेमोरी मैपिंग (&lt;code>CreateFileMapping&lt;/code>, &lt;code>MapViewOfFile&lt;/code>) का उपयोग पूरी फ़ाइल को सीधे मेमोरी में विस्तारित करने के लिए किया जा सकता है, और पॉइंटर अंकगणित (pointer arithmetic) द्वारा जीरो-कॉपी (Zero-copy) के साथ स्ट्रिंग खोज की जा सकती है। इस मामले में, ऑब्जेक्ट निर्माण से जुड़ा ओवरहेड वस्तुतः शून्य हो जाता है, और पार्सिंग सैद्धांतिक मेमोरी बैंडविड्थ सीमा के करीब की गति से पूरी होती है।&lt;/p>
&lt;p>पार्स किए गए परिणामों (जैसे: अनधिकृत पहुँच वाले IP पतों की सूची) को केवल PowerShell साइड पर वापस करने से, P/Invoke मार्शलिंग लागतों को भी न्यूनतम किया जा सकता है।&lt;/p>
&lt;h2 id="वयवहरक-ससटम-परबधन-सवचलन-परदशय">व्यावहारिक सिस्टम प्रबंधन स्वचालन परिदृश्य
&lt;/h2>&lt;h3 id="परदशय-1-उचच-गत-फइल-ससटम-सकन-और-अनमत-permission-परवरतन">परिदृश्य 1: उच्च गति फ़ाइल सिस्टम स्कैन और अनुमति (Permission) परिवर्तन
&lt;/h3>&lt;p>बड़े पैमाने पर फ़ाइल सर्वर में, यह एक ऐसा कार्य है जहाँ विशिष्ट एक्सटेंशन वाली फ़ाइलों को निकाला जाता है जिनमें विशिष्ट ACL (एक्सेस कंट्रोल लिस्ट) सेट होती है, और फिर बैच (batch) में उनकी अनुमतियों (permissions) को बदला जाता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>C++ की भूमिका&lt;/strong>: &lt;code>FindFirstFile&lt;/code> / &lt;code>FindNextFile&lt;/code> और मल्टीथ्रेडिंग का उपयोग करके बहुत तेज़ गति से निर्देशिका ट्री (directory tree) को पार (traverse) करना और शर्तों से मेल खाने वाले फ़ाइल पथों की एक सूची तैयार करना।&lt;/li>
&lt;li>&lt;strong>PowerShell की भूमिका&lt;/strong>: C++ से प्राप्त सूची पर बैच में अनुमतियों को लागू करने के लिए &lt;code>Set-Acl&lt;/code> का उपयोग करना (या Active Directory के साथ एकीकृत प्रक्रिया)।&lt;/li>
&lt;/ul>
&lt;h3 id="परदशय-2-अदवतय-unique-हरडवयर-जनकर-एकतर-करन">परिदृश्य 2: अद्वितीय (Unique) हार्डवेयर जानकारी एकत्र करना
&lt;/h3>&lt;p>विशिष्ट हार्डवेयर उपकरणों (जैसे: विशेष PCIe कार्ड या सेंसर) की जानकारी की निगरानी करना जिसे WMI (Windows Management Instrumentation) या CIM (Common Information Model) के माध्यम से प्राप्त नहीं किया जा सकता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>C++ की भूमिका&lt;/strong>: एक DLL जो डिवाइस ड्राइवर को &lt;code>DeviceIoControl&lt;/code> कॉल करता है और बाइनरी डेटा प्राप्त और विश्लेषण करता है।&lt;/li>
&lt;li>&lt;strong>PowerShell की भूमिका&lt;/strong>: नियमित रूप से DLL को कॉल करना, विश्लेषण परिणामों को JSON में फ़ॉर्मेट करना और इसे मॉनिटरिंग सर्वर के REST API पर भेजना।&lt;/li>
&lt;/ul>
&lt;h2 id="ममर-परबधन-और-समसय-नवरण-troubleshooting-क-सरवततम-अभयस">मेमोरी प्रबंधन और समस्या निवारण (Troubleshooting) के सर्वोत्तम अभ्यास
&lt;/h2>&lt;p>एकीकरण (integration) में सबसे अधिक होने वाले बग &lt;strong>मेमोरी लीक&lt;/strong> और &lt;strong>एक्सेस उल्लंघन (Access Violation: 0xC0000005)&lt;/strong> हैं।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>पॉइंटर की वैधता अवधि&lt;/strong>: जब PowerShell की ओर से &lt;code>[ref]&lt;/code> या &lt;code>StringBuilder&lt;/code> पास किया जाता है, तो P/Invoke केवल कॉल के दौरान उस मेमोरी को पिन (Pin) करता है। C++ पक्ष पर, आपको उस पॉइंटर को वैश्विक चर (global variable) में सहेजकर बाद में एक्सेस नहीं करना चाहिए। अतुल्यकालिक कॉलबैक (asynchronous callbacks) करते समय, आपको &lt;code>GCHandle&lt;/code> का उपयोग करके मेमोरी को स्पष्ट रूप से पिन करना चाहिए।&lt;/li>
&lt;li>&lt;strong>64-बिट वातावरण में पॉइंटर का आकार&lt;/strong>: आधुनिक Windows मूल रूप से 64-बिट (x64) है। C++ साइड में पॉइंटर का आकार 8 बाइट्स होता है, इसलिए आपको PowerShell (.NET) साइड पर &lt;code>IntPtr&lt;/code> का उपयोग करना चाहिए। चूँकि C++ का &lt;code>long&lt;/code> Windows में 4 बाइट्स का होता है, इसलिए पुराने कोड जहाँ पॉइंटर को &lt;code>long&lt;/code> में कास्ट करके पास किया जाता है, क्रैश का कारण बन सकते हैं।&lt;/li>
&lt;li>&lt;strong>स्ट्रिंग एन्कोडिंग बेमेल (Mismatch)&lt;/strong>: PowerShell आंतरिक रूप से UTF-16 का उपयोग करता है। यदि आप इसे C++ साइड में ANSI स्ट्रिंग (&lt;code>std::string&lt;/code>, &lt;code>char*&lt;/code>) के रूप में प्राप्त करने का प्रयास करते हैं, तो टेक्स्ट विकृत (garbled) हो जाएगा। हमेशा वाइड स्ट्रिंग (&lt;code>std::wstring&lt;/code>, &lt;code>wchar_t*&lt;/code>) का उपयोग करें, और सुनिश्चित करें कि P/Invoke साइड पर &lt;code>CharSet = CharSet.Unicode&lt;/code> निर्दिष्ट किया गया है।&lt;/li>
&lt;/ol>
&lt;h2 id="नषकरष">निष्कर्ष
&lt;/h2>&lt;p>PowerShell और C++ का एकीकरण सिस्टम प्रबंधन स्वचालन में एक शक्तिशाली संयोजन है जो एक स्क्रिप्टिंग भाषा की सरलता को एक नेटिव भाषा की शक्ति के साथ संतुलित करता है।&lt;/p>
&lt;p>P/Invoke का उपयोग करके C++ DLL को कॉल करके, आप गणना-गहन (compute-intensive) कार्यों को ऑफलोड कर सकते हैं और निष्पादन समय को नाटकीय रूप से कम कर सकते हैं। इसके विपरीत, C++ एप्लिकेशन से प्रक्रिया प्रारंभ (process start) या पाइपलाइनों के माध्यम से PowerShell के समृद्ध सिस्टम प्रबंधन मॉड्यूल का उपयोग करके, आप विकास लागतों को काफी कम कर सकते हैं।&lt;/p>
&lt;p>यद्यपि सीमाओं (boundaries) पर मेमोरी प्रबंधन और स्ट्रिंग रूपांतरण पर ध्यान देने की आवश्यकता है, इस लेख में पेश किए गए आर्किटेक्चर पैटर्न और कार्यान्वयन तकनीकों में महारत हासिल करके, आप अधिक उन्नत और मजबूत Windows सिस्टम प्रबंधन उपकरण बनाने में सक्षम होंगे।&lt;/p>
&lt;hr>
&lt;p>&lt;em>इस तकनीकी ब्लॉग में, हम भविष्य में Windows आंतरिक संरचना और उन्नत स्वचालन से संबंधित गहन विषयों को कवर करना जारी रखेंगे। यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो कृपया उन्हें टिप्पणी अनुभाग (comment section) में छोड़ दें।&lt;/em>&lt;/p></description></item></channel></rss>