Включение библиотеки DirectShow в Qt для миниатюры видео - PullRequest
1 голос
/ 26 августа 2010

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

Я установил Windows Vista и Windows 7 SDK.Я вставил:

#include "qedit.h"

в мой код (отмечая, что он есть и в C: \ Qt \ 2010.04 \ mingw \ include), добавив:

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

к моему *.Про файл.Я компилирую и получаю «ошибка: 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" 

возвращается к генерации тысяч ошибок компиляции.

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

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

Ответы [ 3 ]

1 голос
/ 26 августа 2010

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

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

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

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

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

INCLUDEPATH += /path/to/headers

Опять же, дополнительную информацию смотрите в соответствующем разделе руководства qmake .

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

1 голос
/ 30 августа 2010

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

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

0 голосов
/ 26 августа 2010

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

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

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

В файле cpp я использую прокси-функцию вне внешнего «C», когда моему конструктору требуются параметры C ++ (например, такие типы, как std :: string), которые я передаю в качестве указателя, чтобы компилятор не испортил сигнатуру между 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);

Теперь у вас есть экземпляр класса, объявленного в библиотеке.

...