Nezoic Posted November 5, 2013 Posted November 5, 2013 So I'm trying to port this code from the ImageSearch.Dll into C# and I think I have some type of conversion errors but C# is not catching the unmanaged exception and instead just crashed the program. I'm curious if anyone here can lend me a hand in debugging this. Here is the original Autoit code. expandcollapse popup#include-once ; ------------------------------------------------------------------------------ ; ; AutoIt Version: 3.0 ; Language: English ; Description: Functions that assist with Image Search ; Require that the ImageSearchDLL.dll be loadable ; ; ------------------------------------------------------------------------------ ;=============================================================================== ; ; Description: Find the position of an image on the desktop ; Syntax: _ImageSearchArea, _ImageSearch ; Parameter(s): ; $findImage - the image to locate on the desktop ; $tolerance - 0 for no tolerance (0-255). Needed when colors of ; image differ from desktop. e.g GIF ; $resultPosition - Set where the returned x,y location of the image is. ; 1 for centre of image, 0 for top left of image ; $x $y - Return the x and y location of the image ; ; Return Value(s): On Success - Returns 1 ; On Failure - Returns 0 ; ; Note: Use _ImageSearch to search the entire desktop, _ImageSearchArea to specify ; a desktop region to search ; ;=============================================================================== Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance) return _ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance) EndFunc Func _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance) ;MsgBox(0,"asd","" & $x1 & " " & $y1 & " " & $right & " " & $bottom) if $tolerance>0 then $findImage = "*" & $tolerance & " " & $findImage $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage) ; If error exit if $result[0]="0" then return 0 ; Otherwise get the x,y location of the match and the size of the image to ; compute the centre of search $array = StringSplit($result[0],"|") $x=Int(Number($array[2])) $y=Int(Number($array[3])) if $resultPosition=1 then $x=$x + Int(Number($array[4])/2) $y=$y + Int(Number($array[5])/2) endif return 1 EndFunc ;=============================================================================== ; ; Description: Wait for a specified number of seconds for an image to appear ; ; Syntax: _WaitForImageSearch, _WaitForImagesSearch ; Parameter(s): ; $waitSecs - seconds to try and find the image ; $findImage - the image to locate on the desktop ; $tolerance - 0 for no tolerance (0-255). Needed when colors of ; image differ from desktop. e.g GIF ; $resultPosition - Set where the returned x,y location of the image is. ; 1 for centre of image, 0 for top left of image ; $x $y - Return the x and y location of the image ; ; Return Value(s): On Success - Returns 1 ; On Failure - Returns 0 ; ; ;=============================================================================== Func _WaitForImageSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance) $waitSecs = $waitSecs * 1000 $startTime=TimerInit() While TimerDiff($startTime) < $waitSecs sleep(100) $result=_ImageSearch($findImage,$resultPosition,$x, $y,$tolerance) if $result > 0 Then return 1 EndIf WEnd return 0 EndFunc ;=============================================================================== ; ; Description: Wait for a specified number of seconds for any of a set of ; images to appear ; ; Syntax: _WaitForImagesSearch ; Parameter(s): ; $waitSecs - seconds to try and find the image ; $findImage - the ARRAY of images to locate on the desktop ; - ARRAY[0] is set to the number of images to loop through ; ARRAY[1] is the first image ; $tolerance - 0 for no tolerance (0-255). Needed when colors of ; image differ from desktop. e.g GIF ; $resultPosition - Set where the returned x,y location of the image is. ; 1 for centre of image, 0 for top left of image ; $x $y - Return the x and y location of the image ; ; Return Value(s): On Success - Returns the index of the successful find ; On Failure - Returns 0 ; ; ;=============================================================================== Func _WaitForImagesSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance) $waitSecs = $waitSecs * 1000 $startTime=TimerInit() While TimerDiff($startTime) < $waitSecs for $i = 1 to $findImage[0] sleep(100) $result=_ImageSearch($findImage[$i],$resultPosition,$x, $y,$tolerance) if $result > 0 Then return $i EndIf Next WEnd return 0 EndFunc And here is my c# code. As soon as it tried to call ImageSearch, the program crashes without any exception. expandcollapse popup[DllImport("ImageSearchDLL.dll")] static extern string ImageSearch(int aLeft, int aTop, int aRight, int aBottom, string aImageFile); public static Point _ImageSearch(string findImage, bool resultPosition, int tolerance) { int right = Screen.PrimaryScreen.WorkingArea.Right; int bottom = Screen.PrimaryScreen.WorkingArea.Bottom; return _ImageSearchArea(findImage, resultPosition, 0, 0, right, bottom, tolerance); } public static Point _ImageSearchArea(string findImage, bool resultPosition, int x1, int y1, int right, int bottom, int tolerance) { new Thread(delegate() { try { string result = ImageSearch(x1, y1, right, bottom, "*100" + findImage); } catch (SEHException sehException) { int errcode = sehException.ErrorCode; throw sehException; } }).Start(); Point imagelocation = new Point(); //imagelocation.X = Convert.ToInt32(arr[2]); //imagelocation.Y = Convert.ToInt32(arr[3]); //if (resultPosition) //{ // imagelocation.X += Convert.ToInt32(arr[4]) / 2; // imagelocation.Y += Convert.ToInt32(arr[5]) / 2; //} return imagelocation; } Any thoughts on how to catch / debugg the call to imagesearch? oh and here is the original files / dll I'm using.http://http://www.autoitscript.com/forum/index.php?app=core&module=attach§ion=attach&attach_id=40653 from this post. '?do=embed' frameborder='0' data-embedContent>>
Kyokoshin Posted November 6, 2013 Posted November 6, 2013 i have the same problem atm ^^ have you tried the 64bit Version of the dll? (>found here) with this dll it doesnt crash the programm but it throws an System.BadImageFormatException error. i tried some formats to solve this error but nothing works for me :/
WalmartCart Posted March 4, 2014 Posted March 4, 2014 Hey, have you guys manage to resolve the issue? I am having the same issue now! I couldn't find the solution online anywhere. Does anyone have it work on C# at all?
JohnOne Posted March 8, 2014 Posted March 8, 2014 Can't remember a great deal about C# but Imagesearch appears to return a string, not a Point structure or an array. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now