如何解决在Winforms中使用DirectShow
| 我可以在c ++ win32控制台应用程序中运行“如何播放文件”代码示例,但是当我尝试通过winforms实现它时,出现以下链接错误: 错误2错误LNK2020:无法解析的令牌(0A000016)IID_IMediaEvent 错误3错误LNK2020:无法解析的令牌(0A000017)IID_IMediaControl 和更多的链接错误..... 这是形式的代码:#include <dshow.h>
#pragma comment(lib,\"Strmiids.lib\")
namespace Form1 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->SuspendLayout();
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6,13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(284,262);
this->Name = L\"Form1\";
this->Text = L\"Form1\";
this->Load += gcnew System::EventHandler(this,&Form1::Form1_Load);
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e)
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// Initialize the COM library.
HRESULT hr = CoInitialize(NULL);
// Create the filter graph manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph);
hr = pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent);
// Build the graph. IMPORTANT: Change this string to a file on your system.
hr = pGraph->RenderFile(L\"C:\\\\Example.avi\",NULL);
if (SUCCEEDED(hr))
{
// Run the graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE,&evCode);
// Note: Do not use INFINITE in a real application,because it
// can block indefinitely.
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
};
}
如何在Winforms中设置构建环境以进行DirectShow编程?
我正在使用Windows SDK v7.1和vc ++ 2010
解决方法
您没有得到很好的诊断。问题在于DirectShow是本机代码。但是您让编译器认为可以在托管模式下进行编译是可以的。直到连接器开始俯冲之前,它的工作都非常好。您需要使其如下所示:
#pragma once
#pragma managed(push,off)
#include <dshow.h>
#pragma managed(pop)
#pragma comment(lib,\"strmiids.lib\")
#pragma comment(lib,\"ole32.lib\")
// etc..
这可能会产生大量错误。右键单击“解决方案资源管理器”窗口中的项目,依次单击“属性”,“配置属性”,“常规”。将公共语言运行时支持从/ clr:pure更改为/ clr。当我尝试它时,它正确播放了一个示例.avi文件。在DirectShow窗口中,而不是在窗体中。该示例代码仅设计用于控制台应用程序。您还应该删除对CoInitialize和CoUninitialize的调用,.NET已初始化COM。改善错误处理是可取的。考虑改为嵌入Windows Media Player。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。