none
在“如何通过摄像头预览视频”中为什么我的C++程序不运行? RRS feed

  • 问题

  • 我已经将网页上的代码进行了改良:(注意:是C++程序)

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    capturePreview->Source = captureMgr;
    captureMgr->StartPreviewAsync();
    但是运行第3行时就会触发断点。经过调试发现,运行第四行时也会触发断点。这是为什么啊!是不是因为代码编错了?如果是,正确的代码是什么?

    2014年4月7日 12:22

答案

  • 网址:http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh868171.aspx

    代码1:

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    capturePreview->Source = captureMgr;
    captureMgr->StartPreviewAsync();

    错误1:(绿色箭头在第三行)

    First-chance exception at 0x76971D4D in 实验.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x03B3E070. HRESULT:0xC00D36B6 需要先初始化此对象,然后才能执行请求的操作。
    
    WinRT 信息: 需要先初始化此对象,然后才能执行请求的操作。
    
    堆栈跟踪:
    [外部代码]
    
    如有适用于此异常的处理程序,该程序便可安全地继续运行。

    代码2:

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    captureMgr->StartPreviewAsync();

    错误2:(在第三行)

    First-chance exception at 0x76971D4D in 实验.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0361DEE0. HRESULT:0xC00D36B6 需要先初始化此对象,然后才能执行请求的操作。
    
    WinRT 信息: 需要先初始化此对象,然后才能执行请求的操作。
    
    堆栈跟踪:
    [外部代码]
    
    如有适用于此异常的处理程序,该程序便可安全地继续运行。

    虽然不知道你写的啥,但是我还是要提示你下。

    注意文字:“HRESULT:0xC00D36B6 需要先初始化此对象”,这表示你使用的某个对象尚未初始化,由于你你提到“错误1:(绿色箭头在第三行)”,那么也就是语句“capturePreview->Source = captureMgr;”,因此,我推测此错误是因为 captureMgr 没有初始化造成,我们再向上看一句代码:“captureMgr->InitializeAsync();”,根据字面理解是执行初始化操作,根据"Async"后缀,推测此操作是异步的,那么结合前面的错误提示,问题在于 caputureMgr 正在异步执行初始化,尚未完成时你就使用了它。因此,我建议你 await caputreMgr->InitializeAsync(),或 caputreMgr->InitializeAsync([&caputreMgr](){ caputrePreview->Source = caputreMgr;});

    注意我最后两句代码,这不一定能编译通过,仅仅是表示在使用 caputureMgr 前,你需要等待 InitializeAsync 操作完成。

    2014年4月30日 8:57
  • 的确是没有等待,解决方法还是在别的地方讨论吧。
    2014年5月6日 4:57

全部回复

  • Hi,

    你把断点设置在哪里了??断点难道不是只要你的代码运行正常就应该停到断点的位置上去么?不跳过去代表代码不会执行,那么你是想要你的第三行执行还是不执行呢?

    另外你的代码既然是你从网页里拖出来的,你最好告诉别人你从哪里拿的,或者把代码贴全,最主要的是所使用的API是哪里提供的API。这样或多或少别人可以根据你的api里面的设定来帮你看看你定义的对还是错。



    Barry Wang
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月8日 6:46
  • 网址:http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh868171.aspx

    代码1:

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    capturePreview->Source = captureMgr;
    captureMgr->StartPreviewAsync();

    错误1:(绿色箭头在第三行)

    First-chance exception at 0x76971D4D in 实验.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x03B3E070. HRESULT:0xC00D36B6 需要先初始化此对象,然后才能执行请求的操作。
    
    WinRT 信息: 需要先初始化此对象,然后才能执行请求的操作。
    
    堆栈跟踪:
    [外部代码]
    
    如有适用于此异常的处理程序,该程序便可安全地继续运行。

    代码2:

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    captureMgr->StartPreviewAsync();

    错误2:(在第三行)

    First-chance exception at 0x76971D4D in 实验.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0361DEE0. HRESULT:0xC00D36B6 需要先初始化此对象,然后才能执行请求的操作。
    
    WinRT 信息: 需要先初始化此对象,然后才能执行请求的操作。
    
    堆栈跟踪:
    [外部代码]
    
    如有适用于此异常的处理程序,该程序便可安全地继续运行。

    2014年4月30日 5:27
  • 网址:http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh868171.aspx

    代码1:

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    capturePreview->Source = captureMgr;
    captureMgr->StartPreviewAsync();

    错误1:(绿色箭头在第三行)

    First-chance exception at 0x76971D4D in 实验.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x03B3E070. HRESULT:0xC00D36B6 需要先初始化此对象,然后才能执行请求的操作。
    
    WinRT 信息: 需要先初始化此对象,然后才能执行请求的操作。
    
    堆栈跟踪:
    [外部代码]
    
    如有适用于此异常的处理程序,该程序便可安全地继续运行。

    代码2:

    MediaCapture^ captureMgr = ref new MediaCapture();
    captureMgr->InitializeAsync();
    captureMgr->StartPreviewAsync();

    错误2:(在第三行)

    First-chance exception at 0x76971D4D in 实验.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0361DEE0. HRESULT:0xC00D36B6 需要先初始化此对象,然后才能执行请求的操作。
    
    WinRT 信息: 需要先初始化此对象,然后才能执行请求的操作。
    
    堆栈跟踪:
    [外部代码]
    
    如有适用于此异常的处理程序,该程序便可安全地继续运行。

    虽然不知道你写的啥,但是我还是要提示你下。

    注意文字:“HRESULT:0xC00D36B6 需要先初始化此对象”,这表示你使用的某个对象尚未初始化,由于你你提到“错误1:(绿色箭头在第三行)”,那么也就是语句“capturePreview->Source = captureMgr;”,因此,我推测此错误是因为 captureMgr 没有初始化造成,我们再向上看一句代码:“captureMgr->InitializeAsync();”,根据字面理解是执行初始化操作,根据"Async"后缀,推测此操作是异步的,那么结合前面的错误提示,问题在于 caputureMgr 正在异步执行初始化,尚未完成时你就使用了它。因此,我建议你 await caputreMgr->InitializeAsync(),或 caputreMgr->InitializeAsync([&caputreMgr](){ caputrePreview->Source = caputreMgr;});

    注意我最后两句代码,这不一定能编译通过,仅仅是表示在使用 caputureMgr 前,你需要等待 InitializeAsync 操作完成。

    2014年4月30日 8:57
  • C++中没有await,有什么方法替代吗?
    2014年4月30日 9:23
  • C++中没有await,有什么方法替代吗?

    http://msdn.microsoft.com/zh-cn/library/windows/apps/br226599.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1

    IAsyncAction^ InitializeAsync()

    http://msdn.microsoft.com/zh-cn/library/windows/apps/windows.foundation.iasyncaction.aspx

    可以用 IAsyncActon::GetResults() 或者这样:

    auto asyncAction = captureMgr->InitializeAsync();

    asyncAction->Completed = ref new [](){caputrePreview->Source = caputreMgr;}

    关于这部分代码请看这里:

    http://www.cnblogs.com/youlin/archive/2012/12/06/2805199.html

    2014年4月30日 9:31
  • 这段代码出现错误:

    asyncAction->Completed = ref new [](){caputrePreview->Source = caputreMgr; }
    错误:
    1	IntelliSense:  应输入类型说明符
    能不能直接写一下代码?要C++的。
    2014年4月30日 12:22
  • 的确是没有等待,解决方法还是在别的地方讨论吧。
    2014年5月6日 4:57