использование DirectShow в Winforms - PullRequest
1 голос
/ 12 июня 2011

я мог бы запустить пример кода в консольном приложении 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

1 Ответ

4 голосов
/ 12 июня 2011

Вы не получаете большую диагностику. Проблема в том, что DirectShow является нативным кодом. Но вы позволяете компилятору думать, что его можно скомпилировать в управляемом режиме. Который работает на удивление хорошо, пока компоновщик не пикирует. Вы должны сделать так, чтобы это выглядело так:

#pragma once
#pragma managed(push, off)
#include <dshow.h>
#pragma managed(pop)
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "ole32.lib")
// etc..

Это, вероятно, вызывает множество ошибок. Щелкните правой кнопкой мыши проект в окне обозревателя решений, Свойства, Свойства конфигурации, Общие. Измените поддержку Common Language Runtime с / clr: pure на / clr. Это проигрывал образец файла .avi правильно, когда я попробовал. В окне DirectShow, а не в форме. Пример кода был разработан только для работы в консольном приложении. Вы также должны удалить вызовы CoInitialize и CoUninitialize, .NET уже инициализирует COM. Рекомендуется улучшить обработку ошибок. Попробуйте вместо этого встроить проигрыватель Windows Media.

...