Sto usando Delphi 2010 e quando ho creato un'applicazione console che stampa "Hello World", richiede 111 kb. Se voglio interrogare WMI con Delphi, aggiungo le unità WBEMScripting_TLB, ActiveX e Variants al mio progetto. Se eseguo una semplice query WMI, la mia dimensione eseguibile passa a 810 kb. ICome utilizzare WMI con Delphi senza aumentare drasticamente le dimensioni del file dell'applicazione?
Esiste comunque una query su WMI senza una così grande aggiunta alla dimensione del file? Perdona la mia ignoranza, ma perché non ho questo problema con C++?
Ecco il mio codice:
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.
UPDATE: Quando compilo il following sample from MSDN con Microsoft Visual C++ 2008 (applicazione di console), è di 76 kb.
Quando si dice "con C++", quale compilatore C++ stai usando? C++ Builder? Visual C++? GCC? Quale versione? –
Perché "un'applicazione console che stampa" Hello World "" ha alcun tipo di punto dati significativo per le dimensioni dell'eseguibile? –
È un sistema di riferimento per utenti non Delphi che possono avere familiarità con la risoluzione del problema utilizzando C/C++. – Mick