में एक एप्लिकेशन मेनिफेस्ट एम्बेड करना मैंने हाल ही में यह सुनिश्चित करने के लिए कि वीबी 6 में लिखित स्टैंडअलोन यूटिलिटी ऐप का एक गुच्छा हो गया है, यह सुनिश्चित करने के लिए कि Windows Vista और ऊपर के लिए रजिस्ट्री वर्चुअलाइजेशन बंद है। मैंने प्रत्येक exe के लिए एक स्टैंडअलोन मेनिफेस्ट फ़ाइल बनाई है, requestedExecutionLevel
उचित रूप से सेट करें (उनमें से कुछ को HKEY_LOCAL_MACHINE
रजिस्ट्री कुंजियों को संशोधित करने की आवश्यकता है, अन्य नहीं), और उनका परीक्षण किया। वे सभी सही ढंग से काम करने लगते हैं।एक वीबी 6 एक्सई
मेरे पास केवल एक छोटी सी समस्या शेष है। चूंकि वे स्टैंडअलोन यूटिलिटीज हैं, इसलिए लोग उन्हें नेटवर्क के चारों ओर कॉपी करने और उन्हें मैन्युअल रूप से चलाने के लिए उपयोग किए जाते हैं। अगर कोई भी मेनिफेस्ट फ़ाइल के साथ-साथ exe को कॉपी करना भूल जाता है, तो exe चुपचाप वास्तविक के बजाय वर्चुअलाइज्ड रजिस्ट्री कुंजी पर लिखेंगे और हार्ड-टू-डीबग समस्याओं का कारण बनेंगे।
स्पष्ट समाधान एक्सपेर को संसाधन के रूप में एक्सप्लोर करना है। सभी लेख मैं नेट पर पढ़ा है इस तरह संसाधन एम्बेड करने के लिए आपको बता:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
यह ठीक काम करना चाहिए कि वीबी संकलक हमेशा संसाधन आईडी के साथ आवेदन आइकन बनाता छोड़कर = 1. जब मैं करने की कोशिश की उपर्युक्त कोड, विंडोज ने एक्सई को चलाने से इंकार कर दिया, संसाधन त्रुटि के बारे में शिकायत की (मैं बाद में विवरण के साथ इस पोस्ट को अपडेट करूंगा)। मैंने संसाधन आईडी को किसी अन्य नंबर पर बदलने का प्रयास किया, जिसके बाद विंडोज ने प्रोग्राम सफलतापूर्वक चलाया लेकिन मैनिफेस्ट सामग्री को पहचान नहीं पाया।
क्या किसी को वीबी 6 एक्सई में काम करने के लिए एम्बेडेड मेनिफेस्ट प्राप्त करने का कोई तरीका पता है, या क्या मुझे बस बाहरी फाइल के साथ रहना चाहिए?
अद्यतन 1
पाठ ऊपर दिए गए .rc
फ़ाइल की पूरी सामग्री है। मैं इस तरह एक .res
फाइल करने के लिए यह संकलन:
"%ProgramFiles%\Microsoft Visual Studio\VB98\Wizards\rc.exe" /r /fo "Resources.res" "Resources.rc"
और इस तरह VB6 परियोजना फ़ाइल में एम्बेड:
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Form=Main.frm
ResFile32="Resources.res"
IconForm="FMain"
Startup="FMain"
HelpFile=""
Title="Windows Vista Registry Test - VB6"
ExeName32="RegistryTestVB6.exe"
Path32=""
Command32=""
Name="RegistryTestVB6"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionComments="Windows Vista Registry Test - VB6"
VersionCompanyName=""
VersionFileDescription="Windows Vista Registry Test - VB6"
VersionLegalCopyright=""
VersionProductName="Windows Vista Registry Test - VB6"
CondComp=""
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
जब मैं VS2008 संसाधन संपादक में exe संकलित पढ़ें, यह
RegistryTestVB6.exe
Icon
1 [Neutral]
RT_MANIFEST
1 [English (United States)]
Version
1 [English (United States)]
जब मैं VS2008 में एक सटीक बराबर VB.NET परीक्षण ऐप का निर्माण, तो लोड कि संसाधन Edito में: इस तरह दिखता है आर, इसके बजाय इस तरह दिखता है:
RegistryTestNET.exe
Icon
32512 [Neutral]
RT_MANIFEST
1 [Neutral]
Version
1 [Neutral]
अद्यतन 2
परीक्षण - नेट exe दोनों Windows XP और Windows 7. हालांकि पर ठीक चलाता है, VB6 exe XP पर निम्न त्रुटि पैदा करता है :
यह एप्लिकेशन प्रारंभ करने में विफल रहा है क्योंकि अनुप्रयोग कॉन्फ़िगरेशन गलत है। अनुप्रयोग पुनर्स्थापित कर इस समस्या का हल किया जा सकता है।
तथा 7 निम्न त्रुटि:
आवेदन शुरू करने के लिए, क्योंकि इसके साथ-पक्ष विन्यास गलत है नाकाम रही है। अधिक जानकारी के लिए कृपया एप्लिकेशन इवेंट लॉग देखें या कमांड लाइन sxstrace.exe उपकरण का उपयोग करें।
स्थिति में देख रहे हैं लॉग ऑन मैं निम्नलिखित प्रविष्टि देखें:
सक्रियण संदर्भ पीढ़ी "RegistryTestVB6.exe" के लिए विफल रहा है। लाइन 10 पर प्रकट या नीति फ़ाइल "RegistryTestVB6.exe" में त्रुटि। अवैध एक्सएमएल वाक्यविन्यास।
यह कहने की जरूरत नहीं है कि एक्सएमएल अमान्य नहीं है, यह वही एन्कोडिंग है जो मैंने .NET exe के लिए उपयोग किया था, और यह एक काम करता है।
संकल्प
VB6 संकलक वास्तव में आवश्यकता है कि एक मनमाना पाठ फ़ाइल एक संसाधन में शामिल 4 बाइट की एक सटीक गुणांक होना चाहिए। मैंने बस एक्सएमएल में रिक्त स्थान जोड़े जब तक नोटपैड ++ ने मुझे बताया कि बीओएम समेत कुल फ़ाइल आकार 4 से अधिक था।
सही दिशा में मुझे इंगित करने के लिए माइकल और जिम दोनों के लिए धन्यवाद। सिर्फ एक दयालुता मैं आपको जवाब के रूप में चिह्नित नहीं कर सकता!
सुनिश्चित नहीं है कि आपकी समस्या क्या है, लेकिन यह आइकन नहीं है। संसाधन के प्रत्येक वर्ग (RT_MANIFEST, RT_ICON) में इसका अपना आईडी नेमस्पेस है। क्या आप हमें .rc फ़ाइल के अधिक टेक्स्ट दे सकते हैं? –
मैं एक्सपी और विस्टा के बारे में कुछ समझता हूं जो विभिन्न संसाधन आईडी पर मैनिफेस्ट चाहते हैं। RESOURCE_ID 2 का उपयोग करने का प्रयास करें, या संभवतः आईडी 1 और आईडी 2 में एक ही मैनिफेस्ट डालने का प्रयास करें। –
@ जॉनकनेरर संसाधन आईडी वास्तव में एक अर्थ है और विभिन्न परिणाम उत्पन्न कर सकते हैं, [यहां] देखें (http://blogs.msdn.com/b विवरण के लिए /junfeng/archive/2007/06/26/rt-manifest-resource-and-isolation-aware-enabled.aspx)। – takrl