Nezoic Posted November 5, 2013 Share 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>> Link to comment Share on other sites More sharing options...
Kyokoshin Posted November 6, 2013 Share 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 :/ Link to comment Share on other sites More sharing options...
WalmartCart Posted March 4, 2014 Share 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? Link to comment Share on other sites More sharing options...
JohnOne Posted March 8, 2014 Share 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. Link to comment Share on other sites More sharing options...
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