Показать сообщение отдельно
  #4  
Старый 29.03.2012, 10:35
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию

Еще раз спасибо отвившим, эта тема очень вскользь описана и ответов я пока не нашёл. В общем, как я понимаю, для того, чтобы освободить память мне достаточно переменной интерфейсного типа присвоить nil? Остальное сделает сама Delphi?
Но я провёл эксперимент:
procedure TForm1.FormCreate(Sender: TObject);
var
Mem : _MEMORYSTATUS;
RetMem : Cardinal;

//R:HRESULT;
B:IOPCBrowseServerAddressSpace;
Ser:IOPCServer;
I:IDispatch;
pEnum:IEnumString;
S:String;
pS,ItemID : POleStr;
L:Longint;
begin
//R := CoInitializeEx(nil,COINIT_APARTMENTTHREADED);
//OutputDebugString(PChar(Format('%d',[R])));
GlobalMemoryStatus(Mem);
RetMem := Mem.dwAvailVirtual;
OutputDebugString(PChar(Format('Свободная память: %d',[RetMem - Mem.dwAvailVirtual])));

//CoGetMalloc(1, Ser);
Ser:=CreateComObject(ProgIDToClassID('dOPCSim.Kass l.Simulation')) as IOPCServer;
GlobalMemoryStatus(Mem);
OutputDebugString(PChar(Format('Память после создания сервера: %d',[RetMem - Mem.dwAvailVirtual])));

(*Ser.QueryInterface(IID_IOPCBrowseServerAddressSp ace,B);
GlobalMemoryStatus(Mem);
OutputDebugString(PChar(Format('Память после создания В: %d',[RetMem - Mem.dwAvailPhys])));

B.BrowseOPCItemIDs(OPC_BRANCH{OPC_LEAF},'',VT_EMPT Y,0,pEnum);
GlobalMemoryStatus(Mem);
OutputDebugString(PChar(Format('Память после создания перечисления: %d',[RetMem - Mem.dwAvailPhys])));

//OutputDebugString(PChar(Format('%d',[R])));
//CoTaskMemFree(pEnum);

{pEnum.Next(1,pS,@L);
S := pS;
OutputDebugString(PChar(Format('%s : %d',[S,L])));

B.GetItemID(pS,ItemID);
OutputDebugString(PChar(Format('%s',[ItemID])));

pEnum.Next(1,pS,@L);
S := pS;
OutputDebugString(PChar(Format('%s : %d',[S,L])));

B.GetItemID(pS,ItemID);
OutputDebugString(PChar(Format('%s',[ItemID])));}

B := Nil;*)
{ CoGetMalloc(1, cntMalloc);
if Assigned(ppServerStatus.szVendorInfo) then
cntMalloc.Free(ppServerStatus.szVendorInfo);
if Assigned(ppServerStatus) then
cntMalloc.Free(ppServerStatus);}
//Ser.;
Ser := Nil;
GlobalMemoryStatus(Mem);
OutputDebugString(PChar(Format('Память в конце: %d',[RetMem - Mem.dwAvailVirtual])));
//CoUninitialize;
end;

Ипри завершении процедуры последний вызов GlobalMemoryStatus(Mem) не даёт нуля. Хотя переменной Ser я вроде бы nil присвоил. Пытался насыльно вызвать Ser._Release но добился исключения и завершения по ошибке. Короче мож я не то делаю, или ошибочно понимаю технологию создания и освобождения. Да первоначально вопрос был другой, о результатах вызова этих функции, и и от самих одъектов типа OPC сервера память надо освобождать, ибо они больщие (сотни килобайт). Короче я запутался...
Ответить с цитированием