2014-05-09 3 views
7

को मैं डेल्फी की एक इकाई के लिए एक सी हेडर परिवर्तित कर रहा हूँ। मुझे यूनियन के बारे में संदेह है। उदाहरण के लिए, नीचे दिए गए उदाहरणों में, तर्क लागू किया गया है (केस इंटेगर ऑफ)? क्या यह इस संरचना को बदलने का सही तरीका है?Convert संरचना डेल्फी

डेल्फी में सी

typedef union _FLT_PARAMETERS { 

    struct { 
     PIO_SECURITY_CONTEXT SecurityContext; 
     ULONG Options; 
     USHORT POINTER_ALIGNMENT FileAttributes; 
     USHORT ShareAccess; 
     ULONG POINTER_ALIGNMENT EaLength; 
     PVOID EaBuffer;     
     LARGE_INTEGER AllocationSize; 
    } Create; 

    struct { 
     PIO_SECURITY_CONTEXT SecurityContext; 
     ULONG Options; 
     USHORT POINTER_ALIGNMENT Reserved; 
     USHORT ShareAccess; 
     PVOID Parameters; // PNAMED_PIPE_CREATE_PARAMETERS 
    } CreatePipe; 

    ... 

में

TCreate = record 
     SecurityContext: PIO_SECURITY_CONTEXT; 
     Options: ULONG; 
     FileAttributes: USHORT; 
     ShareAccess: USHORT; 
     EaLength: ULONG; 
     EaBuffer: PVOID;     
     AllocationSize: LARGE_INTEGER; 
    end; 

    TCreatePipe = Record 
     SecurityContext: PIO_SECURITY_CONTEXT; 
     Options: ULONG; 
     Reserved: USHORT; 
     ShareAccess: USHORT; 
     Parameters: PVOID; 
    end;  

    _FLT_PARAMETERS = Record 
    case integer of 
     0: (Create: TCreate); 
     1: (CreatePipe: TCreatePipe): 
    ... 

उत्तर

4

यह सही तरीका यह संरचना परिवर्तित करने के लिए है?

संघ को सही ढंग से अनुवाद किया है। आपका पास्कल संस्करण रिकॉर्ड यूनियन को संभालने का सही तरीका है। एक रिकॉर्ड का संस्करण हिस्सा सी संघ के समान व्यवहार किया जाता है। documentation से:

संस्करण भागों के साथ रिकॉर्ड्स जटिल रूप से जटिल लेकिन भ्रामक रूप से सरल रूप से सरल हैं। रिकॉर्ड के संस्करण भाग में कई प्रकार होते हैं जो स्मृति में समान स्थान साझा करते हैं। आप किसी भी समय किसी भी प्रकार के किसी भी क्षेत्र को पढ़ या लिख ​​सकते हैं; लेकिन यदि आप एक संस्करण में किसी फ़ील्ड में लिखते हैं और फिर किसी अन्य संस्करण में किसी फ़ील्ड में लिखते हैं, तो आप अपना डेटा ओवरराइट कर सकते हैं।


केवल मुद्दा मैं अपने कोड के साथ देख सकते हैं मैक्रो POINTER_ALIGNMENT है। उस मैक्रो का विस्तार क्या होता है? मेरी उम्मीद यह है कि यह 32 बिट कोड के लिए __declspec(align(4)) और 64 बिट कोड के लिए __declspec(align(8)) तक विस्तारित होगा।

यह मानते हुए कि अनुमान सही है, तो अपने डेल्फी कोड पहले से ही जब 32 बिट के लिए संकलन सही लेआउट होगा। ऐसा इसलिए है क्योंकि POINTER_ALIGNMENT के साथ चिह्नित प्रत्येक फ़ील्ड को पहले से ही 4 बाइट सीमा पर रखा जाएगा।

लेकिन रिकॉर्ड 64 बिट के लिए सही ढंग से बाहर रखी नहीं किया जाएगा। यदि आप 64 बिट को लक्षित कर रहे हैं तो आपको कुछ अतिरिक्त पैडिंग जोड़नी होगी क्योंकि POINTER_ALIGNMENT के साथ चिह्नित प्रत्येक सदस्य को गलत तरीके से रखा जाएगा। दुर्भाग्यवश डेल्फी में __declspec(align(#)) पर कोई समकक्ष नहीं है, इसलिए आपको मैन्युअल रूप से पैडिंग जोड़ना होगा।

आप इस गद्दी आप बहुत सावधानी से है कि दोनों सी और डेल्फी संस्करण एक ही लेआउट की जाँच करनी चाहिए जोड़ने की जरूरत है, तो। जांचें कि प्रत्येक फ़ील्ड के लिए ऑफ़सेट मैच।

+1

क्या मेरे लिए स्पष्ट नहीं है कि कैसे यह प्रणाली के मामले में विकल्प चुनता है। जैसा कि मैं इसे समझता हूं, ऐसा लगता है कि मेरे पास एक वैरिएंट प्रकार था जो टीसीआरएटी या टीक्रेट पाइप हो सकता है। यह सही है? – Flz

+1

क्या आप समझते हैं कि संघ कैसे काम करता है? एक रिकॉर्ड का संस्करण हिस्सा समान है। मैंने एक प्रलेखन लिंक और एक अंश शामिल किया है। यह वास्तव में भी मदद करेगा यदि आपने मुझे दिखाया कि 'POINTER_ALIGNMENT' क्या है, इसलिए मुझे अनुमान लगाने की आवश्यकता नहीं है। –