আমাদের কখন ইউজশেলএক্সিকিউট সেট করতে হবে?


134
//
// Summary:
//     Gets or sets a value indicating whether to use the operating system shell
//     to start the process.
//
// Returns:
//     true to use the shell when starting the process; otherwise, the process is
//     created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }

যদি আমরা একটি নতুন প্রক্রিয়া বানান, আমাদের কখন ব্যবহারের শেলএকসেকিউট সেট করতে হবে?

উত্তর:


202

UseShellExecuteবুলিয়ান সম্পত্তি জানালার ব্যবহার সঙ্গে সম্পর্কযুক্ত ShellExecute ফাংশন বনাম CreateProcess ফাংশন - সংক্ষিপ্ত উত্তর যদি হয় UseShellExecuteসত্য তারপর Processবর্গ ব্যবহার করবে ShellExecuteফাংশন, অন্যথায় এটি ব্যবহার করা হবে CreateProcess

দীর্ঘতর উত্তরটি হ'ল ShellExecuteফাংশনটি একটি নির্দিষ্ট প্রোগ্রাম বা ফাইল খোলার জন্য ব্যবহৃত হয় - এটি রান ডায়ালগটিতে কার্যকর করতে কমান্ডটি টাইপ করা এবং ঠিক আছে ক্লিক করার সমতুল্য, যার অর্থ এটি ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ):

  • ডিফল্ট ব্রাউজারটি ব্যবহার করে এইচটিএমএল ফাইল বা ওয়েব খুলুন browser ব্রাউজারটি কী তা জানতে প্রয়োজন,
  • ওয়ার্ডের ইনস্টলেশনের পথটি কী তা জেনে ছাড়াই একটি শব্দ নথি খুলুন
  • উপর কোনও কমান্ড চালান PATH

উদাহরণ স্বরূপ:

Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();

এটি ব্যবহার করা খুব সহজ, বহুমুখী এবং শক্তিশালী তবে কিছু ত্রুটিগুলি নিয়ে আসে:

  • স্ট্যান্ডার্ড ইনপুট / আউটপুট / ত্রুটি হ্যান্ডলগুলি পুনর্নির্দেশ করা সম্ভব নয়

  • শিশু প্রক্রিয়াটির জন্য সুরক্ষা বর্ণনাকারী (বা অন্যান্য দুর্দান্ত জিনিস) নির্দিষ্ট করা সম্ভবত নয়

  • সুরক্ষা দুর্বলতাগুলি প্রবর্তন করার সম্ভাবনা রয়েছে যদি আপনি আসলে কী পরিচালিত হবে সে সম্পর্কে অনুমান করে:

     // If there is an executable called "notepad.exe" somewhere on the path 
     // then this might not do what we expect
     p.StartInfo.FileName = "notepad.exe";
     p.Start();

CreateProcessপ্রক্রিয়া শুরুর আরও নিখুঁত উপায় - এটি কোনও পথ অনুসন্ধান করে না এবং আপনাকে শিশু প্রক্রিয়াটির স্ট্যান্ডার্ড ইনপুট বা আউটপুট পুনর্নির্দেশের অনুমতি দেয় (অন্যান্য বিষয়গুলির মধ্যে)। তবে অসুবিধাটি CreateProcessহ'ল আমি উপরে যে 3 টি উদাহরণ দিয়েছি তার কোনওটিই কাজ করবে না (এটি চেষ্টা করে দেখুন)।

সংক্ষেপে, আপনার UseShellExecuteযদি মিথ্যাতে সেট করা উচিত যদি:

  • আপনি স্ট্যান্ডার্ড ইনপুট / আউটপুট / ত্রুটি পুনর্নির্দেশ করতে চান (এটি সর্বাধিক সাধারণ কারণ)
  • আপনি এক্সিকিউটেবলের জন্য পথটি অনুসন্ধান করতে চান না (যেমন সুরক্ষার কারণে)

বিপরীতভাবে আপনার UseShellExecuteসত্য হওয়া উচিত যদি আপনি ডকুমেন্টস, ইউআরএল বা ব্যাচ ফাইল ইত্যাদি খুলতে চান ... তবে এক্সিকিউটেবলের জন্য স্পষ্টভাবে পথটি না দেওয়ার চেয়ে।


2
দুর্দান্ত স্টাফ, তবে আপনি লিখেছেন যে (শেলএক্সেকিউট সহ) "" [আপনার দাবি] স্ট্যান্ডার্ড ইনপুট / আউটপুট / ত্রুটি হ্যান্ডলগুলি পুনর্নির্দেশ করা সম্ভব নয় "<- অবশ্যই এটি ভুল বা ভুল। এমনকি ব্যবহারের শেলএকসেকিউটটি সত্য হিসাবে সেট করা থাকলেও আপনি সত্যিই এটি করতে পারবেন না processStartInfo.RedirectStandardOutput=trueবলে মনে হয় আপনি এখনও স্ট্যান্ডার্ড আউটপুটটি করে পুনর্নির্দেশ করতে পারেন process.Arguments= "cmd /c dir >c:\\crp\\a.a"। একইভাবে একটি রান ডায়ালগ বাক্স থেকে আপনি যা করতে পারেনcmd /c dir>c:\crp\a.a
বার্লোপ

