2011-08-09 2 views
0

DirectShowLib 및 Interop과 관리되지 않는 버전을 사용하는 VideoRendererElement 프로젝트 (http://videorendererelement.codeplex.com/)를 기반으로하는 웹캠 앱을 구축하고 있습니다. 액티브 X 구성 요소. Visual Studio 2010을 사용하고 있지만 .NET 3.5 (2.0 clr 런타임)를 대상으로합니다.관리 코드를 호출하는 관리되지 않는 코드 호출은 배포 된 컴퓨터가 아닌 dev 컴퓨터에서 작동합니다.

저는 개발 시스템에서 아무런 문제없이 응용 프로그램을 빌드하고 실행할 수있었습니다 (Visual Studio 외부에서도). 그러나 대상 컴퓨터 (Windows 7, .NET 최신 버전, C++ 재배포 가능 파일)에 응용 프로그램을 배포하면 응용 프로그램이 충돌합니다. 실행중인 응용 프로그램을 대상 컴퓨터의 텍스트 파일에 기록하는 추가 메서드를 설정하여 하나의 주요 차이점을 추적하고 관리되지 않는 코드는 관리되는 코드에서 메서드를 호출하며 이전에 정의 된 정적 필드 만 누락되었습니다. 이것은 대상 기계 (코드를 전개 한 대상 기계)에서만 발생합니다. 다음은 일부 코드 단편과 내가 기록한 내용입니다. 혼란스러운 것은이 오류가 대상 컴퓨터에서만 발생한다는 것입니다. 올바른 방향으로 나를 가리키는 어떤 도움도 크게 감사 할 것입니다. 응용 프로그램의 .NET 부분 전에

namespace MediaBridge 
{ 
    ..... 

    public class MediaBridgeManager 
    { 
     public delegate void NewMediaGraphInfo(MediaBridgeGraphInfo GraphInfo); 

     private static readonly Dictionary<string, NewMediaGraphInfo> _delegateHash = new Dictionary<string, NewMediaGraphInfo>(); 

     ...... 

     public static void AddMediaGraphInfo(MediaBridgeGraphInfo GraphInfo) 
     { 
      if (_delegateHash.ContainsKey(GraphInfo.MediaUrl)) 
      { 
       NewMediaGraphInfo callback = _delegateHash[GraphInfo.MediaUrl]; 
       _delegateHash.Remove(GraphInfo.MediaUrl); 

       /* Suppress all errors on the callback */ 
       try 
       { 
        callback(GraphInfo); 
       } 
       catch {} 
      } 
     } 

     ...... 

     public static bool RegisterCallback(string MediaUrl, NewMediaGraphInfo Callback) 
     { 
      bool returnval = true; 
      MediaUrl = FormatUrl(MediaUrl); 

      if (!_delegateHash.ContainsKey(MediaUrl)) 
      { 
       _delegateHash.Add(MediaUrl, Callback); 
      } 
      else 
      { 
       returnval = false; 
      } 

      return returnval; 
     } 
    } 
} 

먼저) RegisterCallback을 (호출하고 URL과 콜백 기능을 _delegateHash을 채 웁니다. 이는 대상 시스템의 로그 파일에서 확인되었습니다.

이제 관리되지 않는 부분 :

STDMETHODIMP CMediaBridgeSourceFilter::Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt) 
{ 
    /* Thread-saftey */ 
    CAutoLock cAutoLockShared(&m_cSharedState); 

    HRESULT phr = S_OK; 

    /* Create the output pin for our filter */ 
    m_pPin = new CMediaBridgeSourceFilterPin(&phr, this); 

    /* Create a new class to store information about us/graph in it */ 
    MediaBridge::MediaBridgeGraphInfo^graphInfo = gcnew MediaBridge::MediaBridgeGraphInfo(); 

    /* Set the media url sent */ 
    graphInfo->MediaUrl = gcnew System::String(lpwszFileName); 

    /* Set the pointer to the filter graph */ 
    graphInfo->FilterGraph = System::IntPtr(this->GetFilterGraph()); 

    /* Store the pointer for our instance of the filter */ 
    graphInfo->SourceFilter = System::IntPtr(this); 

    /* Do the callback into our managed code */ 
    MediaBridge::MediaBridgeManager::AddMediaGraphInfo(graphInfo); 

    return phr; 
} 

