2009-07-13 2 views
0

DLL에 관리되지 않는 코드가 있습니다. 내 호출 (관리되는) 코드가 일부 COM 알림에 연결하는 데 사용하는 몇 가지 메서드를 게시합니다. 비 관리 코드를 관리 코드로 다시 호출하는 대신 숨겨진 Control 파생 개체를 만들고 비 관리 코드가 SendMessage에 대한 매개 변수로 사용하는 handle 속성을 전달했습니다. WinForm은 생성 직후를 제외하고는 메시지를받지 못합니다.

내 컨트롤 파생 클래스 :

class InteropWindow : Control 
{ 
    //delegate 
    private Handler m_callback; 
    //window message 
    private uint m_message; 

    public InteropWindow(Handler callback, uint message) 
    : base() 
    { 
    m_callback = callback; 
    m_message = message; 
    } 

    protected override void WndProc(ref Message m) 
    { 
    if (m.Msg == m_message) 
    { 
     m_callback(new IntPtr((int)m.WParam)); 
    } 

    base.WndProc(ref m); 
    } 
} 

관리되지 않는 코드의 관련 라인 :

SendMessage(m_notify, m_window_message, (WPARAM)pData, 0); 

m_window_message & m_message가 (모두 RegisterWindowMessage에서) 동일하며, m_notify == InteropWindow.Handle (pData의 다양하지만 관리 코드에서 불투명 한 핸들로 사용됩니다). 관리되지 않는 코드가 호출되고 있습니다. 이러한 사실은 디버깅을 통해 확인되었습니다.

InteropWindow를 만든 직후 SendMessage에 대한 호출이 성공합니다. 나중에 (초 후에) 메시지는 WndProc에 도착하는 것을 멈추지 만 아무런 오류가 없다.

질문은 내가 여기서 무엇을 잘못하고있는 것입니까?


내가 (어쨌든 아는 한) 라이프 사이클 문제를 배제하고, 아무 소용 HandleRef와 함께 연주했습니다.


두 번째를 편집하십시오.

필자는이 함수를 대신 사용하여 함수 호출을 작성했습니다.이 함수는 자체 위험에 처해 있지만 예상대로 작동합니다. 나는이 문제가 COM 스레딩 문제라고 의심해 왔지만, 그것은 단지 감각에 불과합니다.

답변

1

관리되는 창 핸들을 HandleRef로 전달하려고 시도 했습니까? C#은 IntPtr로 HandleRef를 마샬링 할 수 있으며 그 반대로, Microsoft는 자신의 물건 일부를 디 컴파일 할 때이 트릭을 사용하는 것을 꽤 보았습니다.

.Net 프로파일 러를로드하고 GC를 볼 수도 있습니다. 앱을 수집 한 직후에 앱이 깨지는 지 확인하는 것이 좋습니다.

+0

핸들이 GC를 통해 유효하다는 것을 확인했습니다. 또는 적어도, 그것이 무효가된다는 표시는 절대적으로 없습니다. Control.HandleDestroyed 호출, 사용시 잘못된 핸들 경고 없음, 첫 번째 예외 예외가 발생하지 않음, 아무 것도 발생하지 않음. –

+0

대신 COM 개체에서 이벤트를 만들 수 있습니까? 나는 관리 측면에서 가입자 였고 훨씬 간단한 솔루션 일 수 있습니다. 그러나 COM/관리되지 않는 쪽에서 이벤트를 만드는 방법을 잘 모르겠습니다. – jonathanpeppers

관련 문제