2010-01-06 1 views
2

내 응용 프로그램에서 동일한 프로세스에 대한 창 텍스트를 읽습니다. User32.dll의 GetWindowText를 사용하고 있습니다. 그러나 메서드를 호출하려고하면 "처리되지 않은 'System.ExecutionEngineException'형식의 예외가 aaaa.exe에서 발생했습니다."예외가 발생합니다. 정확한 오류는 어디서 볼 수 있습니까? 그리고 왜 내가이 예외를 얻고 있는가.'System.ExecutionEngineException'형식의 처리되지 않은 예외가 발생했습니다. user32.dll의 GetWindowText()에서 창을 읽으려고 할 때

내 코드는 다음과 같습니다.

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern int GetWindowText(IntPtr hWnd, 
    [Out] StringBuilder lpString, int nMaxCount); 

EnumDelegate enumfunc = new EnumDelegate(EnumWindowsProc); 

private bool EnumWindowsProc(IntPtr win, int lParam) 
{ 
    StringBuilder sb = new StringBuilder(); 
    GetWindowText(win, sb, 100); 
    if (sb.Length > 0) 
    { 
     // do something 
    } 
} 
+0

는 당신이 우리 예외를 나타내는 (감소) 샘플 보여줄 수 있을까? 이것은'GetWindowText'를 호출하는 방식에 문제가있을 수 있습니다. 동일한 프로세스의 창에서 텍스트를 읽으려는 대신 관리되는 API를 사용하는 것이 좋습니다. –

+0

@AvidProgrammer : 코드가 nobugz 샘플과 다릅니다. 당신은'StringBuilder'를 초기 용량으로 초기화하고 그 용량을'GetWindowText' 함수에'nMaxCount'의 값으로 정확히 전달하기 위해 빠져 있습니다. 그 트릭을해야합니다. 그렇지 않으면 문자열 작성기 객체에 빈 버퍼가 있고 GetWindowText가 쓰기 작업에 실패합니다 (향후 게시를위한 사이드 노드로 : 코드를 4 칸 들여 쓰기하거나 * Format as Code * 버튼을 누르면 코드가 멋지게 포맷 됨). –

+0

@divo : 차이점을 지적 해 주셔서 감사합니다. 문자열 빌더의 용량을 설정하고 API 빌더의 기능을 사용하면 트릭을 만들 수 있습니다. –

답변

7

GetWindowText() 호출에서 가비지 수집 힙이 손상 되었기 때문에이 예외가 발생합니다. StringBuilder 대신 문자열을 전달하거나 StringBuilder를 초기화하는 것을 잊어 버리면 쉽게 수행 할 수 있습니다.

올바른 방법 :

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    private static extern bool GetWindowText(IntPtr hWnd, StringBuilder buffer, int buflen); 
... 
    var sb = new StringBuilder(666); 
    if (GetWindowText(handle, sb, sb.Capacity)) { 
    string txt = sb.ToString(); 
    //... 
    } 
+0

문자열 작성기를 사용하고 초기화했습니다. 변경 만 CharSet.Auto로 charset을 사용하고 있습니다. 문제가 될 것인가? –

+0

마지막 진술에 대한 참조가 있습니까? 저는 GetWindowText를 사용하여 out-of-proc HWND의 캡션을 성공적으로 가져 왔으며 비고 섹션 (http://msdn.microsoft.com/en-us/library/ms633520%28VS.85%29)에 따라 성공적으로 캡션을 검색했습니다. aspx) 이것은 문제가되지 않습니다. –

+0

그냥이 중 하나 : *이 기능은 다른 응용 프로그램에서 편집 컨트롤의 텍스트를 검색 할 수 없습니다 * 내 게시물을 감사드립니다. –