Sign in to follow this  
Followers 0
IanN1990

ObjCreate Causes a Memory leak (Updated)

21 posts in this topic

#1 ·  Posted (edited)

In one of my functions, i need to control a class of Internet Explorer but i found after long periods of time the size of the exe goes up. After doing some testing i found it was because of ObjCreate.

Example Code.

#NoTrayIcon

While 1
sleep(250)
Make()
WEnd

Func Make()
Local $o_object = ObjCreate("InternetExplorer.Application")
$o_object.quit
$o_object =0
EndFunc

If you open up task manager, you will see the memory for the Autoit.exe goes up steady.

I had hoping, though i dont have a very good understanding of ObjGet, the following would fix my problem.

Retrieves a reference to a COM object from an existing process or filename.

ObjGet ( "filename" [, "classname"] ).

$IEPid = Run('C:\Program Files (x86)\Internet Explorer\iexplore.exe')
$IEOb= ObjGet("", "InternetExplorer.Application")

but it doesn't quite work and though a search of the forums didn't yeild a great deal but i did find this.

Which suggest both fuctions would cause a leak. I have also looked for like a DeleteObj function as well, to clean up the resources but no luck there as well.

Was wondering if anyone had any thoughts.

Edited by IanN1990

Share this post


Link to post
Share on other sites



I first to a ObjGet to "connect" to an existing instance. If this fails because there is no running instance then I use ObjCreate:

$oExcel = ObjGet("", "Excel.Application")
    If @error Then
        $oExcel = ObjCreate("Excel.Application")
        If @error Or Not IsObj($oExcel) Then Return SetError(1, @error, 0)
    EndIf

For the latest beta versions this works without crashing the script. In 3.3.8.1 you need a COM error handler to grab the error which is raised when ObjGet fails.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

On Full Version - 3.2.0 i get this error.

D:DesktopNew AutoIt v3 Script (4).au3(4,75) : ERROR: 'Return' not allowed from global scope.

If @error Or Not IsObj($oExcel) Then Return SetError(1, @error, 0)

but this function really does confuse me. For Example.

$oExcel = ObjGet("", "Excel.Application") ;Works
ObjCreate("Excel.Application") ;Doesn't Work

$IE = ObjGet("", "InternetExplorer.Application") ;Doesn't Work
ObjCreate("InternetExplorer.Application") ;Works

So i have the syntax right...and i am going down the ObjGet route to try and avoid any memory leaks if it will work at all.

Edit. I just tried

while 1
sleep(250)

Local $oExcel = ObjGet("", "Excel.Application") ; Get an existing Excel Object
WEnd

And it causes no memory leak. Now to just get it working with Internet Explorer.

I found this and will try it out but my hopes are not that high.

; An example how to obtain a running instance of the Internet Explorer
;
; Source: http://dbforums.com/t867088.html
;
; Requires: AutoIt with COM Support
; First we activate an example instance of the internet explorer.

$URL="http://www.autoitscript.com"
Run(@COMSPEC & " /c start iexplore.exe " & $URL)
Sleep(3000); Give IE some time to load
; Internet Explorer is partly integrated in shell.application

$oShell = ObjCreate("shell.application"); Get the Windows Shell Object
$oShellWindows=$oShell.windows ; Get the collection of open shell Windows

if not Isobj($oShellWindows) then
Msgbox(0,"Error","Failed to obtain shell windows. Error: " & @error)
exit

endif

; Now we search through all open Shell Windows and locate our internet page
sleep(5000)
$MyIExplorer=""

for $Window in $oShellWindows ; Count all existing shell windows

; Note: Internet Explorer appends a slash to the URL in it's window name
if $window.LocationURL = $URL & "/" then
$MyIExplorer=$Window
exitloop
endif

next

if not IsObj($MyIExplorer) then
MsgBox(0,"Error","Could not find a running instance of the internet explorer")
exit
endif

; Now we can do whatever we want, because the found object
; has the same characteristics as "InternetExplorer.Application"

Msgbox(0,"OK","Found the running instance of the Internet Explorer" & @CRLF & _
"Press 'OK' to navigate to www.google.com")

$NewURL = "http://www.google.com/"
$MyIExplorer.Navigate( $NewURL )

sleep(3000) ; Give it the time to load the web page
Msgbox(0,"Quit","Press 'OK' to quit IE")

$MyIExplorer.Quit ; Quit IE
$MyIExplorer=0 ; Release from memory

