我的OleVariant变量之一在我的程序中被错误地分配了2次(在Delphi 7下)。
一些最终用户报告该程序可能会挂起。
我想知道OleVariant(已经未分配)的取消分配是否可能导致程序挂起?
请参阅以下功能GetWin32_NTEventlogFileInfo
中的2次取消分配,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.
答案 0 :(得分:1)
将该变量设置为Unassigned的代码行可以安全地写入0,1,2或更多次。还有其他因素导致你的问题。
将madExcept添加到您的进程中,当它挂起时,使用madTraceProcess工具检查程序的状态。