Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


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

Решение: использовать в коде директивы компилятору #pragma, а в данном конкретном случаи #pragma comment( lib, "strmiids" ) как подсказал ivank. Так же можно подключить через меню, как описано в посте №3
Как найти нужную? Либо искать аналогичные проекты, просматривать документацию или искать по содержимому как рекомендует pva
И самое главное, нужно чётко знать какой сейчас проект: консольный, где main рулит, или оконный, где WinMain уже. Тогда не будет проблемы линкования как в посте №3. Регистр имеет значение: пишем main с меленькой буквы.

pva я воспользовался функцией MultiByteToWideChar и всё заработало как я того хотел. Выходит параметры приложения воспринимаются кодом как набор байтов, которые она и конвертит в символы.
Как её используют нашёл в этом проекте -> http://csclab.murraystate.edu/bob.pi...py/asfcopy.cpp.
Вот её описание в MSDN -> http://msdn.microsoft.com/en-us/library/ms776413.aspx
Цитата ivank:
Полные перечень прагм можно найти в MSDN'е. »
Он лайн версия -> http://msdn.microsoft.com/en-us/libr...17(VS.60).aspx
Вот собственно код, который линкуется и работает как я хотел.
Код: Выделить весь код
#pragma comment( lib, "strmiids" )
#include <dshow.h>

void WaitForCompletion(IGraphBuilder *pGraph)
{
    HRESULT hr;
    LONG lEvCode = 0;
    IMediaEvent *pEvent;

    if (!pGraph)
        return;
        
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **) &pEvent);
    if (SUCCEEDED(hr))
    {
        do
        {
            MSG Message;

            while(PeekMessage(&Message, NULL, 0, 0, TRUE))
            {
                TranslateMessage(&Message);
                DispatchMessage(&Message);
            }

            hr = pEvent->WaitForCompletion(10, &lEvCode);

        } while(lEvCode == 0);

        pEvent->Release();
    }
}


void main (int argc, char *argv[])
{
    
	WCHAR SourceFile[MAX_PATH];
	
	IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;

    // Initialize the COM library.
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
        return;
    }

    // Create the filter graph manager and query for interfaces.
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                        IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
        return;
    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    MultiByteToWideChar(CP_ACP, 0, argv[1], -1, SourceFile, NUMELMS(SourceFile));
	// Build the graph. IMPORTANT: Change this string to a file on your system.
    hr = pGraph->RenderFile(SourceFile, NULL);
    if (SUCCEEDED(hr))
    {
        // Run the graph.
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            
			  WaitForCompletion(pGraph);
        }
    }
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize(); 
}
Я в него добавил функцию WaitForCompletion, так как в примере от Microsoft не рекомендуется использовать в реальной жизни
Цитата Admiral:
// Note: Do not use INFINITE in a real application, because it
// can block indefinitely. »
Взял её из того же найденного проекта.

ivank, pva премного благодарен.

Отправлено: 20:31, 05-05-2008 | #8