c++ - 从 C++ 中的扩展获取 MIME 类型

标签 c++ windows winapi

有什么方法可以在给定文件扩展名的情况下获取 C++ 中的 MIME 类型?

我读过 HKEY_CLASSES_ROOT,但老实说我不知道​​如何使用它。

我想要的是输入:

 string extension=".pdf"; 
 string extension2=".avi";

获取输出:

string mimeType="application/pdf";
string mimeType2="video/x-msvideo";

我知道我可以自己完成,但我想这里已经完成了一些工作。

非常感谢

最佳答案

最简单的解决方案是调用 FindMimeFromData :

#include <urlmon.h>
#pragma comment( lib, "urlmon" )

std::wstring MimeTypeFromString( const std::wstring& str ) {

    LPWSTR pwzMimeOut = NULL;
    HRESULT hr = FindMimeFromData( NULL, str.c_str(), NULL, 0,
                                   NULL, FMFD_URLASFILENAME, &pwzMimeOut, 0x0 );
    if ( SUCCEEDED( hr ) ) {
        std::wstring strResult( pwzMimeOut );
        // Despite the documentation stating to call operator delete, the
        // returned string must be cleaned up using CoTaskMemFree
        CoTaskMemFree( pwzMimeOut );
        return strResult;
    }

    return L"";
}

下面的应用

int _tmain( int argc, _TCHAR* argv[] ) {
    std::wcout << L".pdf: " << MimeTypeFromString( L".pdf" ) << std::endl;
    std::wcout << L".avi: " << MimeTypeFromString( L".avi" ) << std::endl;

    return 0;
}

在我的系统上产生这个输出:

.pdf: application/pdf
.avi: video/avi

关于c++ - 从 C++ 中的扩展获取 MIME 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634666/

相关文章:

c++ - 具有自定义数据类型的 STL

windows - 您是否支持 Windows XP 上的标准用户?

JavaFX 测试在 Windows 中失败,但在 OSX 和 Linux 中工作

c - 没有它们如何获取 GetProcAdress 和 LoadLibrary?

c++ - 如果我将图像作为资源包含在我的 Visual Studio 项目中,这些图像是否会编译到可执行文件中?

c++ - GDI+ 是否有标准图像编码器 CLSID?

c++ - 双向链表类

c++ - Thrift 或 Protocol buffer 作为跨语言序列化解决方案?

c++ - 通过与不同类型的值进行自定义比较来查找 std::set 的元素

c# - EventLog.EntryWritten 事件处理过去的事件