Estoy usando Delphi 2010, y cuando creé una aplicación de consola que imprime "Hello World", toma 111 kb. Si deseo consultar WMI con Delphi, agrego unidades WBEMScripting_TLB, ActiveX y Variantes a mi proyecto. Si realizo una consulta WMI simple, mi tamaño de ejecutable salta a 810 kb. I¿Cómo uso WMI con Delphi sin aumentar drásticamente el tamaño del archivo de la aplicación?
¿Hay alguna forma de consultar WMI sin una adición tan grande al tamaño del archivo? Perdona mi ignorancia, pero ¿por qué no tengo este problema con C++?
Aquí está mi código:
program WMITest;
{$APPTYPE CONSOLE}
uses
SysUtils,
WBEMScripting_TLB,
ActiveX,
Variants;
function GetWMIstring(wmiHost, root, wmiClass, wmiProperty: string): string;
var
Services: ISWbemServices;
SObject: ISWbemObject;
ObjSet: ISWbemObjectSet;
SProp: ISWbemProperty;
Enum: IEnumVariant;
Value: Cardinal;
TempObj: OLEVariant;
loc: TSWbemLocator;
SN: string;
i: integer;
begin
Result := '';
i := 0;
try
loc := TSWbemLocator.Create(nil);
Services := Loc.ConnectServer(wmiHost, root {'root\cimv2'}, '', '', '', '',
0, nil);
ObjSet := Services.ExecQuery('SELECT * FROM ' + wmiClass, 'WQL',
wbemFlagReturnImmediately and wbemFlagForwardOnly, nil);
Enum := (ObjSet._NewEnum) as IEnumVariant;
if not VarIsNull(Enum) then
try
while Enum.Next(1, TempObj, Value) = S_OK do
begin
try
SObject := IUnknown(TempObj) as ISWBemObject;
except SObject := nil;
end;
TempObj := Unassigned;
if SObject <> nil then
begin
SProp := SObject.Properties_.Item(wmiProperty, 0);
SN := SProp.Get_Value;
if not VarIsNull(SN) then
begin
if varisarray(SN) then
begin
for i := vararraylowbound(SN, 1) to vararrayhighbound(SN, 1) do
result := vartostr(SN[i]);
end
else
Result := SN;
Break;
end;
end;
end;
SProp := nil;
except
Result := '';
end
else
Result := '';
Enum := nil;
Services := nil;
ObjSet := nil;
except
on E: Exception do
Result := e.message;
end;
end;
begin
try
WriteLn('hello world');
WriteLn(GetWMIstring('.', 'root\CIMV2', 'Win32_OperatingSystem',
'Caption'));
WriteLn('done');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
ACTUALIZACIÓN: Cuando compilo el following sample from MSDN con Microsoft 2008 (aplicación de consola) Visual C++, que es de 76 kb.
Cuando dices "con C++", ¿qué compilador de C++ estás usando? C++ Builder? Visual C++? GCC? ¿Qué versión? –
¿Por qué es "una aplicación de consola que imprime 'Hola mundo'" algún tipo de punto de datos significativo para el tamaño del archivo ejecutable? –
Es un marco de referencia para usuarios que no pertenecen a Delphi que pueden estar familiarizados con la resolución del problema usando C/C++. – Mick