Embarcadero有时会错误地翻译标题。
有多个示例,但我想指出Winapi.D2D1.pas
单元,其中包含directwrite.h
的翻译。
在IDWriteFactory
接口中,我们有一个名为CreateGdiCompatibleTextLayout的函数,其当前声明不正确。
我们在Winapi.D2D1.pas中拥有的是:
function CreateGdiCompatibleTextLayout(var _string: WCHAR; stringLength: Cardinal;
var textFormat: IDWriteTextFormat; layoutWidth: Single; layoutHeight: Single;
pixelsPerDip: Single; var transform: TDwriteMatrix; useGdiNatural: BOOL;
out textLayout: IDWriteTextLayout): HResult; stdcall;
如果您查看上面的MSDN链接,您会看到正确的翻译应该是:
function CreateGdiCompatibleTextLayout(_string: PWCHAR; stringLength: Cardinal;
const textFormat: IDWriteTextFormat; layoutWidth: Single; layoutHeight: Single;
pixelsPerDip: Single; transform: PDwriteMatrix; useGdiNatural: BOOL;
out textLayout: IDWriteTextLayout): HResult; stdcall;
正如我所说,这只是一小部分,你会发现Winapi单位的翻译不正确。
这让我想到了我最初的问题。
那么如何纠正错误的翻译?
到目前为止,我遇到了3种解决方案。
复制要替换功能的单元,并将其放置在项目目录或RAD的搜索路径中。
IDE现在将使用此单元而不是安装目录中的单元。 (E.g. C:\...\sources\rtl\win\Winapi.D2D1.pas).
虽然看起来像一个快速简单的解决方案,但它有一个问题。由于其他单位使用Winapi.D2D1.pas编译,您将遇到冲突。例如,当您尝试编译使用所述单位的Firemonkey应用程序时。
您可以重新编译系统单元,但这似乎是一个草率的解决方案。
在您的项目中,您可以再次声明界面,包括您的修复。
IDWriteFactory = interface(IUnknown)
['{B859EE5A-D838-4B5B-A2E8-1ADC7D93DB48}']
...
function CreateGdiCompatibleTextLayout(_string: PWCHAR; stringLength: Cardinal;
const textFormat: IDWriteTextFormat; layoutWidth: Single; layoutHeight: Single;
pixelsPerDip: Single; transform: PDwriteMatrix; useGdiNatural: BOOL;
out textLayout: IDWriteTextLayout): HResult; stdcall;
...
end;
Embarcadero并不是这些标题中唯一的翻译。其他软件开发人员发布他们的翻译并在线发布。
所以我们可以使用它们。 在这个具体的例子中,您可以在这里找到DirectWrite和Direct2D的翻译:
https://github.com/CMCHTPC/DelphiDX12
在这里:
http://www.delphipraxis.net/179042-header-uebersetzung-directx-11-1-und-direct2d-1-1-a.html
我想知道软件开发人员如何处理这些情况以及他们的纠正方法是什么。
当然,如果Embarcadero可以修复这些翻译,那就太好了。但经过一些研究后,似乎他们并不真正关心并将其标记为“按照设计”(Quality Central)
感谢您抽出时间阅读!