Отменить назначение OleVariant в Delphi 7
Одна из моих переменных OleVariant была ошибочно назначена в моей программе 2 раза (в Delphi 7).
Некоторые конечные пользователи сообщили, что программа может зависнуть.
Мне было интересно, не может ли причиной зависания программы быть назначение OleVariant (уже не назначенного)?
Пожалуйста, смотрите ниже 2 назначения в функции GetWin32_NTEventlogFileInfo
где TempObj:=Unassigned;
написано 2 раза...
Спасибо за помощь.
program GetWMI_Info;
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
WbemScripting_TLB,
Variants;
// CIM_DataFile est un type de fichiers logiques qui est un ensemble nommé de données ou un code exécutable.
// <B>Le comportement du fournisseur supportant cette classe sera modifié lors des prochaines sorties. Actuellement le fournisseur renvoie les fichiers sur des disques fixes ainsi que des fichiers mappés sur des disques logiques. À l’avenir, seules des instances de fichiers sur des disques fixes locaux seront renvoyés.<B>
procedure GetWin32_NTEventlogFileInfo;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : ISWbemLocator;
FWMIService : ISWbemServices;
FWbemObjectSet: ISWbemObjectSet;
FWbemObject : ISWbemObject;
FWbemPropertySet: ISWbemPropertySet;
TempObj : OleVariant;
oEnum : IEnumvariant;
iValue : Cardinal;
begin
FSWbemLocator := CoSWbemLocator.Create;
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword, '', '', 0, nil);
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NTEventlogFile','WQL', wbemFlagForwardOnly, nil);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, TempObj, iValue) = 0 do
begin
FWbemObject := IUnknown(TempObj) as ISWBemObject;
FWbemPropertySet:= FWbemObject.Properties_;
Writeln(Format('CSName %s',[String(FWbemPropertySet.Item('CSName', 0).Get_Value)]));// String
Writeln(Format('Description %s',[String(FWbemPropertySet.Item('Description', 0).Get_Value)]));// String
Writeln('');
TempObj:=Unassigned;
TempObj:=Unassigned; // MY MISTAKE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
end;
end;
begin
try
CoInitialize(nil);
try
GetWin32_NTEventlogFileInfo;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
1 ответ
Решение
Строка кода, которая устанавливает эту переменную в Unassigned, может быть безопасно записана 0, 1, 2 или более раз. Что-то еще вызывает твою проблему.
Добавьте madExcept в свой процесс и, когда он зависает, используйте инструмент madTraceProcess для проверки состояния вашей программы.