Quantcast
Channel: AutoIt v3 - Developer Chat
Viewing all articles
Browse latest Browse all 750

Help with ImageSearch.DLL and C#

$
0
0

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.

AutoIt         
#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.

C#         
 [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&section=attach&attach_id=40653

from this post. http://www.autoitscript.com/forum/topic/65748-image-search-library/page-9

 


Viewing all articles
Browse latest Browse all 750

Latest Images

Trending Articles



Latest Images