Tôi đang cố gắng chuyển một số mã hoạt động trong Delphi XE8 sang Delphi 10 Seattle. Mã này gọi hàm GetPath trong Winapi.Windows.Delphi 10 Seattle thay đổi thành Win32 GetPath và các loại bản ghi TPoint và _POINTL dư thừa
Các Win32 API chức năng chữ ký mới là:
function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall;
Trong XE8, trước đây chức năng đã "var điểm, loại" được biết đến phổ biến như là một "untyped var" tham số.
Sửa mã để làm việc với Delphi 10 Seattle có nghĩa là "hợp nhất" các loại tùy ý trong mã ứng dụng để sử dụng chính xác các loại được khai báo trong đơn vị. Tuy nhiên điều gây nhầm lẫn cho tôi là có hai loại, PPointL và TPoint và khi tôi nhận hàm GetPath hoạt động, dữ liệu mà nó điền được điền vào một mảng các bản ghi _POINTL, được khai báo như vậy trong Winapi.Windows:
type
_POINTL = record { ptl }
x: Longint;
y: Longint;
end;
{$EXTERNALSYM _POINTL}
PPointL = ^TPointL;
TPointL = _POINTL;
Tuy nhiên, đó cũng là một loại TPoint, khai báo trong System.Types:
TPoint = record
X: FixedInt;
Y: FixedInt;
public
ở những nơi khác, FixedInt là bí danh của Longint cho cả 32 bit và 64 bit Windows, và vì vậy TPoint và _POINTL là tương đương, như như tôi có thể nói, trên nền tảng Windows ít nhất.
Nếu mã thành phần ứng dụng hiện tại là tất cả sử dụng một loại tên TPoint, như thế này:
procedure AddPoint(const P:TPoint);
... cảm giác gì tôi làm cho tình hình trên mặt đất bên trong nguồn RTL trong Delphi 10? Cách tiếp cận của tôi để sửa lỗi này là gì? Bí danh TPoint đến _POINTL ở cấp đơn vị?
Làm cách nào để khắc phục điều này và tiếp tục? Vì mã này là một thành phần thương mại, tôi nghĩ tôi sẽ chờ cho đến khi nhà cung cấp sửa lỗi này, nhưng sau đó, tôi nghĩ rằng hiểu được _POINTL và TPoint trong RTL, và tại sao các cấu trúc này được thừa/trùng lặp trong định nghĩa, sẽ giúp những người khác porting cấp thấp Win32 Mã từ Delphi XE8 đến Delphi 10 Seattle.
Cập nhật: Là một workaround, tôi thấy tôi có thể tái tuyên bố một nhập khẩu của hàm getPath, và có nó vẫn là var untyped ở riêng nhập khẩu đơn vị tư nhân khu vực thực hiện của tôi, và tiếp tục:
{$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}
Các loại không thừa, vì cả hai loại này đều được sử dụng ở đâu đó, nhưng tôi đồng ý rằng loại sai được sử dụng. Nó phải là 'PPoint', không phải là' PPointL'. –
@RudyVelthuis Một số API Win32 sử dụng 'POINTL' thay cho' POINT', vì những lý do mà tôi không thể hiểu được. Nhưng có, 'GetPath' sử dụng' ĐIỂM '. –
@DavidHeffernan: Đó là lý do tại sao tôi nói loại POINTL' không phải là dư thừa trong Delphi. FWIW, 'POINTL' và' RECTL' dường như được sử dụng trong các API Metafile. Tôi không biết tại sao những người đó không thể sử dụng các cấu trúc 'POINT' và' RECT' bình thường. Có lẽ là một nhóm phát triển cạnh tranh bên trong MS, không giao tiếp với những người khác. –