내 로그 파일에 MediaBridge :: MediaBridgeManager :: AddMediaGraphInfo()는 .NET 측에서 호출되고 있지만 _delegateHash 변수가 있기 때문에 다시 호출이 도달하지 않습니다에 따르면 이제 비어 있습니다. 위임 해시 수 (_delegateHash.Count)가 0에 지금 얼마나

RegisterCallback(): MediaUrl = dshowmediabridge://d0ffd222-d023-483b-8fc7-4b4035ce3922/ Contains Key: True Delegate Hash count: 1 

InitializeDirectShow(): RegisterCallback == true, Url == DShowMediaBridge://d0ffd222-d023-483b-8fc7-4b4035ce3922 

AddMediaGraphInfo(): MediaUrl = dshowmediabridge://d0ffd222-d023-483b-8fc7-4b4035ce3922/ FilterGraph: 71122304 Contains Key: False Delegate Hash count: 0 

참고 : 여기에

내 로그 파일이 나에 응용 프로그램을 배포하기 위해 노력하고있어 대상 시스템에 말씀입니다 비 관리 코드는 AddMediaGraphInfo()를 호출합니다.

VS가 내 개발 컴퓨터에서 수행하는 대상 컴퓨터에서 COM/C++에 대한 DLL을 식별하기 위해해야 ​​할 일이 있습니까?

+1

디버그 모드로 컴파일 했습니까? VS가있는 PC에만 설치되는 VS 디버그 모드 redist dll에 DLL 문제가있을 수 있습니다. 시험해보십시오. –

+0

Thanks J.N. 릴리스 모드에서 솔루션을 구축했습니다. – Reg

+0

아직 개발 상자에서 작동하는 이유는 100 % 확신 할 수 없지만 Visual Studio 2005/2008에서 작성한 오픈 소스 솔루션이므로 VS 2010으로 가져온 원본 ActiveX 컨트롤 파일을 응용 프로그램에 복사 해 보았습니다. VS2010이 솔루션으로 구축 한 디렉토리를 덮어 쓰고 다시 등록하면 작동합니다. 나는 그것이 2010 버전의 Windows SDK (7.1) 이상에서 MSBuild를 대상으로하는 VS 2010과 관련이 있다고 생각하고 있습니다. .NET 4는 COM 4와의 interop 처리 방식에 근본적인 변화가 있음을 알고 있습니다. . – Reg

답변

0

어플 리케이션을 대상 시스템에 전개하고 실행하는 방법. 단순히 실행 파일을 복사하거나 설치 프로그램을 작성하고 있습니까? 설치 프로그램을 만드는 중이라면 AX 파일을 RegSvr32에 등록 하시겠습니까?

COM 구성 요소의 문제는 해당 상자의 레지스트리에 등록해야한다는 것입니다. 상자에 이미 등록되어 있으므로 문제가 없습니다. 그러나 대상 상자에서는 사용자의 기호에 따라 등록되거나 등록되지 않을 수도 있습니다. 인스톨러를 설정했다면, AX 파일이 레지스트리에 등록되도록 "설치"해야합니다. 그렇지 않으면 AX 파일을 배포하는 방법에 상관없이 AX 파일을 찾을 수 없습니다. COM의 단점 중 하나입니다.

+0

그레고리에게 감사드립니다. 설치 프로그램을 작성한 다음 복사하여 상자에 수동으로 regsvr32를 실행했습니다. – Reg

관련 문제