4
এছাড়াও, আপনি বলছেন যে যখন UseShellExecute=falseক্রিয়েটপ্রসেস, পথটি পরীক্ষা করবে না, তবে আমি দেখতে পাচ্ছি যে আমি যখন "UseShellExecute = মিথ্যা" অর্থাৎ অনুমান করি যে পথটি পরীক্ষা করা হয় না তখন প্রক্রিয়া করি। ফাইলনেম = "সেমিডি.এক্সে" কাজ করে তাই এটি হয় সি: \ উইন্ডোজ \ সিস্টেম 32 পরীক্ষা করা হচ্ছে। এবং আমি যদি সিএমডি.এক্সএকে সি: copy উইন্ডোজ কপি করে নাম দিয়ে থাকি তবে এটি আমি সিএমএমডি.এক্সই করে রাখি তবে আমি প্রক্রিয়া 1.FileName = "cmmmd.exe" করি যা খুব বেশি কাজ করে তাই এটি সি: \ উইন্ডো যাচাই করে দেখা যাচ্ছে যাতে মনে হয় এটি পথটি পরীক্ষা করছে, বা কিছু গুচ্ছ ডিরেক্টরি।
বারলপ

2
এমএসডিএন ডক্স @ বারলপের সাথে একমত: "যখন ইউজশেলএক্সেকিউটটি মিথ্যা হয়, তখন ফাইলনাম সম্পত্তিটি কার্যকরভাবে কার্যকর করার জন্য পুরোপুরি যোগ্য পথ হতে পারে, বা একটি সাধারণ এক্সিকিউটেবল নাম যা সিস্টেম PATH এনভায়রনমেন্ট ভেরিয়েবল দ্বারা নির্দিষ্ট ফোল্ডারগুলির মধ্যে অনুসন্ধানের চেষ্টা করবে" "
বব

সেট UseShellExecuteকরে trueআমি একটি পরিবেশের পরিবর্তনশীল ভাগ করতে সক্ষম হয়েছি (এটি কেবল কলিং প্রক্রিয়াতেই তৈরি হয়েছিল)। খুব সহজ
Mitkins

14

আমার মনে হয় বেশিরভাগ অ-এক্সিকিউটেবলের জন্য। উদাহরণস্বরূপ যদি কোনও .htmlফাইল খোলার চেষ্টা করা হয় , যদি আপনাকে সেট UseShellExecuteকরতে হয় trueএবং এটি .htmlএকটি ব্রাউজারে খুলবে যা ব্যবহারকারীর দ্বারা ডিফল্ট হিসাবে সেট করা আছে।


12

এমএসডিএন থেকে :

এই সম্পত্তিটিকে মিথ্যা হিসাবে সেট করা আপনাকে ইনপুট, আউটপুট এবং ত্রুটির প্রবাহকে পুনর্নির্দেশ করতে সক্ষম করে।

UseShellExecute অবশ্যই মিথ্যা হতে হবে যদি ব্যবহারকারীর নাম সম্পত্তিটি শূন্য না হয় বা একটি খালি স্ট্রিং থাকে না বা প্রসেস.স্টার্ট (প্রসেসস্টার্টআইএনফো) পদ্ধতিটি কল করার সময় একটি অবৈধপ্রকাশ এক্স্রোশন নিক্ষেপ করা হয়।

প্রক্রিয়াগুলি শুরু করতে আপনি যখন অপারেটিং সিস্টেম শেলটি ব্যবহার করেন, আপনি যে কোনও নথি (যা কোনও নির্ধারিত ফাইলের সাথে সম্পর্কিত যা কোনও ডিফল্ট খোলার ক্রিয়াকলাপের সাথে সম্পর্কিত কোনও রেজিস্টার্ড ফাইল টাইপ) শুরু করতে পারেন এবং প্রসেস উপাদান দিয়ে মুদ্রণের মতো ফাইলটিতে অপারেশন সম্পাদন করতে পারেন। UseShellExecute মিথ্যা হলে, আপনি কেবলমাত্র প্রক্রিয়া উপাদান দিয়ে এক্সিকিউটেবল শুরু করতে পারেন।

আপনি যদি ত্রুটি ডায়ালগ বৈশিষ্ট্যটিকে সত্যে সেট করে থাকেন তবে ইউজশেলএক্সেকুট অবশ্যই সত্য হতে হবে।


0

যদি আমরা বর্তমান অ্যাপ্লিকেশন এক্সিকিউটেবল উইন্ডোটি আড়াল করতে চাই, তবে UseShellExecute টি সত্য হিসাবে সেট করা উচিত


0

যখন পাথটিতে একটি স্পেস বা অন্য কিছু বিশেষ (যেমন উচ্চারণযুক্ত) অক্ষর রয়েছে, তখন ক্রিয়েটপ্রসেস (UseShellExecute = মিথ্যা) শর্ট ফাইলের নাম ("ডস" 8.3 স্বরলিপি) ব্যবহার করা হবে বলে মনে হয়, শেলএক্সেকিউট (UseShellExecute = সত্য) দীর্ঘ ফাইলের নাম ব্যবহার করে। সুতরাং যখন আপনি UseShellExecute = মিথ্যা ব্যবহার করেন, তখন আপনার ডিরেক্টরি এবং ফাইলের নামগুলি 8.3 নামগুলিতে (গুগল "। নেট কীভাবে 8.3 ফাইল নাম পাবেন") রূপান্তর করতে ভুলবেন না। (উইন্ডোজ versions, এনটিএফএসে পরীক্ষিত উইন্ডোজ সংস্করণ এবং / অথবা ফাইল সিস্টেমগুলি কীভাবে এটি করে তা সুনির্দিষ্টভাবে নিশ্চিত নয়)


এটি কি এমন হতে পারে যে এটি কেবলমাত্র জায়গাতেই পথ কেটে ফেলছে? "পথ / প্রোগ্রামের নাম" এর চারপাশে উদ্ধৃতি প্রদান করা এটি সমাধান করে।
gbarry
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.