2012-01-12 11 views
5

में एक्सेस उल्लंघन का कारण बनता है डेल्फी XE2 Win32 प्लेटफ़ॉर्म कार्यों में निम्न कोड चला रहा है। हालांकि, एक ही कोड win64 मंच में संकलन "EnumRCDataProc" में पहुँच उल्लंघन का कारण होगा यदि डिबग मोड में चलाएँ:डेल्फी XE2: WinAPI EnumResourceNames को आमंत्रित करें Win64 प्लेटफ़ॉर्म

procedure TForm2.Button1Click(Sender: TObject); 
    function EnumRCDataProc(hModule: THandle; lpszType, lpszName: PChar; lParam: 
     NativeInt): Boolean; stdcall; 
    begin 
    TStrings(lParam).Add(lpszName); 
    Result := True; 
    end; 

var k: NativeInt; 
    L: TStringList; 
    H: THandle; 
begin 
    H := LoadPackage('resource.bpl'); 
    L := TStringList.Create; 
    try 
    EnumResourceNames(H, RT_RCDATA, @EnumRCDataProc, NativeInt(L)); 
    ShowMessage(L.Text); 
    finally 
    L.Free; 
    UnloadPackage(H); 
    end; 
end; 

जब Win64 मंच पर डेल्फी XE2 आईडीई में कोड डीबग, मैं EnumRCDataProc में hModule का मूल्य मिला परिवर्तनीय एच के साथ मेल नहीं खाता। मुझे संदेह है कि EnumRCDataProc के लिए बनाए गए पैरामीटर के बारे में कुछ गलत हो सकता है। हालांकि, मैं यह नहीं समझ सकता कि कैसे। कोई विचार?

उत्तर

5

समस्या यह है कि आपने EnumRCDataProc स्थानीय प्रक्रिया बनाई है। आपको इसे विधि के बाहर ले जाना होगा।

function EnumRCDataProc(hModule: HMODULE; lpszType, lpszName: PChar; lParam: 
    NativeInt): BOOL; stdcall; 
begin 
    TStrings(lParam).Add(lpszName); 
    Result := True; 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
var k: NativeInt; 
    L: TStringList; 
    H: HMODULE; 
begin 
    H := LoadPackage('resource.bpl'); 
    L := TStringList.Create; 
    try 
    EnumResourceNames(H, RT_RCDATA, @EnumRCDataProc, NativeInt(L)); 
    ShowMessage(L.Text); 
    finally 
    L.Free; 
    UnloadPackage(H); 
    end; 
end; 

पहले निरीक्षण पर मैं उम्मीद है कि संकलक अपने कोड के साथ एक त्रुटि फेंकना होगा:

E2094 स्थानीय प्रक्रिया/समारोह 'कॉलबैक' प्रक्रिया चर करने के लिए सौंपा

लेकिन यह करता है ऐसा मत करो। मैंने थोड़ा गहरा खोला और पाया कि EnumResourceNames के लिए कॉलबैक पैरामीटर को Pointer टाइप किया गया है। यदि हेडर अनुवाद ने इसे टाइप किए गए कॉलबैक पैरामीटर के रूप में घोषित किया था तो उपर्युक्त त्रुटि संदेश वास्तव में उत्सर्जित हो जाएगा। मेरे दिमाग में हेडर अनुवाद इस संबंध में खराब है। टाइप सिस्टम की सुरक्षा को छोड़ने से बहुत कम प्रतीत होता है।

तथ्य यह है कि आपका कोड 32 बिट कोड में काम करता है, यह केवल एक खुश संयोग है जो कार्यान्वयन विवरण पर निर्भर करता है। आपकी किस्मत 64 बिट पर चलती है। दोबारा, यदि टाइप चेकिंग सिस्टम सक्षम किया गया था, तो कंपाइलर आपको बता सकता था कि तुरंत क्या गलत था।

कुछ अन्य टिप्पणियां:

  1. EnumRCDataProc अपनी घोषणा में गलत प्रकार के एक जोड़े हैं: hModule प्रकार HMODULE की होनी चाहिए और समारोह परिणाम BOOL होना चाहिए।
  2. LoadPackage मॉड्यूल हैंडल प्राप्त करने के लिए एक हेवीवेट दृष्टिकोण है। मैं LoadLibraryEx को LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE और LOAD_LIBRARY_AS_IMAGE_RESOURCE विकल्पों के साथ देखना पसंद करूंगा।
+0

कंपाइलर को इसके बारे में शिकायत नहीं करनी चाहिए। स्थानीय enum फ़ंक्शन बिल्कुल कोई मुद्दा नहीं है। – OnTheFly

+0

अनुमान लगाएं, यह क्यों निकलता है: पी – OnTheFly

+1

जब तक कॉलबैक किसी भी रूप की चीज़ तक नहीं पहुंचता है जो किसी समस्या नहीं होनी चाहिए। फिर फिर, उस उद्देश्य के लिए, केवल कॉलबैक लेना सही बात है। ओवर-स्ट्राइक का मतलब क्या है? क्या यह ऊपर दिए गए उत्तर का हिस्सा रद्द करता है? –

संबंधित मुद्दे