2010-08-23 3 views
1

나는 만들고있는 프로그램의 기초로 this sample을 사용하고 있습니다. 약 618 키 입력 후 프로그램이 오류가 발생합니다 :프로그램이 임의로 오류를 throw합니다. (vb.net)

CallbackOnCollectedDelegate was detected 
Message: A callback was made on a garbage collected delegate of type 'KeyLogger!KeyLogger.CallBackFunction+DelegateCallBack::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called. 

오류 응용 프로그램이 실행되는 대부분의 시간을 던져,하지만 모든 시간이 아닌 같은 키 입력 횟수에있다. 오류 메시지에서 가비지 수집기가 대리인을 수집하는 것처럼 들린다 고 생각합니다. 어떻게 방지 할 수 있습니까?

내가 만든 프로그램은 기본적으로 vb.net 프로젝트의 수정 된 버전이지만 실제로는 키 입력을 저장하지 않습니다.

도움 주셔서 감사합니다. CallBack.vb 내

코드 : Declarations.vb에서

Option Strict Off 
Option Explicit On 
Module CallBackFunction 
    '****************************************************************************************** 
    '  Sample for retrieving keystrokes by use of the "kbLog32.dll" 
    '      (c) 2004 by Nadeem Afanah. 
    '****************************************************************************************** 

    'CallBack function 
    Delegate Sub DelegateCallBack(ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) 

    Sub CallBack(ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) 
     'here we track only WM_CHAR and WM_KEYDOWN 
     If msg = WM_KEYDOWN Then 
      ...  
     End If 
    End Sub 
End Module 

코드 :

StartLog(nhWnd_text, AddressOf CallBack) 

: 그것은이 작업을 수행으로 Form1.vb의 코드에서

Option Strict Off 
Option Explicit On 
Module Declarations 
    '****************************************************************************************** 
    '  Sample for retrieving keystrokes by use of the "kbLog32.dll" 
    '      (c) 2004 by Nadeem Afanah. 
    '****************************************************************************************** 
    '****************************************************************************************** 
    'DLL declarations 
    Public Declare Function StartLog Lib "kbLog32" (ByVal hWnd As Integer, ByVal lpFuncAddress As DelegateCallBack) As Integer 

    Public Declare Sub EndLog Lib "kbLog32"() 

    '---------------------------------------------------------------------------------------- 
    Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer 
    Declare Function FindWindow Lib "user32" Alias "FindWindowA"(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer 
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA"(ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer 
    '**************************************************************************************** 
    ' Keyboard messages 
    Public Const WM_KEYUP As Short = &H101s 
    Public Const WM_KEYDOWN As Short = &H100s 
    Public Const WM_CHAR As Short = &H102s 
    Public Const WM_SYSKEYDOWN As Short = &H104s 
    Public Const WM_SYSKEYUP As Short = &H105s 

    'SetWindowPos messages 
    Public Const SWP_NOSIZE As Short = &H1s 
    Public Const SWP_NOMOVE As Short = &H2s 
    Public Const HWND_TOPMOST As Short = -1 
    Public Const SWP_SHOWWINDOW As Short = &H40s 
    '****************************************************************************************** 

End Module 
+0

제목 aro를 자유롭게 변경하십시오. und, 그것은 매우 설명 적이 지 않다. 그리고 나는 그것에 대해 사과한다. – Cyclone

+0

더 많은 정보가 필요하다고 생각합니다. * (IE : code) * – ChaosPandion

+0

수정 버전을 살펴보면 HTML 링크가 있지만 HTML 링크가 더 이상 허용되지 않는다고 생각합니다. 지금은 링크에 대한 가격 인하를 사용하고 있습니다. – Cyclone

답변

3

봐 이것은 말하고있는 곳이며, 콜백 함수의 위치를 ​​취하여 키보드 이벤트와 관련하여받은 메시지를 처리합니다. 에스. 이 같은

시도 뭔가 :

Friend Class Form1 
    Inherits System.Windows.Forms.Form 
    ''Add this ---------------------------- 
    <MarshalAs(UnmanagedType.FunctionPtr)> _ 
    Private DelSub as New DelegateCallBack(AdressOf CallBack) 
    ''------------------------------------- 

    ''In the sub Sub Command1_Click 
    ''Change this ------------------------- 
     StartLog(nhWnd_text, AddressOf CallBack) 
    ''To this ----------------------------- 
     StartLog(nhWnd_text, DelSub) 
    ''------------------------------------- 

End Class 

은 우리가 여기서하고있는 것은 지역 "위임 하위"(서브에서 가리키는 변수로 생각) 만드는 것입니다. 우리는 이것을 Callback sub로 지적하고 있습니다. 우리는 Callback sub에 직접 참조를 전달하는 대신이 델리게이트 서브를 사용할 것입니다.

의 차이는 그렇게하지 쓰레기는 기본이됩니다으로 MarshallAs 비트가 조금 불필요

(메모리에서 삭제)를 수집 닷넷 프레임 워크는 이제 뭔가 가리키는 그 하위에 있다는 것을 알고있다 marshalling이라는 의미 일 뿐이지 만 닷넷 프레임 워크 외부의 무언가에 액세스하기 위해 델리게이트를 사용하고 있음을 닷넷에 명백히 말하고 있음을 의미합니다.

그냥 코드를 다운로드해야했습니다. 실제로 관련된 Form1.vb의 비트 -하지만 시도해 주셔서 감사합니다 :)

+0

내 설명은 몇 비트에 걸쳐 광택이 있지만 질문에 대한 의견에 게시 된 링크에서 더 많은 정보를 얻을 수 있습니다 – Basic

+0

지금까지 작업. 일련의 테스트를 실행하고 결과를 알려줍니다. – Cyclone

+0

정말 고마워요. – Cyclone

관련 문제