从C++中的扩展获得MIME类型 有没有办法获得C++中MIME类型的文件扩展名?< /P>
我读过HKEY_CLASSES_ROOT,但我真的不知道如何使用它 我想要的是作为输入:从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 <
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