আজকের Windows শেল ইন্টিগ্রেশন ── কনটেক্সট মেনু, ফাইল অ্যাসোসিয়েশন, আর Windows 11-এ কী বদলেছে
· Go Komura · Windows, শেল এক্সটেনশন, কনটেক্সট মেনু, ফাইল অ্যাসোসিয়েশন, COM, Windows 11, ফাইল এক্সপ্লোরার, MSIX, Windows ডেভেলপমেন্ট
আমাকে পরামর্শ চাওয়া হয়েছিল: «PCগুলো Windows 11-এ বদলেছি, আর বছর আগে আপনাদের তৈরি অ্যাপের কনটেক্সট মেনু উধাও»। আর মন দিয়ে শুনলে উধাও হয়নি। ফাইলে রাইট-ক্লিক করুন, মেনু তলার “আরও অপশন দেখান” বেছে নিন, আর চেনা মেনু আগের মতোই আসে। অর্থাৎ ইন-হাউস অ্যাপের মেনু আইটেম আর এক ক্লিক ভিতরে লুকিয়েছে। মাঠ থেকে «এক ক্লিক বেশি» আর «আইটেম খুঁজে পাই না, এমন জিজ্ঞাসা বেড়েছে» শোনা যায়।
এটা না ত্রুটি না ভুল কনফিগারেশন; এটা Windows 11-এর ডিজাইন পরিবর্তন। ফাইল এক্সপ্লোরারের কনটেক্সট মেনু পুরনো ও নতুন দুই-স্তর কাঠামো হয়ে গেছে, আর নতুন মেনুতে আইটেম তোলার শর্ত আগের থেকে সম্পূর্ণ আলাদা জিনিস।
এদিকে নিচের ফাইল-অ্যাসোসিয়েশন ও শেল-এক্সটেনশন যন্ত্রপাতি এখনও COM ও রেজিস্ট্রির পুরনো জগৎ। এক্সটেনশন কী ProgID দেখায়, ProgID-এর verb কমান্ড লাইন রাখে, আর জটিলতর এক্সটেনশন এক্সপ্লোরারে লোড হওয়া ইন-প্রসেস COM সার্ভার (DLL) হিসেবে চলে — এই কাঠামো বিশ বছরের বেশি বদলায়নি। অপরিবর্তিত ভিত্তি আর Windows 11 দুই ভাগে ভাগ করা মেনু দুটো না জানলে «মেনু দেখা যায় না», «লুকিয়েছে» বা «দুবার দেখা যায়» আলাদা করা যায় না।
এই নিবন্ধ ছোট-মাঝারি প্রতিষ্ঠানের IT কর্মী ও ব্যবসায়িক অ্যাপ সামলানো Windows ডেভেলপারদের জন্য। এক ছবিতে ফাইল অ্যাসোসিয়েশনের তিন-স্তর কাঠামো, ক্লাসিক শেল এক্সটেনশনের সতর্কতা, Windows 11 নতুন কনটেক্সট মেনু লক্ষ্য করা, আর ইনস্টলার নিবন্ধন, পরিষ্কার ও সমস্যা সমাধান বেঁধে দেয়।
1. আগে উপসংহার
- কনটেক্সট মেনু ও ফাইল অ্যাসোসিয়েশনের ভিত্তি তিন-স্তর রেজিস্ট্রি কাঠামো «এক্সটেনশন কী → ProgID → verb»। এক্সটেনশন কী ProgID-এর পয়েন্টার, ProgID সারবস্তু, আর তার নিচে
shell\<verb>\commandকমান্ড লাইন রাখে।1 - HKEY_CLASSES_ROOT (HKCR) স্বাধীন হাইভ নয়; এটা HKLM\Software\Classes ও HKCU\Software\Classes-এর মার্জড ভিউ। সব-ব্যবহারকারী নিবন্ধন HKLM-এ লিখুন, প্রতি-ব্যবহারকারী HKCU-তে, HKCR শুধু-পঠন ধরুন।2
- ডিফল্ট অ্যাপ (ডাবল-ক্লিকে যেটা খোলে) ব্যবহারকারী বেছে নেবে বলে ডিজাইন, প্রোগ্রাম চুরি করতে পারে না। OS ব্যবহারকারীর পছন্দ রক্ষা করে; ইনস্টলার প্রার্থী হিসেবে নিবন্ধন করতে পারে।3
- ক্লাসিক শেল এক্সটেনশন এক্সপ্লোরারে লোড হওয়া ইন-প্রসেস COM DLL। এক্সটেনশনের ক্র্যাশ বা বিলম্ব পুরো এক্সপ্লোরারে (ও শেল ব্যবহার করা অন্য অ্যাপে) ছড়ায়; ৬৪-বিট পরিবেশে ৬৪-বিট DLL লাগে; ম্যানেজড-কোড বাস্তবায়ন অসমর্থিত।45
- Windows 11-এ কনটেক্সট মেনু দুই ভাগ হয়েছে। নতুন মেনুতে শুধু IExplorerCommand প্লাস প্যাকেজ পরিচয়ে নিবন্ধিত কমান্ড দেখা যায়; ক্লাসিক IContextMenu এক্সটেনশন «আরও অপশন দেখান» (Shift+F10)-এর পুরনো মেনুতে সরে যায়।67
- নতুন মেনুতে কাস্টম কমান্ড তোলার সরকারি পথ IExplorerCommand বাস্তবায়ন করা নেটিভ DLL MSIX ম্যানিফেস্টে (desktop4:FileExplorerContextMenus) নিবন্ধন। যে অ্যাপ MSIX হতে পারে না তাকে শুধু পরিচয় sparse package (বাহ্যিক অবস্থানের MSIX) দিয়ে দেওয়া যায়।78
- শুধু «এই অ্যাপ দিয়ে খুলুন» চাইলে অ্যাসোসিয়েশন ও স্ট্যাটিক verb এখনও যথেষ্ট। শেল-এক্সটেনশন DLL লাগে না, Microsoft নিজেই স্পষ্ট বলে «প্রয়োজন মেটানো সবচেয়ে সরল পদ্ধতি বেছে নিন (স্ট্যাটিক verb)»।9
- নিবন্ধন বা পরিবর্তনের পর SHChangeNotify(SHCNE_ASSOCCHANGED) দিয়ে জানান; আনইনস্টলে ProgID মুছুন কিন্তু এক্সটেনশন কীর ডিফল্ট মান মুছবেন না — এটাই সরকারি নির্দেশ। শেল ইন্টিগ্রেশনে পরিষ্কারের ডিজাইনও আছে।110
এক বাক্যে: অ্যাসোসিয়েশন ও verb-এর জগৎ বদলায়নি; শুধু মেনু কীভাবে দেখানো হয় Windows 11-এ দুই ভাগ হয়েছে। নিচে ভিত্তি থেকে উপরে চলি।
2. ফাইল অ্যাসোসিয়েশন কীভাবে কাজ করে ── তিন-স্তর কাঠামো এক্সটেনশন কী → ProgID → verb
2.1. এক উদাহরণ থেকে তিন-স্তর কাঠামো পড়া
কোনো নির্দিষ্ট এক্সটেনশনের ফাইলে ডাবল-ক্লিক করলে কী হয়, তিন স্তরের রেজিস্ট্রি কী ঠিক করে।1
HKEY_CLASSES_ROOT
.kmrpt ← (1) এক্সটেনশন কী
(Default) = KomuraSoft.Report.1 ← শুধু ProgID নাম দেওয়া পয়েন্টার
OpenWithProgids
KomuraSoft.Report.1 ← «এ দিয়ে খুলুন»-এর প্রার্থী
KomuraSoft.Report.1 ← (2) ProgID (অ্যাসোসিয়েশনের সারবস্তু)
(Default) = Komura Report document
DefaultIcon
(Default) = "C:\Program Files\KomuraSoft\Report.exe",0
shell ← (3) verb-এর তালিকা
open
command
(Default) = "C:\Program Files\KomuraSoft\Report.exe" "%1"
- (1) এক্সটেনশন কী (
.kmrpt) শুধু ডিফল্ট মান হিসেবে ProgID নাম দেখায়। এখানে সরাসরি কমান্ড লেখা ভুল। - (2) ProgID (
KomuraSoft.Report.1) অ্যাসোসিয়েশনের সারবস্তু; ডিসপ্লে নাম, আইকন ও verb তালিকা রাখে। - (3) verb «খুলুন» বা «প্রিন্ট»-এর মতো কাজ, আর
shell\open\command-এর ডিফল্ট মানই আসলে চালু হওয়া কমান্ড লাইন।
এই আলাদা থাকার জন্যই একাধিক এক্সটেনশন (যেমন .kmrpt ও .kmrpt-file) একই ProgID-এ দেখানো যায়, বা অ্যাপ আপগ্রেডে ProgID বদলানো যায়।
flowchart TB
accTitle: ফাইল অ্যাসোসিয়েশনের তিন-স্তর কাঠামো
accDescr: এক্সটেনশন কী একটি পয়েন্টার যার ডিফল্ট মান ProgID নাম দেয়; ProgID সারবস্তু যা ডিসপ্লে নাম, আইকন ও verb তালিকা রাখে; আর verb-এর নিচে command-এর ডিফল্ট মানই আসলে চালু হওয়া কমান্ড লাইন
ext["এক্সটেনশন কী .kmrpt"] -->|ডিফল্টে ProgID নাম| pid["ProgID KomuraSoft.Report.1"]
pid --> vb["verb (shell-এর নিচে open ইত্যাদি)"]
vb --> cmd["command-এর ডিফল্ট মান"]
cmd --> exe["Report.exe চালু হয়"]
pid -.-> attr["ডিসপ্লে নাম ও DefaultIconও রাখে"]
চিত্র 1: এক্সটেনশন কী পয়েন্টার, ProgID সারবস্তু, আর verb-এর command আসলে চালু হওয়া কমান্ড লাইন।
2.2. HKCR «মার্জড ভিউ» ── কোথায় লিখলে অর্থ বদলায়
উপরের উদাহরণ HKEY_CLASSES_ROOT (HKCR)-এর নিচে দেখানো, কিন্তু HKCR ভৌত সংরক্ষণ স্থান নয়; এটা HKLM\Software\Classes ও HKCU\Software\Classes-এর মার্জড ভিউ। দুই দিকে একই কী থাকলে HKCU দিক জিতে।2
flowchart TB
accTitle: HKCR মার্জড ভিউ
accDescr: HKCR হলো HKLM ও HKCU Classes একের ওপর এক; দুই দিকে একই কী থাকলে HKCU জিতে; নিবন্ধন স্পষ্ট করে HKLM বা HKCU-তে লিখুন, HKCR শুধু-পঠন ধরুন
hklm["HKLM\\Software\\Classes (সব ব্যবহারকারী)"] --> hkcr["HKCR (মার্জড ভিউ)"]
hkcu["HKCU\\Software\\Classes (প্রতি ব্যবহারকারী)"] --> hkcr
hkcu -.-> win["একই কী থাকলে HKCU জিতে"]
hkcr -.-> ro["শুধু-পঠন ধরুন (নিশ্চিতকরণে)"]
চিত্র 2: HKCR হলো HKLM ও HKCU Classes একসঙ্গে দেখার রূপ; লেখার গন্তব্য সবসময় এক দিক নাম দিন।
| লেখার গন্তব্য | অর্থ | প্রয়োজনীয় অধিকার |
|---|---|---|
HKLM\Software\Classes |
সব ব্যবহারকারীর সাধারণ নিবন্ধন | অ্যাডমিনিস্ট্রেটর |
HKCU\Software\Classes |
শুধু সেই ব্যবহারকারীর নিবন্ধন | কিছু নয় |
সরাসরি HKCR-এ লেখা |
বিদ্যমান কী আগে কোথায় আছে সেই অনুসারে বণ্টন | নির্ভর করে |
ব্যবহারে নিরাপদ ভাগ হলো নিবন্ধন সবসময় স্পষ্ট করে HKLM বা HKCU-তে লিখুন, HKCR নিশ্চিতকরণের শুধু-পঠন ধরুন। WOW64 রেজিস্ট্রি রিডাইরেকশনের সম্পর্কও সাজানো দরকার। HKLM\Software\Classes-এর ঠিক নিচে এক্সটেনশন কী ও ProgID-এর মতো অ্যাসোসিয়েশন ডেটা Windows 7 থেকে ৩২-বিট ও ৬৪-বিট রেজিস্ট্রি ভিউয়ের মধ্যে শেয়ারড, তাই ৩২-বিট ইনস্টলার লিখলে Wow6432Node দিকে পালায় না। অন্যদিকে Classes\CLSID-এর মতো কিছু COM-নিবন্ধন সাবকী রিডাইরেক্ট হয়, আর শেল এক্সটেনশন (ইন-প্রসেস COM) নিবন্ধন করলে ৩২-বিট / ৬৪-বিট লেখার ভাগ গুরুত্বপূর্ণ। বিস্তারিত «Registry 32-bit/64-bit Redirection and Virtualization Pitfalls — Wow6432Node and the "The Value I Wrote Isn’t There" Problem»-এ।
2.3. অ্যাপ দিকের নিবন্ধন ── App Paths, Applications, RegisteredApplications
ফাইল দিকের (এক্সটেনশন ও ProgID) জুড়ি হিসেবে অ্যাপ দিকেও তিন ধরনের নিবন্ধন আছে।11
- App Paths (
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths): নিবন্ধন যাShellExecuteEx-কে শুধু এক্সিকিউটেবল ফাইল নামে চালু করতে দেয়। Microsoft এটা সুপারিশ করে কারণ PATH পরিবেশ চলক নোংরা করতে হয় না। - Applications (
HKCR\Applications\<app.exe>): «এ দিয়ে খুলুন»-এর নিচে যেকোনো ফাইল হস্তান্তর হলে ডিফল্ট খোলার পদ্ধতি, আর অ্যাপের ডিসপ্লে নাম (FriendlyAppName) সংজ্ঞায়িত করে। - RegisteredApplications + Capabilities: অ্যাপ কোন এক্সটেনশন ও MIME টাইপ সামলাতে পারে ঘোষণা করে, আর এটাই Windows Default apps সেটিং পেজে প্রার্থী করে তোলে।
«আমাদের অ্যাপ Default apps তালিকায় দেখা যায় না»-জাতীয় বেশিরভাগ পরামর্শ সেই ঘটনা যেখানে ProgID নিবন্ধিত হয়েছে কিন্তু এই Capabilities নিবন্ধন বাদ পড়েছে।
flowchart TB
accTitle: অ্যাপ দিকের তিন ধরনের নিবন্ধন
accDescr: অ্যাপ-দিক নিবন্ধন তিন ধরনের ── App Paths, Applications ও RegisteredApplications ── যথাক্রমে শুধু ফাইল নামে চালু, এ দিয়ে খুলুন-এর ডিফল্ট পদ্ধতি, আর Default apps পেজে দেখা যাওয়া
app["অ্যাপ-দিক নিবন্ধন"] --> ap["App Paths"]
app --> apps["Applications"]
app --> ra["RegisteredApplications"]
ap --> r1["শুধু ফাইল নামে চালু"]
apps --> r2["এ দিয়ে খুলুন-এর ডিফল্ট"]
ra --> r3["Default apps পেজে দেখা যায়"]
r3 -.-> cap["Capabilities ঘোষণা লাগে"]
চিত্র 3: অ্যাপ-দিক নিবন্ধন তিন ধরনের, আর Default apps প্রার্থী হতে Capabilities নিবন্ধন লাগে।
2.4. ডিফল্ট অ্যাপ ব্যবহারকারীর ── UserChoice সুরক্ষা
এক্সটেনশন কীর ডিফল্ট মান হিসেবে ProgID লেখা একা তাকে ডিফল্ট অ্যাপ করে না। ব্যবহারকারী «এ দিয়ে খুলুন» ইত্যাদিতে স্পষ্ট বেছে নেওয়ার ফল HKCU\...\Explorer\FileExts\<extension>\UserChoice-এ থাকে, আর অ্যাসোসিয়েশন সমাধান সেই দিক অগ্রাধিকার দেয়।
আর গুরুত্বপূর্ণ কথা Windows প্রোগ্রাম দিয়ে ডিফল্ট অ্যাপ বদলানো সমর্থন করে না। ডিফল্ট-অ্যাপ সেটিং ব্যবহারকারী সিস্টেম Settings UI দিয়ে করবে বলে ডিজাইন; UserChoice ডেটা অস্পষ্ট, আর ফিল্টার ড্রাইভার (UCPD.sys) অ্যাপ থেকে লেখা আটকায়। পরিচালিত পরিবেশে Group Policy / MDM নীতি সরকারি উপায়।3
SetUserFTA-এর মতো টুল, যেগুলো «হ্যাশ নকল করে আবার লেখে», ব্যবহার হয়েছে — এটাই এই সুরক্ষার অন্য মুখ। ইন-হাউস অ্যাপের ইনস্টলারে ডিফল্ট চুরি নয়, বরং এই তিন রাখুন: (ক) ProgID ও verb-এর সঠিক নিবন্ধন, (খ) নিজেকে OpenWithProgIds-এ যোগ, আর (গ) দরকার হলে Settings পেজে নিয়ে যাওয়া।
flowchart TB
accTitle: ডিফল্ট-অ্যাপ সমাধান ও UserChoice সুরক্ষা
accDescr: ব্যবহারকারীর স্পষ্ট পছন্দের ফল UserChoice-এ থাকে ও অ্যাসোসিয়েশন সমাধানে অগ্রাধিকার পায়; UCPD.sys অ্যাপ থেকে আবার-লেখা আটকায়, তাই ইনস্টলার প্রার্থী হিসেবে নিবন্ধন করে Settings পেজে নিয়ে যেতে পারে
uc["UserChoice (ব্যবহারকারীর পছন্দ)"] -->|অগ্রাধিকার| res["অ্যাসোসিয়েশন সমাধান"]
ext["এক্সটেনশন-কী ডিফল্ট মান"] --> res
wr["অ্যাপ থেকে আবার লেখা"] -.->|UCPD.sys আটকায়| uc
res ~~~ inst["ইনস্টলারের কাজ"]
inst --> a1["ProgID ও verb নিবন্ধন"]
inst --> a2["OpenWithProgIds-এ যোগ"]
inst --> a3["Settings পেজে নিয়ে যান"]
চিত্র 4: অ্যাসোসিয়েশন সমাধান ব্যবহারকারীর পছন্দ (UserChoice) অগ্রাধিকার দেয়, আর OS অ্যাপের আবার-লেখা থেকে রক্ষা করে।
3. «খুলুন» ছাড়া verb ── print, edit, runas, কাস্টম verb
verb শুধু open নয়। OS অর্থ চেনে এমন স্ট্যান্ডার্ড verb-এ open-এর পাশাপাশি edit, print, play ও preview আছে, আর স্ট্যান্ডার্ড verb স্বয়ংক্রিয়ভাবে OS লোকেল অনুসরণ করা ডিসপ্লে নাম পায়। ডাবল-ক্লিকে ব্যবহৃত ডিফল্ট verb এই ক্রমে ঠিক হয়: shell কীর ডিফল্ট মান → রেজিস্ট্রির প্রথম verb → open → openwith।12
flowchart TB
accTitle: ডিফল্ট verb ঠিক হওয়ার ক্রম
accDescr: ডাবল-ক্লিকে ব্যবহৃত ডিফল্ট verb সেই প্রথমটি যা shell-কী ডিফল্ট মান, রেজিস্ট্রির প্রথম verb, open, openwith ক্রমে পাওয়া যায়
s1["shell-কী ডিফল্ট মান"] -->|না থাকলে| s2["রেজিস্ট্রির প্রথম verb"]
s2 -->|না থাকলে| s3["open"]
s3 -->|না থাকলে| s4["openwith"]
চিত্র 5: ডাবল-ক্লিকের ডিফল্ট verb এই ক্রমে পাওয়া প্রথমটি।
নিজের কাজ যোগ করতে চাইলে কাস্টম verb নিবন্ধন করুন।
KomuraSoft.Report.1
shell
open
command
(Default) = "C:\Program Files\KomuraSoft\Report.exe" "%1"
print
command
(Default) = "C:\Program Files\KomuraSoft\Report.exe" /print "%1"
verify ← কাস্টম verb
(Default) = Verify report (&V) ← মেনু ডিসপ্লে নাম
command
(Default) = "C:\Program Files\KomuraSoft\Report.exe" /verify "%1"
তিনটি ছোট তথ্য জানা কাজে লাগে।
- runas নামের verb নিবন্ধন করলে «অ্যাডমিনিস্ট্রেটর হিসেবে চালান»-এর সমতুল্য এলিভেশন লঞ্চ সংজ্ঞায়িত হয়, আর
ShellExecute-পরিবার APIrunasনির্দিষ্ট করলেও এটাই লাগে। - verb কীতে
Extendedনামের খালি মান রাখলে সেটা শুধু Shift+রাইট-ক্লিকে দেখা যায় এমন সম্প্রসারিত verb হয়। কম ব্যবহৃত বিপজ্জনক কাজ লুকাতে সুবিধা।12 - পুরনো অ্যাপের কিছু অ্যাসোসিয়েশনে এখনও DDE (
ddeexecকী) দিয়ে নথি বিদ্যমান প্রসেসে পাঠানোর কনফিগ আছে, কিন্তু DDE দিয়ে verb চালু করা ইতিমধ্যে Deprecated উত্তরাধিকার। নতুন করে লেখার কারণ নেই।12
আরেক দুর্ঘটনা প্রায়ই হয় কমান্ড লাইনের উদ্ধৃতি। কমান্ড স্ট্রিংয়ের কোনো উপাদানে স্পেস থাকতে পারলে উদ্ধৃতিতে মুড়ে দিতে হবে। এটা C:\Program Files\...-এর মতো EXE পথে অবশ্যই লাগে, আর %1 (নির্বাচিত ফাইলের পথ) সবসময় "%1" লেখা উচিত। ব্যবহারকারীর ফাইল পথে স্পেস নেই তা নিশ্চিত করা যায় না। উদ্ধৃতিহীন My Program.exe «My চালু করো আর্গুমেন্ট Program.exe দিয়ে» বলে ব্যাখ্যা হয়।13
flowchart TB
accTitle: কমান্ড লাইনের উদ্ধৃতি দুর্ঘটনা
accDescr: উদ্ধৃতিহীন কমান্ড স্পেসে কেটে যায় ও My-কে Program.exe আর্গুমেন্ট দিয়ে চালু বলে ভুল বোঝা হয়, তাই স্পেস রাখতে পারে এমন EXE পথ ও নির্বাচিত ফাইল পথ বোঝানো %1 সবসময় উদ্ধৃতিতে মুড়ুন
c1["উদ্ধৃতিহীন কমান্ড"] -->|স্পেসে কাটে| bad["অন্য EXE চালু বলে ভুল"]
c2["উদ্ধৃত কমান্ড"] --> good["ইচ্ছামতো চালু"]
c2 -.-> q1["EXE পথ উদ্ধৃতিতে মুড়ুন"]
q1 -.-> q2["%1ও সবসময় উদ্ধৃতিতে মুড়ুন"]
চিত্র 6: উদ্ধৃতিহীন কমান্ড স্পেসে ভুল কেটে যায়, তাই EXE পথ ও %1 সবসময় উদ্ধৃতিতে মুড়ুন।
এখন পর্যন্ত শুধু-রেজিস্ট্রি যন্ত্রপাতি (স্ট্যাটিক verb) কোনো DLL না লিখেই করা যায়, আর এক্সপ্লোরার অস্থির করার ঝুঁকি নেই। Microsoft নিজে বারবার বলে «শেল এক্সটেনশন লেখার আগে ভাবুন প্রয়োজন মেটানো সবচেয়ে সরল স্ট্যাটিক verbই যথেষ্ট কিনা»।9
4. ক্লাসিক শেল এক্সটেনশন ── এক্সপ্লোরারের ভিতরে চলা DLL
4.1. শেল এক্সটেনশনের ধরন
স্ট্যাটিক verb যে প্রয়োজন মেটাতে পারে না — «নির্বাচন অনুসারে মেনু গতিশীল বদলান», «আইকন বা প্রপার্টি শিট বদলান» — শেল-এক্সটেনশন হ্যান্ডলার ব্যবহার করে। প্রতিনিধি ধরন নিচে।4
| হ্যান্ডলার | প্রধান ইন্টারফেস | কী করতে পারে |
|---|---|---|
| কনটেক্সট-মেনু হ্যান্ডলার | IContextMenu + IShellExtInit | মেনু আইটেম গতিশীল যোগ ও নিয়ন্ত্রণ |
| আইকন হ্যান্ডলার / আইকন ওভারলে | IExtractIcon / IShellIconOverlayIdentifier | প্রতি-ফাইল আইকন ও ওভারলে |
| প্রপার্টি-শিট হ্যান্ডলার | IShellPropSheetExt | প্রপার্টি শিটে ট্যাব যোগ |
| থাম্বনেইল / ইনফোটিপ | IThumbnailProvider / IQueryInfo | থাম্বনেইল ভিউ ও হোভার বর্ণনা |
| ড্র্যাগ-অ্যান্ড-ড্রপ / কপি-হুক হ্যান্ডলার | IDropTarget / ICopyHook | ড্রপ বা কপি/মুভে হস্তক্ষেপ |
এগুলো সব COM ক্লাস হিসেবে বাস্তবায়িত ও CLSID দিয়ে রেজিস্ট্রিতে নিবন্ধিত। COM-এর ধারণা নিজে «What Are COM / ActiveX / OCX? - The Differences and Relationships Explained»-এ আছে।
4.2. ইন-প্রসেস COM সার্ভার হওয়ার অর্থ
ক্লাসিক শেল এক্সটেনশনের সার কথা এটা এক্সপ্লোরারে (বা সাধারণ ফাইল ডায়ালগ খোলা যেকোনো অ্যাপে) লোড হওয়া ইন-প্রসেস COM সার্ভার (DLL)। প্রতিটি সতর্কতা এখান থেকে আসে।4
- এক্সটেনশন ক্র্যাশ করলে এক্সপ্লোরার সঙ্গে পড়ে। আটকে গেলে রাইট-ক্লিক কয়েক সেকেন্ড জমে। ক্ষতি শুধু এক্সপ্লোরারেও সীমাবদ্ধ নয়; ফাইল-খোলার ডায়ালগ দেখানো প্রতি অ্যাপে পৌঁছায়।
- মেনু নির্মাণ UI থ্রেডে হয়, তাই মেনু দেখানোর সময় নেটওয়ার্ক অ্যাক্সেস বা ফাইল I/O-এর মতো ধীর কাজ করা যাবে না।
- থ্রেডিং মডেল নিয়মত
Apartmentনিবন্ধন করুন।
flowchart TB
accTitle: ইন-প্রসেস এক্সটেনশনের পার্শ্বক্ষতির কাঠামো
accDescr: শেল-এক্সটেনশন DLL শুধু এক্সপ্লোরারে নয়, ফাইল ডায়ালগ খোলা যেকোনো অ্যাপের প্রসেসেও লোড হয়, তাই এক্সটেনশনের ক্র্যাশ বা হ্যাং পুরো হোস্ট প্রসেসে ছড়ায়
dll["শেল-এক্সটেনশন DLL"] -->|ইন-প্রসেস লোড| exp["এক্সপ্লোরার"]
dll -->|ইন-প্রসেস লোড| any["ডায়ালগ খোলা যেকোনো অ্যাপ"]
exp --> dmg["ক্র্যাশ বা হ্যাং ছড়ায়"]
any --> dmg
dmg -.-> rule["দেখানোর সময় ধীর কাজ নয়"]
চিত্র 7: এক্সটেনশন DLL হোস্ট প্রসেসের ভিতরে চলে, তাই ক্র্যাশ বা হ্যাং পুরো হোস্টে ছড়ায়।
«নির্দিষ্ট ফোল্ডার খুললে এক্সপ্লোরার জমে» বা «রাইট-ক্লিক পাঁচ সেকেন্ড লাগে»-জাতীয় পরামর্শ তদন্ত করলে কারণ ইন-হাউস অ্যাপ নয়, তৃতীয় পক্ষের শেল এক্সটেনশন হওয়া বিরল নয়। আলাদা করার পদ্ধতি অধ্যায় ৮-এ।
4.3. বিটনেস মেলানো ── ৬৪-বিট পরিবেশে ৬৪-বিট DLL লাগে
ইন-প্রসেস DLL-কে লোড করা প্রসেসের বিটনেসের সঙ্গে মিলতে হবে। ৬৪-বিট Windows-এ এক্সপ্লোরার ৬৪-বিট প্রসেস, তাই শুধু ৩২-বিট তৈরি শেল-এক্সটেনশন DLL কখনো লোড হয় না ও মেনুতে একেবারে দেখা যায় না। কোনো ত্রুটিও নেই, তাই «নিবন্ধন করেছি কিন্তু দেখা যায় না»-এর নিয়মিত কারণ। ৩২-বিট অ্যাপ বডি সঙ্গে ৬৪-বিট শেল-এক্সটেনশন DLL বৈধ কনফিগ, কিন্তু COM নিবন্ধন বিটনেস অনুসারে ভাগ হয় (Wow6432Node) — এটা দেখতে হবে। verb-এর command থেকে চালু আলাদা-প্রসেস EXE, তাই এই বাধার অধীন নয় (৩২-বিট EXE রেখে দেওয়া ঠিক)।
flowchart TB
accTitle: শেল-এক্সটেনশন DLL-এর বিটনেস মিল
accDescr: ৬৪-বিট এক্সপ্লোরার শুধু ৬৪-বিট শেল-এক্সটেনশন DLL লোড করতে পারে; শুধু-৩২-বিট DLL মেনুতে দেখা যায় না ও ত্রুটি দেয় না; verb কমান্ড থেকে চালু EXE আলাদা প্রসেস ও বাধার অধীন নয়
exp["৬৪-বিট এক্সপ্লোরার"] -->|লোড করতে পারে| d64["৬৪-বিট শেল-এক্সটেনশন DLL"]
exp -.->|লোড করতে পারে না| d32["শুধু-৩২-বিট DLL"]
d32 -.-> sym["মেনুতে দেখা যায় না, ত্রুটি ছাড়া"]
exe["verb থেকে চালু EXE"] -->|আলাদা প্রসেস| ok32["৩২-বিট রাখা ঠিক"]
চিত্র 8: ৬৪-বিট এক্সপ্লোরারে লোড হয় শুধু ৬৪-বিট DLL; verb থেকে চালু EXE এই বাধার অধীন নয়।
4.4. ম্যানেজড কোডে কেন লেখা যাবে না
প্রায়ই প্রশ্ন আসে «C#-এ শেল এক্সটেনশন লিখতে পারি কি», কিন্তু Microsoft স্পষ্ট বলেছে ম্যানেজড কোডে (.NET) ইন-প্রসেস শেল এক্সটেনশন লেখা সুপারিশকৃত নয় ও সমর্থনের বাইরে।5
কারণ এক্সটেনশন যেকোনো প্রসেসে লোড হয়। CLR ভার্সন সংঘাত (বিশেষত .NET Framework 4-এর নিচে), লক অপেক্ষা করতে CLR-এর মেসেজ লুপে আবার ঢোকা, আর গারবেজ কালেকশনের অনির্ধারিত অবজেক্ট আয়ুষ্কাল COM রেফারেন্স-কাউন্ট চুক্তির সঙ্গে সংঘাত — এগুলো কাঠামোগত কারণে হোস্ট অ্যাপ অস্থির হয়। কিছু বিষয় .NET Framework 4 ও পরে এবং আধুনিক .NET-এ নরম হয়েছে, কিন্তু সরকারি অবস্থান বদলায়নি।
ব্যবহারিক নির্দেশ সরল। ইন-প্রসেস এক্সটেনশন নেটিভ C++-এ লিখুন। ম্যানেজড কোড চাইলে verb-এর command থেকে চালু সাধারণ EXE করুন, বা আলাদা প্রসেসে চলা আউট-অফ-প্রসেস এক্সটেনশন (প্রিভিউ হ্যান্ডলার ইত্যাদি)।5
flowchart TB
accTitle: ম্যানেজড কোড অনুমতির বিচার
accDescr: এক্সপ্লোরারের ভিতরে চলা ইন-প্রসেস এক্সটেনশন নিয়মত নেটিভ C++-এ লেখা; ম্যানেজড কোড চাইলে verb কমান্ড থেকে চালু সাধারণ EXE বা আলাদা প্রসেসে চলা আউট-অফ-প্রসেস এক্সটেনশন করুন
q1{"ইন-প্রসেস চলে?"} -->|হ্যাঁ| cpp["নেটিভ C++-এ লিখুন"]
q1 -->|না| mg["ম্যানেজড কোড ঠিক"]
cpp -.-> why["CLR / রিএন্ট্রেন্সি ঝুঁকিতে হোস্ট অস্থির হয়"]
mg --> e1["verb-চালু EXE"]
mg --> e2["আউট-অফ-প্রসেস প্রিভিউ"]
চিত্র 9: ইন-প্রসেস এক্সটেনশন নিয়মত নেটিভ C++; ম্যানেজড কোড আলাদা প্রসেসে চলা কনফিগে সীমাবদ্ধ।
5. Windows 11-এর নতুন কনটেক্সট মেনু ── দুই ভাগ হওয়া মেনু
5.1. কী ঘটেছে
Windows 11 ফাইল এক্সপ্লোরারের কনটেক্সট মেনু নতুন করেছে। কাট, কপি ইত্যাদি উপরের আইকন সারি হয়েছে; «খুলুন» ও «এ দিয়ে খুলুন» উপরে জড়ো; আর অ্যাপ যোগ করা কমান্ড শেলের স্ট্যান্ডার্ড কমান্ডের নিচে জড়ো হয়। এক অ্যাপ একাধিক কমান্ড যোগ করলে সেগুলো অ্যাপ-নামের ফ্লাইআউটে (সাবমেনু) জমা হয়।6
আর নির্ণায়ক কথা এই। ক্লাসিক IContextMenu-ভিত্তিক শেল এক্সটেনশন মুছে যায়নি; সেগুলো «আরও অপশন দেখান» (Shift+F10) দিয়ে খোলা পুরনো-মেনু দিকে সরানো হয়েছে, যা Windows 10 মেনু যেমন আছে তেমন লোড করে।6 শুরুর পরামর্শ «মেনু লুকিয়েছে»-এর পরিচয় এই ভাগ।
flowchart TB
accTitle: Windows 11 দুই ভাগ করা কনটেক্সট মেনু
accDescr: রাইট-ক্লিকে আগে খোলে নতুন মেনু; সেখানে শুধু IExplorerCommand ও প্যাকেজ পরিচয়ে নিবন্ধিত কমান্ড দেখা যায়; ক্লাসিক IContextMenu এক্সটেনশন আরও অপশন দেখান দিয়ে খোলা পুরনো মেনুতে সরে যায়
rc["ফাইলে রাইট-ক্লিক"] --> newm["নতুন মেনু (Windows 11)"]
newm --> newi["IExplorerCommand + পরিচয় কমান্ড"]
newm -->|আরও অপশন Shift+F10| oldm["পুরনো মেনু (Windows 10 মেনু)"]
oldm --> oldi["ক্লাসিক IContextMenu এক্সটেনশন"]
newi -.-> fly["একাধিক কমান্ড ফ্লাইআউটে জমা"]
চিত্র 10: নতুন মেনুতে শুধু IExplorerCommand + পরিচয় কমান্ড দেখা যায়; ক্লাসিক এক্সটেনশন পুরনো-মেনু দিকে সরে যায়।
5.2. নতুন মেনুতে সরকারি পথ ── IExplorerCommand + ম্যানিফেস্ট নিবন্ধন
নতুন মেনুতে কাস্টম কমান্ড তোলার একটাই উপায়। IExplorerCommand ইন্টারফেস বাস্তবায়ন করা নেটিভ DLL প্রস্তুত করুন, আর MSIX প্যাকেজ ম্যানিফেস্টে COM সার্ভার ও কনটেক্সট-মেনু এক্সটেনশন ঘোষণা করুন।7
<!-- Package manifest (excerpt) -->
<com:Extension Category="windows.comServer">
<com:ComServer>
<com:SurrogateServer DisplayName="Komura commands">
<com:Class Id="01234567-89AB-CDEF-0123-456789ABCDEF"
Path="KomuraCommand.dll" ThreadingModel="STA" />
</com:SurrogateServer>
</com:ComServer>
</com:Extension>
<desktop4:Extension Category="windows.fileExplorerContextMenus">
<desktop4:FileExplorerContextMenus>
<desktop5:ItemType Type=".kmrpt">
<desktop5:Verb Id="VerifyReport"
Clsid="01234567-89AB-CDEF-0123-456789ABCDEF" />
</desktop5:ItemType>
</desktop4:FileExplorerContextMenus>
</desktop4:Extension>
ItemType-এর Type নির্দিষ্ট এক্সটেনশন, বা * (সব ফাইল), Directory (ফোল্ডার), বা Directory\Background (ফোল্ডার ব্যাকগ্রাউন্ড) নির্দিষ্ট করতে পারে। DLL এক্সপ্লোরারের আর্কিটেকচারের (৬৪-বিট / ARM64) সঙ্গে মেলান।7
IExplorerCommand নিজে Windows 7 যুগ থেকে থাকা ইন্টারফেস; আপনি শিরোনাম (GetTitle), আইকন (GetIcon), সক্রিয় / নিষ্ক্রিয় / লুকানো অবস্থা (GetState) ও চালনা (Invoke) বাস্তবায়ন করেন। মেথডগুলো UI থ্রেড থেকে ডাকা হয়, তাই নেটওয়ার্ক রিসোর্সে অ্যাক্সেস নিষিদ্ধ, আর মেনু-নির্মাণ মেথড দ্রুত ফিরতে হবে। ভারী কাজ Invoke-এর পরে।147
flowchart TB
accTitle: নতুন-মেনু নিবন্ধনের ম্যানিফেস্ট কাঠামো
accDescr: MSIX ম্যানিফেস্টের COM-সার্ভার ঘোষণা CLSID-কে DLL-এ ম্যাপ করে, আর কনটেক্সট-মেনু-এক্সটেনশন ঘোষণা ItemType ও Verb দিয়ে লক্ষ্য ও বাস্তবায়ন বাঁধে, তাই কাস্টম কমান্ড নতুন মেনুতে দেখা যায়
man["MSIX ম্যানিফেস্ট"] --> com["COM-সার্ভার ঘোষণা"]
man --> ctx["মেনু-এক্সটেনশন ঘোষণা"]
com -->|CLSID-কে DLL-এ ম্যাপ| impl["IExplorerCommand বাস্তবায়ন DLL"]
ctx -->|ItemType ও Verb দিয়ে নির্দিষ্ট| impl
impl --> shown["কমান্ড নতুন মেনুতে দেখা যায়"]
ctx -.-> tgt["লক্ষ্য এক্সটেনশন, সব ফাইল ইত্যাদি"]
চিত্র 11: ম্যানিফেস্টের দুই ঘোষণা বাস্তবায়ন DLL-কে লক্ষ্যের সঙ্গে বাঁধে, আর কমান্ড নতুন মেনুতে দেখা যায়।
5.3. অ-প্যাকেজড অ্যাপের বিকল্প ── sparse package দিয়ে শুধু পরিচয়
«আমাদের অ্যাপ MSI ছাড়া বিতরণ করা যায় না; MSIX অসম্ভব»-এর পালানোর দরজা sparse package (বাহ্যিক অবস্থানের MSIX)। আপনি শুধু ম্যানিফেস্টের ছোট MSIX স্বাক্ষর করেন, অ্যাপ বডি ছাড়া, আর বিদ্যমান ইনস্টলারের শেষে নিবন্ধন করেন। অ্যাপ তখন প্যাকেজ পরিচয় পায়, আর উপরের ম্যানিফেস্ট নিবন্ধন (= নতুন মেনুতে দেখা) সম্ভব হয়। Windows 10 সংস্করণ 2004 থেকে পাওয়া যায়, প্যাকেজের লক্ষ্য মেশিনে বিশ্বস্ত সার্টিফিকেট স্বাক্ষর লাগে।8
flowchart TB
accTitle: sparse package দিয়ে পরিচয় পাওয়ার প্রবাহ
accDescr: বিদ্যমান ইনস্টলার অ্যাপ বডি রাখার পর, শুধু-ম্যানিফেস্ট sparse package বাহ্যিক অবস্থান দিয়ে নিবন্ধন করলে অ্যাপ প্যাকেজ পরিচয় পায় ও নতুন-মেনু ম্যানিফেস্ট নিবন্ধন সম্ভব হয়
inst["বিদ্যমান ইনস্টলার"] --> files["অ্যাপ বডি রাখুন"]
sp["sparse package"] -.-> only["শুধু ম্যানিফেস্ট, বডি নেই"]
files --> reg["বাহ্যিক অবস্থান দিয়ে নিবন্ধন"]
sp --> reg
reg --> id["প্যাকেজ পরিচয় পান"]
id --> ok["নতুন-মেনু নিবন্ধন সম্ভব"]
sp -.-> sign["বিশ্বস্ত স্বাক্ষর লাগে"]
চিত্র 12: বডিহীন sparse package বাহ্যিক অবস্থান দিয়ে নিবন্ধন করুন, অ্যাপ প্যাকেজ পরিচয় পায়।
সবচেয়ে বড় সুবিধা ইনস্টলার বদলাতে হয় না; যাদের আগে থেকে MSI/EXE ইনস্টলার সম্পদ আছে তাদের জন্য এটাই বাস্তবসম্মত উত্তর। পুরো MSIX স্থানান্তরের তুলনার জন্য «Choosing a Windows App Distribution Method - MSI/MSIX/ClickOnce/xcopy/Custom Updater»ও দেখুন।
5.4. অ্যাসোসিয়েশন verb নতুন মেনুতে কীভাবে দেখা যায়
ভুল বোঝার সহজ বিন্দু: অধ্যায় ২ ও ৩-এর অ্যাসোসিয়েশন (ProgID ও verb) নতুন মেনুতে এখনও জীবিত। ডাবল-ক্লিকের ডিফল্ট verb, «খুলুন», আর «এ দিয়ে খুলুন» প্রার্থী অ্যাসোসিয়েশন থেকে সমাধান হয়ে নতুন মেনু উপর দেখা যায়। তাই শুধু «এই অ্যাপ দিয়ে খুলতে পারা» চাইলে Windows 11-এ বাড়তি কাজ লাগে না। অন্যদিকে, অ্যাসোসিয়েশন সাধারণ-উদ্দেশ্য মেনু এক্সটেনশন নয়, তাই নতুন মেনু প্রথম স্তরে যেকোনো কাস্টম কমান্ড চাইলে IExplorerCommand প্লাস পরিচয় — এটাই ভূমিকা ভাগ।7
flowchart TB
accTitle: অ্যাসোসিয়েশন ও নতুন মেনু ভূমিকা ভাগ
accDescr: ProgID-ও-verb অ্যাসোসিয়েশন নতুন মেনুতে এখনও ডিফল্ট verb, খুলুন ও এ দিয়ে খুলুন সমাধানে ব্যবহৃত ও উপরে দেখা যায়; নতুন মেনু প্রথম স্তরে যেকোনো কাস্টম কমান্ডের জন্য IExplorerCommand ও পরিচয় লাগে
assoc["অ্যাসোসিয়েশন (ProgID + verb)"] --> sol["ডিফল্ট / খুলুন সমাধান"]
sol --> top["নতুন মেনু উপর"]
assoc -.-> keep["Win11-এ বাড়তি কাজ নেই"]
cmd["কাস্টম কমান্ড"] --> need["IExplorerCommand+পরিচয়"]
need --> first["নতুন মেনু প্রথম স্তর"]
চিত্র 13: অ্যাসোসিয়েশন নতুন মেনুতে এখনও «খুলুন» পরিবার সমাধান করে; শুধু কাস্টম কমান্ডে IExplorerCommand প্লাস পরিচয় লাগে।
6. ব্যবহারিক সিদ্ধান্ত সারণি ── তিন বিকল্পের কোনটা
এখন পর্যন্তকে ব্যবহারিক তিন-দিকের পছন্দে সাজাই।
| কী অর্জন করতে চান | সুপারিশকৃত উপায় | Windows 11-এ দেখা | প্রয়োজনীয় কাজ ও খরচ |
|---|---|---|---|
| (ক) ডাবল-ক্লিক বা «খুলুন»-এ ইন-হাউস অ্যাপ চালু | অ্যাসোসিয়েশন + স্ট্যাটিক verb (শুধু রেজিস্ট্রি নিবন্ধন) | নতুন মেনু «খুলুন» ও «এ দিয়ে খুলুন»-এ একীভূত | শুধু ইনস্টলার রেজিস্ট্রি নিবন্ধন। DLL নেই, বাড়তি স্বাক্ষর প্রয়োজন নেই |
| (খ) নির্বাচিত ফাইল/ফোল্ডারের কাস্টম কমান্ড নতুন মেনুতে | IExplorerCommand বাস্তবায়ন + MSIX ম্যানিফেস্ট নিবন্ধন। অ-প্যাকেজড অ্যাপ sparse package দিয়ে পরিচয় পায় | নতুন মেনু প্রথম স্তর (একাধিক কমান্ড অ্যাপ-নাম ফ্লাইআউটে) | নেটিভ C++ DLL + প্যাকেজ পরিচয় + কোড স্বাক্ষর |
| (গ) বিদ্যমান ক্লাসিক IContextMenu এক্সটেনশন চালিয়ে যান | আপাতত যেমন আছে তেমন রাখুন (নতুন উন্নয়নে বেছে নেবেন না) | শুধু পুরনো-মেনু দিক, «আরও অপশন দেখান» (Shift+F10)-এর নিচে | ৬৪-বিট বিল্ড ও COM নিবন্ধন রক্ষা করুন। পরে (খ)-তে যাওয়ার পরিকল্পনা |
দুই বিচারবিন্দু। প্রথম, (ক) যে প্রয়োজন মেটায় তার জন্য (খ) বা (গ) আনবেন না। শেল এক্সটেনশন লিখলেই এক্সপ্লোরারের স্থিতিশীলতার দায় আপনার। দ্বিতীয়, (গ) শুধু «ভাঙেনি»; ব্যবহারকারী অভিজ্ঞতায় এক ধাপ খারাপ থাকে। দৈনন্দিন চালনায় যত বেশি কমান্ড লাগে, (খ)-তে যাওয়ার ফল তত বড়।
flowchart TB
accTitle: তিন বিকল্পে কীভাবে বেছে নেবেন
accDescr: শুধু ডাবল-ক্লিক বা খুলুনে চালু চাইলে অ্যাসোসিয়েশন ও স্ট্যাটিক verb যথেষ্ট; নতুন মেনুতে কাস্টম কমান্ডে IExplorerCommand ও MSIX ম্যানিফেস্ট নিবন্ধন; MSIX হতে না পারলে sparse package দিয়ে পরিচয়; বিদ্যমান ক্লাসিক IContextMenu আপাতত পুরনো-মেনু দিকে রাখুন
q1{"খুলুন যথেষ্ট?"} -->|হ্যাঁ| pa["অ্যাসোসিয়েশন + স্ট্যাটিক verb"]
q1 -->|না| q2{"নতুন মেনুতে কাস্টম?"}
q2 -->|হ্যাঁ| q3{"MSIX হতে পারেন?"}
q3 -->|হ্যাঁ| pb1["IExplorerCommand+MSIX"]
q3 -->|না| pb2["sparse-pkg পরিচয়"]
q2 -->|না| pc["আপাতত ক্লাসিক রাখুন"]
pc -.-> old["শুধু পুরনো-মেনু দিক"]
pa -.-> dllfree["DLL নেই, ঝুঁকি ছোট"]
চিত্র 14: প্রয়োজন অনুসারে স্ট্যাটিক verb, IExplorerCommand প্লাস পরিচয়, আর ক্লাসিক রাখা থেকে বেছে নিন।
7. ব্যবহারে ডিপ্লয়মেন্ট ও নিবন্ধন ── ইনস্টলার, sparse package, পরিষ্কার
7.1. HKLM না HKCU
ইনস্টলারের আকারের সঙ্গে মেলান। সব-ব্যবহারকারী (Program Files-এর নিচে, অ্যাডমিনিস্ট্রেটর অধিকার) HKLM\Software\Classes; প্রতি-ব্যবহারকারী ইনস্টল (এলিভেশন ছাড়া) HKCU\Software\Classes। মেশালে «ক খুলতে পারে খ পারে না»-জাতীয় জিজ্ঞাসা জন্মায়। CLSID নিবন্ধন থাকা শেল এক্সটেনশনের জন্য Reg-Free COM — যা রেজিস্ট্রি নিবন্ধন নিজে অপ্রয়োজনীয় করে — ইন-অ্যাপ COM ব্যবহারে বৈধ বিকল্প, কিন্তু এক্সপ্লোরার লোড করা শেল এক্সটেনশনে প্রযোজ্য নয়, তাই সোজা নিবন্ধন লাগে («What Is Reg-Free COM - Using COM Without Registration»)।
7.2. পরিবর্তনের পর জানান ── SHChangeNotify
অ্যাসোসিয়েশন নিবন্ধন, পরিবর্তন বা মুছার পর SHChangeNotify দিয়ে SHCNE_ASSOCCHANGED ইভেন্ট জানান। এটা বাদ দিলে এক্সপ্লোরার রিবুট পর্যন্ত পরিবর্তন না দেখতে পারে।110
// Call once after changing associations, e.g. from an installer custom action
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr);
7.3. sparse package নিবন্ধন ও সরানো
sparse package নিবন্ধন ও সরানো ইনস্টলারের কাজ। ফাইল রাখার পর নিবন্ধন করুন; ফাইল মুছার আগে সরান।8
# At install time: after placing the files, register the install folder as the external location
Add-AppxPackage -Path "C:\Program Files\KomuraSoft\KomuraReport.identity.msix" `
-ExternalLocation "C:\Program Files\KomuraSoft"
# At uninstall time: remove the package registration before deleting the files
Remove-AppxPackage <package full name>
দেখার বিষয়: Add-AppxPackage যে ব্যবহারকারী চালিয়েছে তার জন্য নিবন্ধন করে। প্রতি-মেশিন MSI-এর কাস্টম অ্যাকশন থেকে LocalSystem-এর অধীনে চালালে ইনস্টল করা ব্যবহারকারী পরিচয় পায় না, তাই ব্যবহারকারী ইমপারসোনেশনের অধীনে চালান। তবু ইমপারসোনেশনের নিবন্ধন শুধু সেই ব্যবহারকারীর যে সেই ইনস্টল চালিয়েছে। একাধিক ব্যবহারকারীর PC-তে অন্য ব্যবহারকারী ও পরে তৈরি ব্যবহারকারীর প্যাকেজ পরিচয় নেই, কমান্ড নতুন মেনুতে দেখা যায় না। প্রতি ব্যবহারকারী ব্যবহার করুক চাইলে প্রথম চালুতে নিজের প্যাকেজ নিবন্ধন পরীক্ষা ও না থাকলে নিবন্ধন (প্রতি-ব্যবহারকারী নিবন্ধন) দিন, আর আনইনস্টল পরিকল্পনায় প্রতি নিবন্ধিত ব্যবহারকারী থেকে সরানো রাখুন। ম্যানিফেস্ট নিবন্ধন প্রতিফলনে এক্সপ্লোরার রিস্টার্ট (বা সাইন-আউট)ও লাগতে পারে।7
flowchart TB
accTitle: sparse package নিবন্ধন ও সরানোর ক্রম
accDescr: ইনস্টলে ফাইল রাখার পর sparse package নিবন্ধন করুন; আনইনস্টলে ফাইল মুছার আগে নিবন্ধন সরান; খেয়াল রাখুন নিবন্ধন শুধু চালানো ব্যবহারকারীর জন্য কার্যকর
i1["ইনস্টল"] --> i2["ফাইল রাখুন"]
i2 --> i3["sparse package নিবন্ধন"]
u1["আনইনস্টল"] --> u2["প্যাকেজ নিবন্ধন সরান"]
u2 --> u3["ফাইল মুছুন"]
i3 -.-> pu["নিবন্ধন শুধু চলমান ব্যবহারকারীতে কার্যকর"]
চিত্র 15: ফাইল রাখার পর নিবন্ধন, মুছার আগে সরান, আর খেয়াল রাখুন নিবন্ধন চলমান ব্যবহারকারী অনুসারে।
7.4. আনইনস্টলে পরিষ্কার ── কী মুছবেন, কী রাখবেন
আনইনস্টল পরিষ্কারের স্পষ্ট সরকারি-নির্দেশ রেখা আছে।1
- মুছুন: পুরো ইন-হাউস ProgID কী, Capabilities/RegisteredApplications নিবন্ধন, শেল এক্সটেনশনের CLSID নিবন্ধন, sparse package (Remove-AppxPackage)।
- রাখুন: এক্সটেনশন কী (
.kmrpt)-এর ডিফল্ট মান। সরকারি সুপারিশ এটা না মুছা, এমনকি এখনও ইন-হাউস ProgID দেখালেও। ইনস্টলের পর অন্য অ্যাপ ডিফল্ট নিয়েছে কিনা বিচার কঠিন, আর Windows অনিবন্ধিত ডিফল্ট-মান ProgID শুধু উপেক্ষা করে, তাই রাখলে আসল ক্ষতি নেই। - পরিষ্কার শেষেও SHChangeNotify(SHCNE_ASSOCCHANGED) ডাকুন।
বেশিরভাগ «আনইনস্টল করেছি আর মেনুতে অবশিষ্ট এখনও দেখা যায়» সমস্যা এই পরিষ্কার ডিজাইনের ফাঁস।
flowchart TB
accTitle: আনইনস্টলে পরিষ্কার ডিজাইন
accDescr: আনইনস্টলে ইন-হাউস ProgID কী, CLSID নিবন্ধন ও sparse package মুছুন; এক্সটেনশন-কী ডিফল্ট মান রাখুন কারণ অনিবন্ধিত ProgID উপেক্ষিত; পরিষ্কার শেষে SHChangeNotify দিয়ে পরিবর্তন জানান
un["আনইনস্টল"] --> del["মুছুন"]
un --> keep["রাখুন"]
del --> d1["ProgID ও CLSID নিবন্ধন"]
del --> d2["sparse package"]
keep --> k1["এক্সটেনশন-কী ডিফল্ট মান"]
k1 -.-> why["অনিবন্ধিত ProgID উপেক্ষিত"]
d1 --> fin["শেষে SHChangeNotify দিয়ে জানান"]
k1 --> fin
চিত্র 16: ইন-হাউস নিবন্ধন মুছুন, এক্সটেনশন-কী ডিফল্ট মান রাখুন, আর পরিষ্কার শেষে পরিবর্তন জানান।
8. সমস্যা সমাধান ── নেই, দ্বৈত, ভারী
8.1. মেনুতে দেখা যায় না
এই ক্রমে আলাদা করুন।
- কোন মেনু দেখছেন: ক্লাসিক-শৈলী নিবন্ধন শুধু Shift+F10-এর পুরনো-মেনু দিকে দেখা যায়। আগে দুই দিকই দেখুন।
- বিটনেস: শুধু-৩২-বিট শেল-এক্সটেনশন DLL ৬৪-বিট এক্সপ্লোরারে লোড হয় না (অনুচ্ছেদ ৪.৩)।
- নিবন্ধন গন্তব্য: HKLM/HKCU, Wow6432Node গোলমাল।
reg queryদিয়ে আসল কী নিশ্চিত করুন। - প্যাকেজ নিবন্ধন: নতুন মেনুতে
Get-AppxPackageদিয়ে উপস্থিতি, স্বাক্ষর সার্টিফিকেটের বিশ্বাস, ও-ExternalLocationপথ নিশ্চিত করে এক্সপ্লোরার রিস্টার্ট করুন।7 - বাদ পড়া জানানো: SHChangeNotify ভুলে গেলে এক্সপ্লোরার রিস্টার্টে কার্যকর হয় কিনা দেখে বোঝা যায়।
flowchart TB
accTitle: মেনুতে দেখা না গেলে আলাদা করার ক্রম
accDescr: আগে নিশ্চিত করুন কোন মেনু দেখছেন, তারপর DLL বিটনেস, রেজিস্ট্রি নিবন্ধন গন্তব্য, প্যাকেজ নিবন্ধন ও স্বাক্ষর, আর বাদ পড়া SHChangeNotify, এই ক্রমে আলাদা করুন
c1["পুরনো না নতুন মেনু নিশ্চিত করুন"] --> c2["DLL বিটনেস নিশ্চিত করুন"]
c2 --> c3["HKLM ও HKCU নিবন্ধন গন্তব্য নিশ্চিত করুন"]
c3 --> c4["প্যাকেজ নিবন্ধন ও স্বাক্ষর নিশ্চিত করুন"]
c4 --> c5["রিস্টার্টে বাদ পড়া জানানো চিনুন"]
চিত্র 17: «দেখা যায় না» হলে যে মেনু দেখছেন, বিটনেস, নিবন্ধন গন্তব্য, প্যাকেজ নিবন্ধন, বাদ পড়া জানানো ক্রমে আলাদা করুন।
8.2. দুবার দেখা যায়, বা যায় না
সাধারণ কারণ ক্লাসিক রেজিস্ট্রি নিবন্ধন ও ম্যানিফেস্ট নিবন্ধন একসঙ্গে থাকা, আনইনস্টল পরিষ্কারের ফাঁস (অনুচ্ছেদ ৭.৪), বা পুরনো-সংস্করণ ProgID অবশিষ্ট। শুধু পুরনো মেনুতে দুবার দেখা গেলে অবশিষ্ট ভাবুন; পুরনো ও নতুন দুই দিকে দেখা গেলে একসঙ্গে ভাবুন।
flowchart TB
accTitle: দ্বৈত প্রদর্শন আলাদা করা
accDescr: শুধু পুরনো মেনুতে দুবার পরিষ্কার ফাঁস বা পুরনো ProgID-এর মতো অবশিষ্ট নির্দেশ করে; পুরনো ও নতুন দুই দিকে দুবার ক্লাসিক রেজিস্ট্রি নিবন্ধন ও ম্যানিফেস্ট নিবন্ধন একসঙ্গে নির্দেশ করে
q{"কোথায় দুবার দেখা যায়?"} -->|শুধু পুরনো মেনু| zan["অবশিষ্ট"]
q -->|পুরনো ও নতুন| hei["একসঙ্গে"]
zan -.-> z1["পরিষ্কার ফাঁস বা পুরনো ProgID থেকে যাওয়া"]
hei -.-> h1["ক্লাসিক রেজিস্ট্রি নিবন্ধন নতুনের সঙ্গে"]
চিত্র 18: শুধু পুরনো মেনুতে দুবার অবশিষ্ট নির্দেশ করে; পুরনো ও নতুন দুই দিকে দুবার একসঙ্গে নির্দেশ করে।
8.3. এক্সপ্লোরার ভারী বা ক্র্যাশ করে
রাইট-ক্লিক ধীর হলে, বা নির্দিষ্ট ফোল্ডার ক্র্যাশ করলে, আগে ইনস্টল শেল এক্সটেনশনের তালিকা করুন। NirSoft-এর ShellExView-এর মতো টুলে Microsoft-ছাড়া এক্সটেনশন তালিকা করুন, সন্দেহজনক সাময়িক বন্ধ করুন, আর বাইনারি সার্চে দোষী DLL চিহ্নিত করুন। ক্র্যাশে Event Viewer-এর «Faulting module»ও সূত্র। ইন-হাউস এক্সটেনশন কারণ হলে মেনু-নির্মাণ পথে সিঙ্ক্রোনাস I/O বা নেটওয়ার্ক অ্যাক্সেস সন্দেহ করুন (অনুচ্ছেদ ৪.২ ও ৫.২)।
flowchart TB
accTitle: ভারী বা ক্র্যাশে দোষী DLL চিহ্নিত করা
accDescr: ShellExView-এ Microsoft-ছাড়া শেল এক্সটেনশন তালিকা করুন, সন্দেহজনক সাময়িক বন্ধ করে বাইনারি সার্চে দোষী DLL চিহ্নিত করুন; ক্র্যাশে Event Viewer-এর faulting moduleও সূত্র
s1["শেল এক্সটেনশন তালিকা"] --> s2["Microsoft-ছাড়া তালিকা"]
s2 --> s3["সাময়িক বন্ধ ও বাইনারি সার্চ"]
s3 --> s4["দোষী DLL চিহ্নিত করুন"]
crash["ক্র্যাশে"] -.-> ev["faulting module দেখুন"]
ev -.-> s4
চিত্র 19: Microsoft-ছাড়া এক্সটেনশন সাময়িক বন্ধ করে বাইনারি সার্চ করুন; ক্র্যাশে Event Viewerও ব্যবহার করুন।
8.4. যাচাইয়ে Windows Sandbox সুবিধাজনক
শেল ইন্টিগ্রেশন যাচাইয়ের ভিত্তি «পরিষ্কার পরিবেশে ইনস্টল → চালান → আনইনস্টল → অবশিষ্ট শূন্য» নিশ্চিত করা। এখানে সুবিধাজনক Windows Sandbox (Pro/Enterprise/Education): প্রতি চালু কয়েক সেকেন্ডে নতুন ডিসপোজেবল Windows আনে, তাই ইনস্টলার নিবন্ধন ও পরিষ্কার পরীক্ষা যতবার খুশি চালানো যায়। বন্ধ করলে সব উধাও, তাই অবশিষ্ট-রেজিস্ট্রি তদন্তেও মানানসই।15
9. সারসংক্ষেপ
- ফাইল অ্যাসোসিয়েশন «এক্সটেনশন কী → ProgID → verb» তিন-স্তর কাঠামো, আর HKCR HKLM/HKCU Classes-এর মার্জড ভিউ। লেখার গন্তব্য স্পষ্ট নাম দিন,
%1সবসময় উদ্ধৃতিতে মুড়ুন। - ডিফল্ট অ্যাপ ব্যবহারকারী বেছে নেবে বলে ডিজাইন, প্রোগ্রাম থেকে বদলানো যায় না। ইনস্টলারের কাজ প্রার্থী হিসেবে সঠিক নিবন্ধন।
- ক্লাসিক শেল এক্সটেনশন এক্সপ্লোরারে লোড ইন-প্রসেস COM DLL। ক্র্যাশ বা বিলম্ব সবাইতে ছড়ায়; ৬৪-বিট লাগে; ম্যানেজড কোড অসমর্থিত; নিয়ম নেটিভ C++ বাস্তবায়ন।
- Windows 11-এ কনটেক্সট মেনু দুই ভাগ হয়েছে। নতুন মেনুতে কাস্টম কমান্ডে IExplorerCommand প্লাস MSIX ম্যানিফেস্ট লাগে; ক্লাসিক IContextMenu «আরও অপশন দেখান» দিকে সরে যায়।
- যে অ্যাপ MSIX হতে পারে না তার জন্য sparse package (বাহ্যিক অবস্থানের MSIX) দিয়ে পরিচয় বাস্তবসম্মত উত্তর।
- শুধু «এই অ্যাপ দিয়ে খুলুন» চাইলে অ্যাসোসিয়েশন ও স্ট্যাটিক verb এখনও যথেষ্ট। সবচেয়ে সরল উপায় থেকে শুরু করা সরকারি নির্দেশিকাও।
- নিবন্ধন, পরিবর্তন বা মুছার পর SHChangeNotify দিয়ে জানান; আনইনস্টলে ProgID মুছুন কিন্তু এক্সটেনশন-কী ডিফল্ট মান রাখুন। যাচাইয়ে Windows Sandbox সুবিধাজনক।
Windows 11 PC বদলাতে «মেনু লুকিয়েছে» দেখলে আগে অধ্যায় ৬-এর সিদ্ধান্ত সারণিতে (ক), (খ) ও (গ)-এর কোনটা নিশ্চিত করুন। কাজের পরিসর সেখানেই অনুমান করতে পারা উচিত।
সংশ্লিষ্ট নিবন্ধ
- What Are COM / ActiveX / OCX? - The Differences and Relationships Explained
- What Is Reg-Free COM - Using COM Without Registration
- Registry 32-bit/64-bit Redirection and Virtualization Pitfalls — Wow6432Node and the “The Value I Wrote Isn’t There” Problem
- Choosing a Windows App Distribution Method - MSI/MSIX/ClickOnce/xcopy/Custom Updater
- DLL and COM Interface Backward Compatibility — A Decision Table for Which Changes Break Callers
- Windows অ্যাপ সামঞ্জস্য কীভাবে কাজ করে ── সামঞ্জস্য মোড, shim ও Compatibility Administrator দিয়ে পুরনো অ্যাপ বাঁচিয়ে রাখা
সংশ্লিষ্ট পরামর্শ ক্ষেত্র
KomuraSoft LLC ব্যবসায়িক অ্যাপের ফাইল অ্যাসোসিয়েশন, কনটেক্সট মেনু ও শেল এক্সটেনশনের ডিজাইন ও বাস্তবায়ন; Windows 11 নতুন কনটেক্সট মেনু লক্ষ্য (IExplorerCommand-এ যাওয়া, sparse package আনা); বিদ্যমান ইনস্টলারের নিবন্ধন ও পরিষ্কার পর্যালোচনা; আর এক্সপ্লোরার ভারী বা ক্র্যাশের কারণ তদন্ত সামলায়। «আরও অপশন দেখান-এর নিচে লুকানো মেনু নিয়ে কী করবেন» ঠিক করা থেকে শুরু করা যায়।
- Windows অ্যাপ ডেভেলপমেন্ট
- বিদ্যমান সম্পদের পুনর্ব্যবহার ও মাইগ্রেশন
- প্রযুক্তিগত পরামর্শ ও ডিজাইন রিভিউ
- যোগাযোগ করুন
তথ্যসূত্র
-
Microsoft Learn, File Types. এক্সটেনশন কী ProgID দেখানোর কাঠামো; OpenWithProgIds; HKLM/HKCU\Software\Classes-এ নিবন্ধন ভাগ; অ্যাসোসিয়েশন পরিবর্তনের পর SHChangeNotify(SHCNE_ASSOCCHANGED) ডাকা; আর আনইনস্টলে ProgID মুছে এক্সটেনশন কীর ডিফল্ট মান রাখা। ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, HKEY_CLASSES_ROOT Key. HKEY_CLASSES_ROOT HKLM\Software\Classes ও HKCU\Software\Classes-এর মার্জড ভিউ; ব্যবহারকারী-দিক সংজ্ঞা মেশিন-দিকের আগে; আর লেখার বণ্টন নিয়ম। ↩ ↩2
-
Microsoft Learn, Windows app defaults platform. ডিফল্ট অ্যাপ বদলানো শুধু সিস্টেম Settings UI দিয়ে করার ডিজাইন; ব্যবহারকারী-সেটিং ডেটা অস্পষ্ট ও ফিল্টার ড্রাইভার (UCPD.sys) দিয়ে লেখা-সুরক্ষিত; রেজিস্ট্রি-ভিত্তিক পরিবর্তন অসমর্থিত; পরিচালিত পরিবেশে Group Policy / MDM নীতি। ↩ ↩2
-
Microsoft Learn, Working with Shell Extensions. শেল-এক্সটেনশন হ্যান্ডলারের ধরন; এক্সটেনশন এক্সপ্লোরারে (ও শেল হোস্ট করা প্রসেসে) লোড ইন-প্রসেস COM DLL তাই ক্র্যাশ বা হ্যাং পুরো এক্সপ্লোরারে ছড়ায়; ThreadingModel=Apartment দিয়ে নিবন্ধন; শেল এক্সটেনশনের আগে সরল বিকল্প ভাবা। ↩ ↩2 ↩3
-
Microsoft Learn, Guidance for Implementing In-Process Extensions. Microsoft ম্যানেজড কোডে ইন-প্রসেস শেল-এক্সটেনশন বাস্তবায়ন সুপারিশ বা সমর্থন করে না; কারণে CLR ভার্সন সংঘাত, রিএন্ট্রেন্সি ও অনির্ধারিত অবজেক্ট আয়ুষ্কাল; আউট-অফ-প্রসেস এক্সটেনশনে (প্রিভিউ হ্যান্ডলার, বা shell\verb\command থেকে চালু) ম্যানেজড কোড গ্রহণযোগ্য। ↩ ↩2 ↩3
-
Windows Developer Blog, Extending the Context Menu and Share Dialog in Windows 11. Windows 11 নতুন কনটেক্সট মেনু ডিজাইন; IExplorerCommand প্লাস অ্যাপ পরিচয় দিয়ে স্ফীতকরণ; «খুলুন» ও «এ দিয়ে খুলুন» উপরে রাখা; একাধিক কমান্ড অ্যাপ-নাম ফ্লাইআউটে জমা; ক্লাসিক IContextMenu এক্সটেনশন «আরও অপশন দেখান» (Shift+F10)-এর নিচে Windows 10 মেনু হিসেবে লোড। ↩ ↩2 ↩3
-
Microsoft Learn, Add a File Explorer context menu command to a packaged desktop app. Windows 11 নতুন কনটেক্সট মেনু নিবন্ধন IExplorerCommand বাস্তবায়ন প্লাস windows.comServer প্লাস desktop4:FileExplorerContextMenus ম্যানিফেস্ট ঘোষণা; ItemType *, Directory বা Directory\Background নির্দিষ্ট করতে পারে; DLL আর্কিটেকচার মেলানো; মেনু-নির্মাণ মেথড দ্রুত রাখা; অ-প্যাকেজড অ্যাপ sparse package দিয়ে ঢাকা; নিবন্ধন কার্যকর হতে কখনও এক্সপ্লোরার রিস্টার্ট লাগে; ফাইল অ্যাসোসিয়েশন সাধারণ-উদ্দেশ্য মেনু এক্সটেনশন নয়। ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Grant package identity by packaging with external location. বিদ্যমান ইনস্টলার না বদলে বাহ্যিক-অবস্থান প্যাকেজ (sparse package) নিবন্ধন করে প্যাকেজ পরিচয় পাওয়া; Windows 10 সংস্করণ 2004 থেকে উপলব্ধ; পরিচয়-প্রয়োজনীয় Windows ফিচার (কনটেক্সট-মেনু নিবন্ধন, নোটিফিকেশন ইত্যাদি) ব্যবহারযোগ্য হওয়া। ↩ ↩2 ↩3
-
Microsoft Learn, Choosing a Static or Dynamic Shortcut Menu Method. প্রয়োজন মেটানো সবচেয়ে সরল স্ট্যাটিক-verb পদ্ধতি বেছে নেওয়া; IContextMenu সবচেয়ে শক্তিশালী কিন্তু সবচেয়ে জটিল ও অ-সুপারিশ দিকে শ্রেণিবদ্ধ; IExplorerCommand/IExplorerCommandState সুপারিশকৃত পদ্ধতি। ↩ ↩2
-
Microsoft Learn, SHChangeNotify function. ফাইল-অ্যাসোসিয়েশন পরিবর্তন সিস্টেমকে জানানো SHCNE_ASSOCCHANGED ইভেন্ট কীভাবে তুলবেন, আর শেল যেন পরিবর্তন দেখে তার জন্য ব্যবহার। ↩ ↩2
-
Microsoft Learn, Application Registration. App Paths সাবকী দিয়ে এক্সিকিউটেবল নিবন্ধন সুপারিশকৃত; Applications সাবকীর ভূমিকা; SystemFileAssociations দিয়ে verb নিবন্ধন; আর ডিফল্ট অ্যাপ বদলালে ProgID ও সম্পর্কিত তথ্যের অগ্রাধিকার। ↩
-
Microsoft Learn, Verbs and File Associations. verb ShellExecuteEx-ও ব্যবহার করা কাজ; স্পেস থাকতে পারে এমন কমান্ড-স্ট্রিং উপাদান উদ্ধৃতিতে মুড়তে হবে ও “%1” সবসময় উদ্ধৃত লিখতে হবে; HKCR\Applications-এর নিচে ডিফল্ট পদ্ধতি নিবন্ধন। ↩
-
Microsoft Learn, IExplorerCommand interface. GetTitle, GetIcon, GetState, Invoke, EnumSubCommands ইত্যাদি মেথড গঠন; মেথড UI থ্রেডে ডাকা তাই নেটওয়ার্ক রিসোর্সের সঙ্গে যোগাযোগ নয়; Windows Vista থেকে উপলব্ধ। ↩
-
Microsoft Learn, Windows Sandbox. কয়েক সেকেন্ডে ডিসপোজেবল, বিচ্ছিন্ন Windows পরিবেশ চালু; বন্ধ করলে সব পরিবর্তন ফেলে দেওয়া হয়; সফটওয়্যার পরীক্ষা ও ইনস্টলার যাচাইয়ের উপযোগী; Pro/Enterprise/Education-এ উপলব্ধ। ↩
সম্পর্কিত নিবন্ধ
কাছাকাছি বিষয়ে গভীরে যেতে একই ট্যাগযুক্ত সাম্প্রতিক নিবন্ধ।
ক্লিপবোর্ড ও ড্র্যাগ অ্যান্ড ড্রপ কীভাবে কাজ করে — ব্যবসায়িক অ্যাপে OLE ডেটা ট্রান্সফার সঠিকভাবে সামলানো
Excel টেবিল পেস্ট করলে ফরম্যাটিং ভেঙে যায়; সোর্স অ্যাপ বন্ধ করলে আর পেস্ট করা যায় না — দুটোই আসে ক্লিপবোর্ড একই বিষয়বস্তু একসঙ্গে একাধ...
Win32 থ্রেড পুল API — CreateThreadpoolWork দিয়ে থ্রেড তৈরি না করে কনকারেন্সি
নেটিভ কোডে চারদিকে CreateThread ডাকছেন? এই নিবন্ধ Vista-তে নতুন করে সাজানো Win32 থ্রেড পুল API ব্যাখ্যা করে — work, timer, wait ও io চারট...
নেমড পাইপ ব্যবহারিকভাবে — ডিজাইন থেকে নিরাপত্তা পর্যন্ত Windows-এর মানক IPC
Windows-এর মানক আন্তঃপ্রক্রিয়া যোগাযোগ নেমড পাইপের ব্যবহারিক গাইড। প্রাথমিক উৎস থেকে এই নিবন্ধ বাইট ও মেসেজ মোডের পছন্দ, একাধিক ক্লায়েন...
ঘুম থেকে জাগলে ভাঙে যে অ্যাপ — Windows পাওয়ার ইভেন্টের কাজ ও যে ব্যবসায়িক অ্যাপ তা সহ্য করে
ল্যাপটপ খুললেন আর ব্যবসায়িক অ্যাপের সংযোগ মৃত — কারণ ঘুম ধরে না নেওয়া ডিজাইন। এই নিবন্ধ WM_POWERBROADCAST নোটিফিকেশন প্রবাহ, Modern Sta...
DllMain ও লোডার লক — DLL ইনিশিয়ালাইজেশনে "কিছুই করবেন না" বলা হয় তার আসল কারণ
DllMain থেকে LoadLibrary ডাকা বা অন্য থ্রেডের সাথে সিঙ্ক্রোনাইজ করা যায় না কেন। প্রাথমিক উৎস থেকে এই নিবন্ধ ব্যাখ্যা করে লোডার লক প্রতিট...
সম্পর্কিত বিষয়
এই পৃষ্ঠাগুলো বিষয়টিকে সেবা ও সিদ্ধান্তের বৃহত্তর প্রেক্ষাপটে স্থাপন করে।
Windows-এর প্রযুক্তিগত বিষয়
Windows ডেভেলপমেন্ট, বাগ তদন্ত ও বিদ্যমান সম্পদ ব্যবহারের প্রবেশদ্বার।
ActiveX মাইগ্রেশন
COM / ActiveX / OCX কম্পোনেন্ট রাখা, র্যাপ করা বা প্রতিস্থাপনের সিদ্ধান্ত।
এই বিষয়ের সাথে সম্পর্কিত সেবা
নিবন্ধটি নিচের সেবাগুলোর সাথে সরাসরি সম্পর্কিত।
Windows অ্যাপ ডেভেলপমেন্ট
ব্যবসায়িক অ্যাপ, ডিভাইস ইন্টিগ্রেশন ও যোগাযোগ টুল, চাহিদা থেকে ডেভেলপমেন্ট পর্যন্ত।
Windows সফটওয়্যারের রক্ষণাবেক্ষণ ও আধুনিকীকরণ
বিদ্যমান Windows সফটওয়্যারের সম্প্রসারণ, রক্ষণাবেক্ষণ ও ধাপে ধাপে আধুনিকীকরণ।
প্রায়শ জিজ্ঞাসিত প্রশ্ন
এই নিবন্ধের বিষয়ে পরামর্শে প্রায়ই আসা প্রশ্ন।
- Windows 11-এ আমাদের অ্যাপের কনটেক্সট-মেনু আইটেম শুধু "আরও অপশন দেখান"-এর নিচে কেন দেখা যায়?
- কারণ Windows 11-এ ফাইল এক্সপ্লোরারের কনটেক্সট মেনু দুই স্তরে ভাগ হয়েছে, পুরনো ও নতুন। নতুন মেনুতে শুধু সেই কমান্ড আসতে পারে যেগুলো IExplorerCommand ইন্টারফেস বাস্তবায়ন করে এবং MSIX প্যাকেজ ম্যানিফেস্টে নিবন্ধিত (= প্যাকেজ পরিচয় আছে)। ক্লাসিক IContextMenu-ভিত্তিক শেল এক্সটেনশন সেই পুরনো মেনুতে সরে গেছে যা আপনি "আরও অপশন দেখান" (Shift+F10) দিয়ে খোলেন। এক্সটেনশন নিজে ভাঙেনি, তাই আপাতত কাজ করে, কিন্তু নতুন মেনুতে চাইলে IExplorerCommand-এ মাইগ্রেশন এবং হয় MSIX প্যাকেজিং নয়তো sparse package দিয়ে পরিচয় দিতে হয়।
- ইনস্টলার কি আমাদের অ্যাপকে কোনো ফাইলের ডিফল্ট অ্যাপ (ডাবল-ক্লিকে যেটা খোলে) সেট করতে পারে?
- না। ডিফল্ট অ্যাপ বেছে নেওয়া ব্যবহারকারীর কাজ বলে ডিজাইন করা, আর Windows সিস্টেম Settings UI ছাড়া অন্য কোথাও থেকে ডিফল্ট অ্যাপ বদলানো সমর্থন করে না। প্রতি ব্যবহারকারীর পছন্দ রাখা UserChoice তথ্য অস্পষ্ট করা, আর একটি ফিল্টার ড্রাইভার (UCPD.sys) অ্যাপের লেখাও আটকায়। ইনস্টলার ProgID ও verb নিবন্ধন করতে পারে, নিজেকে OpenWithProgIds-এ যোগ করে "এ দিয়ে খুলুন"-এর প্রার্থী হিসেবে দেখাতে পারে, আর ব্যবহারকারীকে Default apps সেটিং পেজে নিয়ে যেতে পারে। সঠিক বাস্তবায়ন ডিফল্ট চুরি নয়, বেছে নেওয়ার জন্য প্রস্তুত থাকা।
- C#-এর মতো ম্যানেজড কোডে শেল এক্সটেনশন লিখতে পারি?
- Microsoft স্পষ্ট বলেছে ইন-প্রসেস শেল এক্সটেনশন (কনটেক্সট-মেনু হ্যান্ডলার, আইকন হ্যান্ডলার ইত্যাদি) ম্যানেজড কোডে লেখা সুপারিশকৃত নয় এবং অসমর্থিত। এক্সটেনশন এক্সপ্লোরারে এবং সাধারণ ফাইল ডায়ালগ খোলা যেকোনো অ্যাপের প্রসেসে লোড হয়, তাই CLR ভার্সন সংঘাত, রিএন্ট্রেন্সি ও অনির্ধারিত অবজেক্ট আয়ুষ্কাল হোস্ট অ্যাপ অস্থির করে। নিয়ম নেটিভ C++-এ বাস্তবায়ন। verb-এর command থেকে চালু সাধারণ EXE, বা আলাদা প্রসেসে চলা আউট-অফ-প্রসেস এক্সটেনশন যেমন প্রিভিউ হ্যান্ডলার, ম্যানেজড কোডে ঠিক আছে।
- sparse package (বাহ্যিক অবস্থানের MSIX) কী?
- একটি ছোট MSIX প্যাকেজ যাতে অ্যাপ ফাইল নেই, শুধু ম্যানিফেস্ট (পরিচয় তথ্য)। বিদ্যমান ইনস্টলার (MSI, Inno Setup ইত্যাদি) দিয়ে সাধারণভাবে ইনস্টল অ্যাপের জন্য Add-AppxPackage -ExternalLocation দিয়ে ইনস্টল ফোল্ডার নির্দেশ করে নিবন্ধন করলে অ্যাপ প্যাকেজ পরিচয় পায় এবং Windows 11 নতুন কনটেক্সট মেনু নিবন্ধন ও টোস্ট নোটিফিকেশনের মতো পরিচয়-প্রয়োজনীয় ফিচার ব্যবহার করতে পারে। Windows 10 সংস্করণ 2004 থেকে পাওয়া যায়, প্যাকেজের লক্ষ্য মেশিনে বিশ্বস্ত কোড স্বাক্ষর লাগে। পুরো বিতরণ পদ্ধতি MSIX-এ না সরিয়ে নতুন মেনু সমর্থন চাইলে এটিই বাস্তবসম্মত বিকল্প।
- কনটেক্সট-মেনু আইটেম দুবার দেখা গেলে, বা যাবে না, কী করব?
- আগে কারণ আলাদা করুন কোন মেনুতে দেখা যায়: নতুন মেনু না পুরনো (আরও অপশন দেখান)। সাধারণ দ্বৈত প্রদর্শন হলো ক্লাসিক রেজিস্ট্রি নিবন্ধন ও MSIX ম্যানিফেস্ট নিবন্ধন একসঙ্গে থাকা, বা আনইনস্টলে ProgID বা এক্সটেনশন CLSID নিবন্ধন থেকে যাওয়া। অ্যাসোসিয়েশন বদলানোর পর SHChangeNotify(SHCNE_ASSOCCHANGED) বাদ পড়ারও সন্দেহ করুন; প্যাকেজ নিবন্ধনের ঠিক পরে এক্সপ্লোরার রিস্টার্ট বাদ পড়ার। তাতেও না মিটলে ShellExView-এ Microsoft-ছাড়া এক্সটেনশন সাময়িক বন্ধ করে বাইনারি সার্চে দোষী DLL চিহ্নিত করুন।