Doesnt seam to work ethier :(

Edited by IanN1990

Share this post


Link to post
Share on other sites

So Taken the Example Above, i was able to get it working. One of the issues i faced was, if you have mutipliable instances of IE then seperating them from a title would be hard.

while 1
sleep(1500)
test()
WEnd

Func Test()
$UnqiueIEID=TimerInit()
$UnquiePid = Run('"C:\Program Files (x86)\Internet Explorer\iexplore.exe" about:' & $UnqiueIEID, '', @SW_SHOW)
WinWait('about:' & $UnqiueIEID)
$oShell = ObjCreate("shell.application")
$oShellWindows=$oShell.windows

If Not Isobj($oShellWindows) then exit

$MyIExplorer=""
for $Window in $oShellWindows ; Count all existing shell windows
if $window.LocationURL = 'about:' & $UnqiueIEID then
$MyIExplorer=$Window
exitloop
endif
next

if not IsObj($MyIExplorer) then exit
$MyIExplorer.Quit ; Quit IE
$MyIExplorer=0 ; Release from memory
EndFunc

Creates a IE with TimerInIt() As the title, which will almost always be unique unless 2 functions run at the exact milisecond but as the code shows. It still has a memory leak issue which i just cant not understand.

Share this post


Link to post
Share on other sites

Why do you use version 3.2.0? This is more than 3 years old. We all run 3.3.8.1. So if some code works here and it doesn't for you then it is hard/impossible to debug.

Can't you upgrade to 3.3.8.1?


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

In Scite - Help - About Scite

SciTE

Version 3.2.0

Jun 9 2012 00:35:28

by Neil Hodgson.

Updated: Valik & Jos

I even tried re-downloading it from.

http://www.autoitscript.com/site/autoit/downloads/

http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe

http://www.autoitscript.com/site/autoit-script-editor/downloads/

http://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe

but does this mean, when you run the code in your scite. You dont have any memory leaks?

Share this post


Link to post
Share on other sites

SciTE is the editor. What we need is the Autoit version.

Run:

MsgBox(0, "", @AutoItVersion)

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

3.3.8.1

Share this post


Link to post
Share on other sites

I tried with ObjCreate("Excel.Application") and the following script.

;#AutoIt3Wrapper_UseX64=y
MsgBox(0, "", "Get memory consumption now!")
For $i = 1 To 100
    Sleep(250)
    ConsoleWrite($i & @LF)
    Make()
Next
MsgBox(0, "", "Finished!")

Func Make()
    $o_object = ObjCreate("Excel.Application")
    ConsoleWrite("  " & @error & @LF)
    $o_object.quit
EndFunc   ;==>Make
The memory consumption doesn't increase as fast as with IE.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

A good example, and it does show there is clearly a memory leak.

Is there any function that can be used to delete the Com Object or Clear it resources from memory.

Is this a bug within autoit, the function itself or just Com Objects in general?

Share this post


Link to post
Share on other sites

Here you find detailed information about COM.

"When you assign an Object variable a different value, the 'pointer' will automatically be released. You can, for instance, force deletion of an Object by assigning it any number or any text value."


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

;#AutoIt3Wrapper_UseX64=y
MsgBox(0, "", "Get memory consumption now!")
For $i = 1 To 100
Sleep(250)
ConsoleWrite($i & @LF)
Make()
Next
MsgBox(0, "", "Finished!")

Func Make()
$o_object = ObjCreate("Excel.Application")
ConsoleWrite(" " & @error & @LF)
$o_object.quit
$o_object = 'Please stop using my memory'
EndFunc ;==>Make

Well using your example and statement. This should clear the memory but it doesn't. The ram keeps going up

Share this post


Link to post
Share on other sites

Then I would suggest to restart the script after x hours or x iterations.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

So does this mean this is a bug and should be reported or submitted somewhere?

If the helpfile says "Setting the object as a number or text should release the memory" and it isnt ? Am i wrong?

Share this post


Link to post
Share on other sites

Don't know if this is a bug. Don't have enough insight in the code.

If you want the Devs to do something about your problem (locate and fix the bug or tell you that AutoIt works as designed) then you need to open a ticket.

I'm not familiar with Microsofts memory management so I can't tell you if the behaviour you see is correct. But if your script eats up all memory and crashes then it looks like a bug (or bad coding).


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

IanN1990,

Did you try with the beta version of AutoIt v3.3.9.4?


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

Yes i have, still has the memory leak. Each time it loops it gains 4kb + in memory.

Share this post


Link to post
Share on other sites

Are you looking at the Working Set memory usage, or the Private Working Set memory usage? Because they aren't the same thing.

http://cybernetnews.com/cybernotes-windows-memory-usage-explained/

http://getgreenshot.org/2010/07/24/a-few-words-on-memory-usage-or-working-set-vs-private-working-set/


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

procexp might be helpful here...

Share this post


Link to post
Share on other sites

When i saw this topic, i was using Task Manager as is, which by default shows Privite Working Memory.

Under the First link u gave me, i opened up the settings so it would show Working Set Memory as well but the outcome is still the same :)

I run the snippet from the first post, and every loop both sets of memory are going up.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0