2014-02-19 2 views
1

C++/C#에서 솔루션을 개발하는 데 어려움을 겪고 있습니다. Windows 서비스 및 WCF 및 소켓을 통해이 서비스와 통신하는 사용자 응용 프로그램에 의해 관리되는 DLL이 있습니다. DLL은 비디오 캡처 보드를 관리하며 캡처중인 비디오를 창 핸들 (그림 상자 또는 패널)에서 작성하는 기능을 가지고 있습니다.C# Panel/Picturebox에서 문제 발생

내가 뭘 하려는지 : 그림 상자를 만들고이 핸들로 DLL 함수 startpreview를 호출하는 서비스에 여물 쓰레기 WCF를 전달합니다.

문제점 : 서비스 응용 프로그램을 사용자 응용 프로그램으로 실행할 때 모든 것이 제대로 작동하지만 Windows 서비스로 실행하면 startpreview 함수가 내 핸들에 쓰지 않습니다.

누군가 내가 이것을 어떻게 해결할 수 있는지 알고 있습니까? 최고 감사합니다.

@Edit

이 코드는 해당 PictureBox를 생성하고 flowlayoutpanel에 첨부합니다. WCF (WCFVideoMethods.ClientStartPreview)를 통해 서비스와 통신하는 사용자 응용 프로그램에서 실행됩니다. '

    PictureBox videoPanel = new PictureBox(); 
        videoPanel.Width = flpMonitor.Width; 
        videoPanel.Height = flpMonitor.Height; 


        /// Se for necessário invoke, invoca o metodo de adicionar um componente ao flowlayoutpanel 
        if (flpMonitor.InvokeRequired) 
        { 
         flpMonitor.Invoke(new MethodInvoker(delegate 
         { 
          flpMonitor.Controls.Add(videoPanel); 
         })); 
        } 
        /// Caso contrário, chama o método normalmente. 
        else 
        { 
         flpMonitor.Controls.Add(videoPanel); 
        } 

        /// Se for necessário invoke para o panel de video, invoca o metodo de inicializar o preview nele 
        if (videoPanel.InvokeRequired) 
        { 
         videoPanel.Invoke(new MethodInvoker(delegate 
          { 
           WCFVideoMethods.ClientStartPreview(selectedPos, videoPanel.Handle, new Rectangle(0, 0, videoPanel.Size.Width, videoPanel.Size.Height), true, 0x0080, 20, isAudioActive); 
          })); 
        } 
        /// caso contrário, chama o metodo normalmente. 
        else 
        { 
         WCFVideoMethods.ClientStartPreview(selectedPos, videoPanel.Handle, new Rectangle(0, 0, videoPanel.Size.Width, videoPanel.Size.Height), true, 0x0080, 20, isAudioActive); 
        } 

는 서비스

public Boolean StartPreview(int posNo, IntPtr _handle, Rectangle _rect, Boolean _ovl, int _format, int _rate, Boolean isAudioActive) 
    { 
     Boolean ret = true; 
     int channel = GetPosChannel(posNo); 
     if (!startPrev(channel, _handle, _rect, _ovl, _format, _rate)) 
     { 
      ret = false; 
     } 

     if (isAudioActive) 
     { 
      if (!startAudioPrev(channel)) 
      { 
       ret = false; 
      } 
     } 
     return ret; 
    } 

startPrev (I 핸들에 쓸 필요가있어서)은 C++ DLL 방식의 대리자 인에 StartPreview 방법을 실행하고 난 돈 코드에 액세스 할 수 없습니다 .....

+0

다른 예제 코드를 표시하면 문제를 이해하고 적절한 대답을 얻을 수 있습니까? – Miller

+0

Windows 서비스 용 GUI를 추가 하시겠습니까? – Matt

+0

아니요. 간단히 말해서 나는 서비스가 윈도우 폼 핸들에 쓰기를 원한다. –

답변

0

Windows 서비스에서 데스크톱과 상호 작용할 수 없습니다. 서비스의 속성 창에서 설정 한 데스크톱 옵션과의 상호 작용이 있지만 이는 다소 희박합니다.

내가 제안 할 수있는 대안은 서비스에서 사진 버퍼를 큐에 넣고 wcf/소켓을 통해 api를 노출하여 선입 선출 방식으로 버퍼를 보냅니다. 응용 프로그램에서 해당 버퍼를 가져 와서 그림 상자에 렌더링하는 타이머를 가질 수 있습니다.