DELPHI b OLE. Неужели все так плохо.
В Delphi есть проблема при работе с OLE - память после высвобождении объекта не очищается полностью. Что бы ты через это OLE не делал хоть выгрузки в Excel хоть под Word хоть под ADO, остаются куски памяти о которых программа не помнит.
МОЖЕТ БЫТЬ КТО-НИБУДЬ РЕШИЛ ЭТУ ПРОБЛЕМУ, ПРОШУ ПОВЕДАЙТЕ КАК ИМЕННО.
И как ни странно проблема есть, перерыл весь инет, а решения нет.
ЧТО ДЕЛАТЬ!!!!!!!!!!!!
Ну для примера
procedure SaveLog(FileName,Module,Event:String); stdcall;
const
//==============================================================
adParamReturnValue=4; adParamInput=1; adParamOutput=2;
//--------------------------------------------------------------
adEmpty=0 ; adBoolean=11 ; adTinyInt=16 ;
adSmallInt=2 ; adInteger=3 ; adBigInt=20 ;
adUnsignedTinyInt=17 ; adUnsignedSmallInt=18 ; adUnsignedInt=19 ;
adUnsignedBigInt=21 ; adSingle=4 ; adDouble=5 ;
adCurrency=6 ; adDecimal=14 ; adNumeric=131;
adDate=7 ; adDBDate=133; adDBTime=134;
adDBTimeStamp=135; adFileTime=64 ; adGUID=72 ;
adError=10 ; adIUnknown=13 ; adIDispatch=9 ;
adVariant=12 ; adPropVariant=138; adBinary=128;
adChar=129; adWChar=130; adBSTR=8 ;
adChapter=136; adUserDefined=132; adVarNumeric=139;
//==============================================================
Var Connection,
Command ,
Res,
Parametr1 ,
Parametr2 ,
Parametr3 :OLEVariant;
Number:Integer;
begin
// OleInitialize(nil);
//----------------------------------------------
if Assigned(ComObj.CoInitializeEx) then begin
ComObj.CoInitializeEx(nil, COINIT_MULTITHREADED)
end else begin CoInitialize(nil); end;
TRY
Connection := CreateOleObject('ADODB.Connection');
Command := CreateOleObject('ADODB.Command');
Connection.Open('Driver={Microsoft dBase Driver (*.dbf)};Initial Catalog='+
ExtractFileDir(FileName));
EXCEPT
Command := UnAssigned;
Connection := UnAssigned;
CoUnInitialize; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Exit;
END;
// Create base ---------------------------------------
TRY
if not FileExists(FileName) then begin
Connection.Execute('Create TABLE ' +
'"'+ExtractFileName(FileName)+'"'+
' ('+
'NUMBER_ NUMERIC ,'+
'Module CHAR(20) ,'+
'Event CHAR(240) '+
' )');
Connection.Execute('create index _NUMBER_ on "'+
ExtractFileName(FileName)+'" (NUMBER_)');
end;
EXCEPT
Command := UnAssigned;
Connection := UnAssigned;
CoUnInitialize; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Exit;
END;
// Create base ---------------------------------------
// Insert zapis to Table -----------------------------
TRY
Command.ActiveConnection := Connection;
Command.CommandText:='SELECT MAX(NUMBER_) FROM '+ExtractFileName(FileName);
Res:=Command.Execute;
if VarIsNull(Variant(Res.Fields[0].Value)) then begin
Number:=0;
end else begin
Number:=Integer(Res.Fields[0].Value)+1;
end;
Res.Close;
Parametr1:=Command.CreateParameter('Nmb1', adInteger,adParamInput);
Command.Parameters.Append(Parametr1);
Parametr2:=Command.CreateParameter('Module', adChar,adParamInput,20 );
Command.Parameters.Append(Parametr2);
Parametr3:=Command.CreateParameter('Event', adChar,adParamInput,240 );
Command.Parameters.Append(Parametr3);
Command.CommandText:=
'INSERT INTO '+ExtractFileName(FileName)+
' (NUMBER_,Module,Event) '+
' VALUES ( ?,?,? )';
Command.Parameters[0].Value := Variant(Number);
Command.Parameters[1].Value := Module;
Command.Parameters[2].Value := Event;
Command.Execute;
Command.Parameters.Delete[2];
Command.Parameters.Delete[1];
Command.Parameters.Delete[0];
EXCEPT
Res := UnAssigned;
Parametr1 := UnAssigned;
Parametr2 := UnAssigned;
Parametr3 := UnAssigned;
Command := UnAssigned;
Connection := UnAssigned;
CoUnInitialize; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Exit;
END;
// Insert zapis to Table -----------------------------
Connection.Close;
Res.Release;
Parametr1.Release;
Parametr2.Release;
Parametr3.Release;
Command.Release;
Res := UnAssigned;
Parametr1 := UnAssigned;
Parametr2 := UnAssigned;
Parametr3 := UnAssigned;
Command := UnAssigned;
Connection := UnAssigned;
// OleUninitialize;
CoUnInitialize; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//----------------------------------------------
end;//SaveLog