Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.187.233] |
|
Сообщ.
#1
,
|
|
|
Ребята добрый день.
Скачал пример из интернета.. но увы имею утечку памяти примерно в 40 байт за цикл в этой строчке кода while Enumerator.Next(1, System, j) = S_OK do Посоветуйте как избавиться от утечки памяти. что только не пробывал. даже отдельный поток с освобождением памяти по завершению Скаченный пример: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) lst1: TListBox; btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ActiveX, ComObj; procedure TForm1.btn1Click(Sender: TObject); Var Enumerator: IEnumVariant; WbemLocator, WbemServices, WbemObjectSet: Variant; Properties: IEnumVariant; Property_, System: OleVariant; j: LongWord; sProperty: string; VID,PID,Serial: ShortString; begin lst1.Clear; WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); WbemServices := WbemLocator.ConnectServer; WbemObjectSet := WbemServices.InstancesOf('Win32_usbhub'); Enumerator := IEnumVariant(TVarData(WbemObjectSet._NewEnum).VDispatch); try while Enumerator.Next(1, System, j) = S_OK do try try if (System.Caption <> 'Запоминающее устройство для USB') then Continue; except end; Properties := IEnumVariant(TVarData(System.Properties_._NewEnum).VDispatch); while Properties.Next(1, Property_, j) = S_OK do begin sProperty := VarToStr(Property_.Value); if (Property_.Name = 'DeviceID') then begin VID := Copy(sProperty, Pos('VID_',sProperty)+4,4); PID := Copy(sProperty, Pos('PID_',sProperty)+4,4); Serial := Copy(sProperty, Pos('PID_',sProperty)+9,Length(sProperty)-Pos('PID_',sProperty)+10); if ((Pos('\',Serial) > 0)) then Begin Serial := Copy(Serial,Pos('\',Serial)+1,Length(Serial)-Pos('\',Serial)); end; lst1.Items.Add('VID: '+ VID + ' PID: ' + PID + ' SERIAL: ' + Serial); end; end; except end; except end; end; end. |
Сообщ.
#2
,
|
|
|
Читал статью. подкоректрировал код но не помогло
https://www.gunsmoker.ru/2011/05/9.html procedure list; //обновляем список значений переменных в самом списке VariableList Var Enumerator: IEnumVariant; WbemObjectSet: Variant; Properties: IEnumVariant; Property_, System: OleVariant; j: LongWord; sProperty: string; VID,PID,Serial: ShortString; WbemLocator, WbemServices: Variant; begin form1.lsttmp.Clear; WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); WbemServices := WbemLocator.ConnectServer; WbemObjectSet := WbemServices.InstancesOf('Win32_usbhub'); Enumerator := IEnumVariant(TVarData(WbemObjectSet._NewEnum).VDispatch); while Enumerator.Next(1, System, j) = S_OK do begin if (System.Caption ='Запоминающее устройство для USB') then begin Properties := IEnumVariant(TVarData(System.Properties_._NewEnum).VDispatch); VariantClear(System); while Properties.Next(1, Property_, j) = S_OK do begin sProperty := VarToStr(Property_.Value); if (Property_.Name = 'DeviceID') then begin VID := Copy(sProperty, Pos('VID_',sProperty)+4,4); PID := Copy(sProperty, Pos('PID_',sProperty)+4,4); Serial := Copy(sProperty, Pos('PID_',sProperty)+9,Length(sProperty)-Pos('PID_',sProperty)+10); if ((Pos('\',Serial) > 0)) then Begin Serial := Copy(Serial,Pos('\',Serial)+1,Length(Serial)-Pos('\',Serial)); end; form1.lsttmp.Add('VID='+VID+'PID='+PID+'Serial='+Serial); end; end; end; VariantInit(System); VariantClear(System); VariantInit(Property_); VariantClear(Property_); end; VariantClear(Property_); VariantClear(System); WbemObjectSet := Unassigned; WbemLocator := Unassigned; WbemServices := Unassigned; Property_:=Unassigned; System :=Unassigned; end; Добавлено ответ таков. нужно сначала очистить. а потом еще и иницилизировать Добавлено procedure list; //обновляем список значений переменных в самом списке VariableList Var Enumerator: IEnumVariant; WbemObjectSet: Variant; Properties: IEnumVariant; Property_: OleVariant; j: LongWord; sProperty: string; VID,PID,Serial: ShortString; WbemLocator, WbemServices: Variant; begin form1.lsttmp.Clear; WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); WbemServices := WbemLocator.ConnectServer; WbemObjectSet := WbemServices.InstancesOf('Win32_usbhub'); Enumerator := IEnumVariant(TVarData(WbemObjectSet._NewEnum).VDispatch); VariantInit(form1.tmpOut); VariantInit(Property_); VariantClear(form1.tmpOut); VariantClear(Property_); while Enumerator.Next(1, form1.tmpOut, j) = S_OK do begin if (form1.tmpOut.Caption ='Запоминающее устройство для USB') then begin Properties := IEnumVariant(TVarData(form1.tmpOut.Properties_._NewEnum).VDispatch); while Properties.Next(1, Property_, j) = S_OK do begin sProperty := VarToStr(Property_.Value); if (Property_.Name = 'DeviceID') then begin VID := Copy(sProperty, Pos('VID_',sProperty)+4,4); PID := Copy(sProperty, Pos('PID_',sProperty)+4,4); Serial := Copy(sProperty, Pos('PID_',sProperty)+9,Length(sProperty)-Pos('PID_',sProperty)+10); if ((Pos('\',Serial) > 0)) then Begin Serial := Copy(Serial,Pos('\',Serial)+1,Length(Serial)-Pos('\',Serial)); end; form1.lsttmp.Add('VID='+VID+'PID='+PID+'Serial='+Serial); end; VariantClear(Property_); VariantInit(Property_); end; end; VariantClear(form1.tmpOut); VariantInit(form1.tmpOut); end; VariantInit(form1.tmpOut); VariantInit(Property_); WbemObjectSet := Unassigned; WbemLocator := Unassigned; WbemServices := Unassigned; end; |