2015-10-27 2 views
9

В чем разница между вызовом в Win API в следующих кодовDelphi - Вызов Win API

код # 1:

uses 
    Winapi.ActiveX; 

procedure Foo(); 
var 
    pv :Pointer; 
begin 
    CoTaskMemFree(pv); 
end; 

код # 2:

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

procedure Foo(); 
var 
    pv :Pointer; 
begin 
    CoTaskMemFree(pv); 
end; 

Я заметил, что размер исполняемого файла Код 1 (161,792 байт) больше, чем исполняемый файл код 2 (23,552 байт). я думаю, что из-за кода 1 также будут скомпилированы следующие единицы.

unit Winapi.ActiveX; 

uses Winapi.Messages, System.Types, Winapi.Windows; 
  • Есть ли другие преимущества использования метода, используемого на # Кодекса2?
  • Есть ли риск этого?

ответ

10

Разница в размере по причинам, которые вы начертите. Когда вы используете устройство, ваш исполняемый файл будет содержать код с этого устройства и любые зависимые устройства. Существуют различные варианты, которые можно использовать для уменьшения воздействия, но неизменно ваш размер исполняемого файла будет увеличиваться при использовании устройства, которое ранее не использовалось.

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

Это вполне разумно для вас, чтобы определить это самостоятельно, таким образом, и поэтому следует избегать использования Winapi.ActiveX. Фактически, было бы намного лучше, если бы Delphi RTL был более гранулированным для поддержки такого использования. Естественно желать получить доступ к процедурам распределения кучи COM, но не более того.

+0

спасибо за отличное объяснение. – RepeatUntil

Смежные вопросы