2015-09-01 5 views
8

में परिवर्तन कुछ मैं पोर्ट को डेल्फी XE8 में डेल्फी 10 सिएटल में काम करने की कोशिश कर रहा हूं। यह कोड Winapi.Windows में GetPath फ़ंक्शन को कॉल करता है।डेल्फी 10 सिएटल Win32 GetPath और अनावश्यक टीपॉइंट और _POINTL रिकॉर्ड प्रकार

नई Win32 एपीआई समारोह हस्ताक्षर है:

function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall; 

XE8 में, पहले से समारोह "var अंक, प्रकार" जो एक "var untyped" पैरामीटर के रूप में आमतौर पर जाना जाता है था।

डेल्फी 10 सिएटल के साथ काम करने के लिए कोड को ठीक करने का मतलब है कि यूनिट में घोषित बिल्कुल प्रकारों का उपयोग करने के लिए एप्लिकेशन कोड में मनमानी प्रकारों को "एकीकृत" करना है। हालांकि मुझे भ्रमित करने वाला यह है कि दो प्रकार, पीपीओटीएल, और टीपॉइंट हैं, और जब मुझे गेटपाथ फ़ंक्शन काम कर रहा है, तो जो डेटा पॉप्युलेट करता है वह _POINTL रिकॉर्ड्स की एक सरणी में आबादी में आ जाता है, इस प्रकार Winapi में घोषित किया जाता है। विन्डोज़:

type 
    _POINTL = record  { ptl } 
    x: Longint; 
    y: Longint; 
    end; 
    {$EXTERNALSYM _POINTL} 
    PPointL = ^TPointL; 
    TPointL = _POINTL; 

हालांकि, वहाँ भी है एक और प्रकार TPoint, System.Types में घोषणा की:

TPoint = record 
    X: FixedInt; 
    Y: FixedInt; 
    public 

कहीं और, FixedInt दोनों 32 बिट और 64 बिट Windows के लिए longint पर एलियास है, और इतने TPoint और _POINTL बराबर हैं, के रूप में जहां तक ​​मैं कम से कम विंडोज प्लेटफॉर्म पर बता सकता हूं।

तो मौजूदा अनुप्रयोग घटक कोड सभी एक प्रकार TPoint नामित उपयोग करते हुए, इस तरह है:

procedure AddPoint(const P:TPoint); 

... मैं डेल्फी 10 में RTL सूत्रों के अंदर जमीन पर स्थिति की क्या समझ बनाने के लिए कर रहा हूँ? इसे ठीक करने के लिए मेरा दृष्टिकोण क्या होना चाहिए? यूनिट TPoint इकाई स्तर पर _POINTL करने के लिए?

मैं इसे कैसे ठीक कर सकता हूं और आगे बढ़ सकता हूं? चूंकि यह कोड एक वाणिज्यिक घटक है, इसलिए मैं सोच रहा हूं कि विक्रेता तब तक प्रतीक्षा करेगा जब तक कि विक्रेता इसे ठीक नहीं करता है, लेकिन फिर, मुझे लगता है कि आरटीएल में _POINTL और TPoint को समझना, और इन संरचनाओं को परिभाषा में अनावश्यक/डुप्लिकेट क्यों किया जाता है, इससे मदद मिलेगी अन्य डेल्फी XE8 से डेल्फी 10 सिएटल से निम्न स्तर के Win32 कोड पोर्टिंग।

अद्यतन:

{$ifdef D23} 
{$POINTERMATH ON} 
     // Delphi 10 Seattle: function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall; 
     // previously had "var Points,Types" untyped, 
const 
    gdi32  = 'gdi32.dll'; 

{$EXTERNALSYM GetPath} 
function GetPath(DC: HDC; var Points, Types; nSize: Integer): Integer; stdcall; external gdi32 name 'GetPath'; 
{$endif} 
+0

प्रकार अनावश्यक नहीं हैं, क्योंकि दोनों कहीं कहीं उपयोग किए जाते हैं, लेकिन मैं मानता हूं कि गलत प्रकार का उपयोग किया जाता है। यह 'PPoint' होना चाहिए, न कि 'PPointL'। –

+0

@RudyVelthuis कुछ Win32 एपीआई 'POINT' के बजाय' POINTL' का उपयोग करते हैं, जिन कारणों से मैं समझ नहीं पा रहा हूं। लेकिन हां, 'गेटपाथ' 'POINT' का उपयोग करता है। –

+0

@ डेविड हेफरन: यही कारण है कि मैंने कहा कि 'POINTL' प्रकार डेल्फी में अनावश्यक नहीं है। एफडब्ल्यूआईडब्ल्यू, 'POINTL' और' RECTL' मेटाफाइल एपीआई में उपयोग किया जाता प्रतीत होता है। मुझे नहीं पता कि वे सामान्य 'POINT' और 'RECT' structs का उपयोग क्यों नहीं कर सकते हैं। शायद एमएस के अंदर एक प्रतिस्पर्धी विकास समूह, दूसरों के साथ संवाद नहीं कर रहा है।

उत्तर

9

: समाधान के लिए, मुझे लगता है मैं समारोह GetPath की एक आयात फिर से घोषणा कर सकते हैं, और यह वर मेरे अपने निजी इकाई कार्यान्वयन क्षेत्र आयात में untyped के रूप में रहते हैं, और जारी रखने के लिए लगता है इसके बारे में ज्यादा कुछ नहीं कहा गया है, इस तथ्य से परे कि डीएक्स सिएटल में Winapi.Windows.GetPath में परिवर्तन गलत है। मेरा मतलब है, तकनीकी रूप से यह काम करेगा, लेकिन यह किसी भी कोड को छोड़ देता है जो एक पृथक सिलो में GetPath का उपयोग करता है।

यह TPointL प्रकार नया नहीं है, लेकिन यह GetPath के लिए गलत प्रकार है। Win32 एपीआई समारोह है:

int GetPath(
    _In_ HDC  hdc, 
    _Out_ LPPOINT lpPoints, 
    _Out_ LPBYTE lpTypes, 
    _In_ int  nSize 
); 

और LPPOINTPOINT* और POINTTPoint के नक्शे है। कुछ Win32 API फ़ंक्शन हैं जो POINTL का उपयोग करते हैं, लेकिन बहुमत POINT का उपयोग करते हैं। बेशक, माइक्रोसॉफ्ट दो समान प्रकार घोषित करके मदद नहीं कर रहा है जब कोई पर्याप्त होगा।

यह देखने में बहुत मुश्किल है कि Embarcadero डेवलपर के साथ GetPath में कैसे आ गया है, लेकिन वहां आप जाते हैं।मेरे विचार में आपको एक क्यूपी रिपोर्ट जमा करनी चाहिए और अनुरोध करना चाहिए कि घोषणा PPointL से PPoint में बदल दी गई है।

इस बीच एक साधारण कास्ट पर्याप्त होगा क्योंकि इन दो प्रकार बाइनरी संगत हैं। आप PPoint पास करना चाहते हैं, लेकिन कंपाइलर PPointL चाहता है। तो PPointL(...) पास करें जहां ... वह अभिव्यक्ति है जो PPoint उत्पन्न करती है।

+0

यह डेल्फी 10.1 बर्लिन में तय किया गया है https://quality.embarcadero.com/browse/RSP-12086 –

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