在Delphi 7中取消分配OleVariant

时间:2014-01-18 07:14:21

标签: delphi variant

我的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.

1 个答案:

答案 0 :(得分:1)

将该变量设置为Unassigned的代码行可以安全地写入0,1,2或更多次。还有其他因素导致你的问题。

将madExcept添加到您的进程中,当它挂起时,使用madTraceProcess工具检查程序的状态。