Delphi - 调用Win API

Rep*_*til 9 delphi winapi

在以下代码中调用Win API有什么区别

代码#1:

uses
  Winapi.ActiveX;

procedure Foo();
var
  pv :Pointer;
begin
  CoTaskMemFree(pv);
end;
Run Code Online (Sandbox Code Playgroud)

代码#2:

procedure CoTaskMemFree(
    pv: Pointer
    ); stdcall; external 'ole32.dll';

procedure Foo();
var
  pv :Pointer;
begin
  CoTaskMemFree(pv);
end;
Run Code Online (Sandbox Code Playgroud)

我注意到代码1的可执行文件大小(161,792字节)大于代码2的可执行文件(23,552字节).我认为因为Code 1也会编译以下单元.

unit Winapi.ActiveX;

uses Winapi.Messages, System.Types, Winapi.Windows;
Run Code Online (Sandbox Code Playgroud)
  • 使用#Code2上使用的方法还有其他优点吗?
  • 这样做有风险吗?

Dav*_*nan 10

尺寸的差异是出于你勾勒出来的原因.使用单元时,可执行文件将包含该单元的代码以及任何相关单元.您可以使用各种选项来减少影响,但是当您使用以前未使用过的单元时,您的可执行文件大小总是会增加.

procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll';
Run Code Online (Sandbox Code Playgroud)

以这种方式自己定义它是完全合理的,因此避免使用Winapi.ActiveX.实际上,如果Delphi RTL更精细地支持这种用途,那将会好得多.希望访问COM堆分配例程是很自然的,但仅此而已.