2010-08-26 1 views
1

Я пытаюсь реализовать http://msdn.microsoft.com/en-us/library/dd377634%28v=VS.85%29.aspx на Qt, чтобы сгенерировать рамку плаката/миниатюру для видеофайлов.Включая библиотеку DirectShow в Qt для видео thumbnail

У меня установлены как Windows Vista, так и Windows 7 SDK. Я ставлю:

#include "qedit.h" 

в моем коде (следует отметить, есть также один в C: \ Qt \ 2010.04 \ MinGW \ Include), я добавляю:

win32:INCLUDEPATH += $$quote(C:/WindowsSDK/v6.0/Include) 

к моему * .pro файл. Я компилирую и получаю "ошибку: sal.h: Нет такого файла или каталога". Обнаружив это в VC++, я добавлю

win32:INCLUDEPATH += $$quote(C:/Program Files/Microsoft Visual Studio 10.0/VC/include) 

И теперь у вас 1400 ошибок компиляции. Итак, я отказаться от этого и просто добавить:

win32: LIBS + = C: /WindowsSDK/v7.1/Lib/strmiids.lib

к моему * .pro файл и попробуйте запустить (без учета какой-либо заголовки):

IMediaDet mediadet; 

Но тогда я получаю сообщение об ошибке: IMediaDet: Нет такого файла или каталога ".

#include "qedit.h" 

дает мне ту же ошибку (она выглядит как это указывает на версию Qt) и

#include "C:/WindowsSDK/v6.0/Include/qedit.h" 

восходит к генерации 1000-х ошибок компиляции.

Вздох, так много проблем, что должно быть 10 строк кода ...

Спасибо за ваши комментарии и помощь

+0

Я взял на себя смелость форматировать свой код. – Job

ответ

0

У вас есть доступ к источнику внешней библиотеки? Следующее предполагает, что вы это делаете.

Что я делаю, когда мне нужно извлечь класс из библиотеки с разрешенными функциями, является использование заводской функции в библиотеке.

 
// Library.h 
class SomeClass { 
public: 
    SomeClass(std::string name); 
    // ... class declaration goes here 
}; 

В файле CPP, я использую функцию прокси вне экстерном «C», когда мой конструктор требует параметров C++ (например, типы, такие как станд :: строка), который я прохожу в качестве указателя, чтобы предотвратить компилятор от испортить подпись между C и C++. Вы можете избежать дополнительного шага, если ваш конструктор не требует параметров и вызовет новый SomeClass() непосредственно из экспортируемой функции.

 
// Library.cpp 
#include "Library.h" 
SomeClass::SomeClass(std::string name) 
{ 
// implementation details 
} 

// Proxy function to handle C++ types 
SomeClass *ImplCreateClass(std::string* name) { return new SomeClass(*name); } 

extern "C" 
{ 
    // Notice the pass-by-pointer for C++ types 
    SomeClass *CreateClass(std::string* name) { return ImplCreateClass(name); } 
} 

Затем в приложение, которое использует библиотеку:

 
// Application.cpp 
#include "Library.h" 
typedef SomeClass* (*FactoryFunction)(std::string*); 

// ... 

QLibrary library(QString("MyLibrary")); 
FactoryFunction factory = reinterpret_cast(library.resolve("CreateClass")); 

std::string name("foobar"); 
SomeClass *myInstance = factory(&name); 

Вы сейчас держите экземпляр класса, объявленного в библиотеке.

+0

У меня нет внешнего (Windows DirectShow) источника, просто заголовок * .lib и qedit.h, а также dll, найденные в сети, например Interop.DexterLib.dll – DaveO

1

Поскольку вы говорите, что вы «новичок C++/Qt», то я подозреваю, что реальная проблема может заключаться в том, что вы пытаетесь загрузить библиотеку самостоятельно, а не просто связывать свое приложение с ней?

Чтобы связать внешнюю библиотеку с вашим приложением с Qt, все, что вам нужно сделать, это изменить соответствующий файл .pro. Например, если библиотека называется libfoo.dll вы просто добавить

LIBS += -L/path/to/lib -lfoo 

Вы можете найти более подробную информацию об этом в the relevant section of the qmake manual. Обратите внимание, что qmake обычно использует Unix-подобную нотацию и прозрачно делает правильные вещи в Windows.

Сделав это, вы можете включить заголовки библиотеки и использовать любые классы и функции, которые она предоставляет. Обратите внимание, что вы также можете изменить файл проекта, чтобы добавить путь включения, чтобы помочь подобрать заголовки, например.

INCLUDEPATH += /path/to/headers 

Опять же, больше информации в the relevant section of the qmake manual.

Обратите внимание, что обе эти переменные проекта работают с относительными путями и с радостью будут работать с .., что означает «поднимите каталог» на всех платформах.

1

Обратите внимание, что для qedit.h требуется dxtrans.h, который является частью DirectX9 SDK.

Вы можете найти dxtrans.h в DirectX SDK от August 2006. Обратите внимание, что dxtrans.h удаляется из более новых SDK DirectX.

+0

Мне показалось забавным, что мне было легче перекрестно компилировать FFmpeg на Linux и использовать avcodec.dll для создания эскизов, чем получить Windows API, работающий в Qt. Во всяком случае, я вернусь к этому, когда пространство и скорость станут и выдаются. Спасибо за ваш комментарий! – DaveO

+0

Microsoft устарела от служб DirectShow и DirectShow Editing Services (qedit.h является частью DES). Например, в Windows Server 2008 (обычный и R2) qedit.dll нет. Когда у вас есть правильное программирование SDK, DirectShow работает как ожидалось :) –