包括DirectShow库到Qt中的video缩略图

我试图在Qt上实现http://msdn.microsoft.com/en-us/library/dd377634%28v=VS.85%29.aspx ,为video文件生成一个海报帧/缩略图。

我已经安装了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 ++中find这个我添加

 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行代码…

感谢您的意见和帮助

既然你说你是“一个C ++ / Qt新手”,那么我怀疑真正的问题可能是你试图自己加载库,而不是简单地将你的应用程序连接到它?

要使用Qt将外部库链接到您的应用程序中,您只需修改相应的.pro文件即可。 例如,如果该库被称为libfoo.dll您只需添加

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

你可以在qmake手册的相关部分找到更多关于这方面的信息。 请注意, qmake通常使用类Unix的符号,并透明地在Windows上做正确的事情。

完成这个工作后,你可以包含库的头文件,并使用它提供的任何类和函数。 请注意,您也可以修改项目文件以附加一个包含路径来帮助获取标题,例如。

 INCLUDEPATH += /path/to/headers 

同样, 有关qmake手册相关部分的更多信息。

请注意,这两个项目变量与相对路径一起工作,并将愉快地使用..来表示在所有平台上“上去一个目录”。

请注意,qedit.h需要dxtrans.h,它是DirectX9 SDK的一部分。

您可以从2006年8月起在DirectX SDK中找到dxtrans.h。 请注意,从新的DirectX SDK中删除了dxtrans.h。

你有访问外部图书馆的来源吗? 以下假定你这样做。

当我需要从一个只解决了函数的库中提取一个类时,我所做的就是在库中使用一个工厂函数。

 // Library.h
 class SomeClass {
上市:
   SomeClass(s​​td :: string name);
   // ...类声明在这里
 };

在cpp文件中,当我的构造函数需要C ++参数(例如类型如std :: string)时,我使用extern“C”外的代理函数,这些参数作为指针传递,以防止编译器搞乱C和C ++。 如果构造函数不需要参数,则可以避免额外的步骤,并直接从导出的函数中调用新的SomeClass()。

 // Library.cpp
 #include“Library.h”
 SomeClass :: SomeClass(s​​td :: string name)
 {
 //实现细节
 }

 //代理函数来处理C ++类型
 SomeClass * ImplCreateClass(s​​td :: string * name){return new SomeClass(* name);  }

外部“C”
 {
   //注意C ++类型的传递指针
   SomeClass * CreateClass(s​​td :: string * name){return ImplCreateClass(name);  }
 }

然后,在使用该库的应用程序中:

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

 // ...

 QLibrary库(QString(“MyLibrary”));
 FactoryFunction factory = reinterpret_cast(library.resolve(“CreateClass”));

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

您现在拥有库中声明的类的实例。