2010-02-02 19 views
15

में एक एप्लिकेशन मेनिफेस्ट एम्बेड करना मैंने हाल ही में यह सुनिश्चित करने के लिए कि वीबी 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 से अधिक था।

सही दिशा में मुझे इंगित करने के लिए माइकल और जिम दोनों के लिए धन्यवाद। सिर्फ एक दयालुता मैं आपको जवाब के रूप में चिह्नित नहीं कर सकता!

+0

सुनिश्चित नहीं है कि आपकी समस्या क्या है, लेकिन यह आइकन नहीं है। संसाधन के प्रत्येक वर्ग (RT_MANIFEST, RT_ICON) में इसका अपना आईडी नेमस्पेस है। क्या आप हमें .rc फ़ाइल के अधिक टेक्स्ट दे सकते हैं? –

+0

मैं एक्सपी और विस्टा के बारे में कुछ समझता हूं जो विभिन्न संसाधन आईडी पर मैनिफेस्ट चाहते हैं। RESOURCE_ID 2 का उपयोग करने का प्रयास करें, या संभवतः आईडी 1 और आईडी 2 में एक ही मैनिफेस्ट डालने का प्रयास करें। –

+0

@ जॉनकनेरर संसाधन आईडी वास्तव में एक अर्थ है और विभिन्न परिणाम उत्पन्न कर सकते हैं, [यहां] देखें (http://blogs.msdn.com/b विवरण के लिए /junfeng/archive/2007/06/26/rt-manifest-resource-and-isolation-aware-enabled.aspx)। – takrl

उत्तर

8

दिलचस्प बात यह है कि मुझे हाल ही में एक ही चीज़ करना पड़ा। ईसाई वर्णित चरणों के बाद, मुझे इसे पहली बार काम करने के लिए मिला।

  1. मूल प्रश्न
  2. निम्नलिखित सामग्री के साथ एक app.manifest निर्मित में वर्णित के रूप में एक आर सी फ़ाइल निर्मित::

ManifestImage http://img638.imageshack.us/img638/3364/manifesta.png छवि का इस्तेमाल किया propsperity के लिए, यहाँ पूरे कार्यप्रवाह मैं पीछा किया है व्हाइटस्पेस पात्रों को संरक्षित करने के लिए, जो काम करने के लिए बहुत महत्वपूर्ण हैं। जैसा कि पिछले जवाब में कहा गया है, फ़ाइल का आकार 4.

की एक बहु होना चाहिए
  1. RC.EXE Ran rc .res फ़ाइल
  2. उत्पन्न करने के लिए के खिलाफ मूल प्रश्न में वर्णित के रूप
  3. मेरी Project.VBP फ़ाइल संपादित शीर्ष के निकट निम्न पंक्ति शामिल करने के लिए:

ResFile32 = "Resources.res"

  1. निर्मित मानक में EXE vb6 ई nvironment। विस्टा या win7 मशीन पर तैनात किए जाने पर, ढाल दिखाई देती है और उपयोगकर्ता को व्यवस्थापक के रूप में चलाने के लिए कहा जाता है। जब स्टूडियो में EXE फ़ाइल खोलने, मैं निम्न संसाधन देखें:

alt text http://img688.imageshack.us/img688/4879/finalresources.png

आप अभी भी मुसीबतों हो रही है, मुझे पता है और मैं जो कुछ भी मैं कर सकते हैं आप के साथ साझा करेंगे।इसके अलावा, मुझे यकीन नहीं है कि आपको Works on my Machine!

+0

धन्यवाद माइक। मुझे अभी तक इसका परीक्षण करने का मौका नहीं मिला है इसलिए मैं आपसे पूछ रहा हूं: क्या आपके मेनिफेस्ट में फाइल की शुरुआत में यूटीएफ -8 बाइट ऑर्डर मार्क शामिल है या नहीं? –

+0

ईसाई - नहीं, यह नहीं करता है। वास्तव में, नोटपैड ++ मुझे बताता है कि मेरे app.manifest फ़ाइल पर एन्कोडिंग एएनएसआई है। –

8

वीबी 6 में एक quirk है कि किसी भी संसाधन तत्व लंबाई में 4 का सटीक बहु होना चाहिए। रिक्त स्थान के साथ आरसी फ़ाइल को पैडिंग करने का प्रयास करें, और देखें कि क्या यह व्यवहार बदलता है।

इसके अलावा, आप वीबीपी संपादित करने के बजाय वीबी 6 आईडीई का उपयोग कर संसाधन जोड़ सकते हैं। प्रभाव वही हो सकता है, लेकिन संसाधन संपादक यह करने के लिए मानक माध्यम है।

+0

क्षमा करें, मेरा कहना है, मैनिफ़ेस्ट को 4 से अधिक के लिए पैड करें। –

+0

धन्यवाद जिम, उसे नहीं पता था। बेहद संयोग से, वीएस -2008 हेक्स व्यूअर के अनुसार, मेरी मेनिफेस्ट रिसोर्स एंट्री पहले से ही 16 बाइट्स का सटीक एकाधिक था। मुझे संदेह है कि यह एक एन्कोडिंग मुद्दा हो सकता है। मैं क्या काम करता है यह देखने के लिए विभिन्न संयोजनों की कोशिश कर रहा हूं, और मैं बाद में अपनी पोस्ट अपडेट करूंगा। –

+0

@ जिममैक मुझे पता है कि यह मेरे अपने अनुभव से सच है, लेकिन क्या आपने इसे अधिकृत रूप से कहीं भी दस्तावेज देखा है (उदाहरण के लिए, माइक्रोसॉफ्ट द्वारा)? –

6

Resource Compiler (rc.exe) का उपयोग करने के दौरान आपको लंबा रास्ता तय करना है। एक निष्पादन योग्य के भीतर एक एप्लिकेशन मैनिफेस्ट एम्बेड करने के लिए एक बहुत आसान विकल्प है, चाहे सी ++ या वीबी 6 या किसी अन्य भाषा के बारे में। The Manifest Tool (mt.exe) विशेष रूप से बाइनरी के भीतर प्रकट करने के लिए लिखा गया था और विंडोज एसडीके के साथ नि: शुल्क प्रदान किया गया है। Mt.exe का उपयोग करने का अतिरिक्त लाभ यह है कि यह स्वचालित रूप से किसी भी आवश्यक पैडिंग को संभालता है।

बाइनरी संकलित होने के बाद बस निम्न कमांड लाइन चलाएं। मैंने विज़ुअल सी ++ 2005 कंपाइलर द्वारा आंतरिक रूप से उपयोग किए जाने वाले नामकरण सम्मेलन का उपयोग किया है, जहां मैनिफेस्ट फ़ाइल नाम में ".intermediate.manifest" संलग्न पूर्ण प्रोग्राम नाम शामिल है।

mt.exe -nologo -manifest "program.exe.intermediate.manifest" -outputresource:"program.exe;#1

अद्यतन: मैं व्यक्तिगत रूप से यह एक स्वचालित निर्माण प्रक्रिया में VB6 निष्पादनयोग्य के साथ दो साल के लिए अब उपयोग किया गया है। यह इतना सफल रहा है कि हमने ओएस संगतता परीक्षणों को समाप्त कर दिया है - हमारे प्रतिगमन परीक्षण से - प्रकट करने के लिए विशिष्ट।

+0

धन्यवाद जॉन, इस तरह के औजारों के बारे में जानना हमेशा उपयोगी होता है। –