Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C++中的扩展获得MIME类型 有没有办法获得C++中MIME类型的文件扩展名?< /P>_C++_Windows_Winapi - Fatal编程技术网

从C++中的扩展获得MIME类型 有没有办法获得C++中MIME类型的文件扩展名?< /P>

从C++中的扩展获得MIME类型 有没有办法获得C++中MIME类型的文件扩展名?< /P>,c++,windows,winapi,C++,Windows,Winapi,我读过HKEY_CLASSES_ROOT,但我真的不知道如何使用它 我想要的是作为输入: string extension=".pdf"; string extension2=".avi"; 获取作为输出: 字符串mimeType=application/pdf; 字符串mimeType2=video/x-msvideo 我知道我可以自己做,但我想这里已经有一些工作要做了 非常感谢快到圣诞节了,这个怎么样: #include <Windows.h> #include <

我读过HKEY_CLASSES_ROOT,但我真的不知道如何使用它

我想要的是作为输入:

 string extension=".pdf"; 
 string extension2=".avi";
获取作为输出:

字符串mimeType=application/pdf; 字符串mimeType2=video/x-msvideo

我知道我可以自己做,但我想这里已经有一些工作要做了


非常感谢

快到圣诞节了,这个怎么样:

#include <Windows.h>
#include <string>

using namespace std;

string GetMimeType(const string &szExtension)
{
    // return mime type for extension
    HKEY hKey = NULL;
    string szResult = "application/unknown";

    // open registry key
    if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szExtension.c_str(), 
                       0, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        // define buffer
        char szBuffer[256] = {0};
        DWORD dwBuffSize = sizeof(szBuffer);

        // get content type
        if (RegQueryValueEx(hKey, "Content Type", NULL, NULL, 
                       (LPBYTE)szBuffer, &dwBuffSize) == ERROR_SUCCESS)
        {
            // success
            szResult = szBuffer;
        }

        // close key
        RegCloseKey(hKey);
    }

    // return result
    return szResult;
}

int main(int argc, char* argv[])
{
    string szExt1 = ".pdf";
    string szExt2 = ".avi";

    string szMime1 = GetMimeType(szExt1);
    string szMime2 = GetMimeType(szExt2);

    printf("%s = %s\n%s = %s\n", szExt1.c_str(), szMime1.c_str(), 
        szExt2.c_str(), szMime2.c_str());

    return 0;
}
在我的系统上,它提供以下输出:

.pdf=应用程序/pdf .avi=视频/avi


快到圣诞节了,这个怎么样:

#include <Windows.h>
#include <string>

using namespace std;

string GetMimeType(const string &szExtension)
{
    // return mime type for extension
    HKEY hKey = NULL;
    string szResult = "application/unknown";

    // open registry key
    if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szExtension.c_str(), 
                       0, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        // define buffer
        char szBuffer[256] = {0};
        DWORD dwBuffSize = sizeof(szBuffer);

        // get content type
        if (RegQueryValueEx(hKey, "Content Type", NULL, NULL, 
                       (LPBYTE)szBuffer, &dwBuffSize) == ERROR_SUCCESS)
        {
            // success
            szResult = szBuffer;
        }

        // close key
        RegCloseKey(hKey);
    }

    // return result
    return szResult;
}

int main(int argc, char* argv[])
{
    string szExt1 = ".pdf";
    string szExt2 = ".avi";

    string szMime1 = GetMimeType(szExt1);
    string szMime2 = GetMimeType(szExt2);

    printf("%s = %s\n%s = %s\n", szExt1.c_str(), szMime1.c_str(), 
        szExt2.c_str(), szMime2.c_str());

    return 0;
}
在我的系统上,它提供以下输出:

.pdf=应用程序/pdf .avi=视频/avi


最简单的解决方案包括调用:


最简单的解决方案包括调用:


谢谢你的时间,罗杰,我得到了意想不到的结果,但会更深入地检查这一点@user3009804好的-请在我还感到圣诞快乐的时候告诉我我是否可以进一步帮助你。正如你在问题中使用字符串一样,我做了一个非UNICODE的例子。下午好,罗杰,我已经尝试了你的非UNICODE代码以及IInspectable的代码,我发现用你的代码我可以得到一些扩展的MIME类型,但我不能用其他扩展。例如,我发现应用程序的扩展名未知,例如:.avi、.mp3。mp4、.wmv、.rar、.log、。。。。你知道会出什么问题吗?谢谢大家,@user3009804-它只是读取注册表,所以请查看Regedit.exe,例如HKEY_CLASSES_ROOT\.mp3,看看是否有内容类型键。如果存在,则可能是权限问题。在HKEY_CLASSES\u ROOT\MIME\Database\Content Type上还有一个反向查找。@user3009804您知道将我的方法与IInspectable的方法结合起来可能是值得的-据我所知,his只会给出26个左右的预定义类型,而我的方法只会给出那些在应用程序中注册扩展的类型。如果一个失败了,另一个可能会成功。谢谢你的时间罗杰,我得到了意想不到的结果,但我会更深入地检查这一点@user3009804好的-请在我还感到圣诞快乐的时候告诉我我是否可以进一步帮助你。正如你在问题中使用字符串一样,我做了一个非UNICODE的例子。下午好,罗杰,我已经尝试了你的非UNICODE代码以及IInspectable的代码,我发现用你的代码我可以得到一些扩展的MIME类型,但我不能用其他扩展。例如,我发现应用程序的扩展名未知,例如:.avi、.mp3。mp4、.wmv、.rar、.log、。。。。你知道会出什么问题吗?谢谢大家,@user3009804-它只是读取注册表,所以请查看Regedit.exe,例如HKEY_CLASSES_ROOT\.mp3,看看是否有内容类型键。如果存在,则可能是权限问题。在HKEY_CLASSES\u ROOT\MIME\Database\Content Type上还有一个反向查找。@user3009804您知道将我的方法与IInspectable的方法结合起来可能是值得的-据我所知,his只会给出26个左右的预定义类型,而我的方法只会给出那些在应用程序中注册扩展的类型。如果一个失败了,另一个可能会成功。非常感谢你的代码!我试过使用几个扩展,其中一些可以工作,而有些不行,例如。avi是的,不明白怎么不能工作。avi、.mov、.mp3、.mp4、.mpeg、.vmw。。。你知道会发生什么吗?谢谢!从一些测试中,我在一个紧密的循环中做了一段时间,这是正确的{}在使用任务管理器时,我同意CoTaskMemFree。非常感谢您的代码!我试过使用几个扩展,其中一些可以工作,而有些不行,例如。avi是的,不明白怎么不能工作。avi、.mov、.mp3、.mp4、.mpeg、.vmw。。。你知道会发生什么吗?谢谢!从一些测试中,我在一个紧密的循环中做了一段时间,这是正确的{}在使用任务管理器时,我同意CoTaskMemFree。
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