//获取编码器的CLSID [class id] UINT num=0; //图像编码器的数量 UINT size=0; //图像编码器数组的字节数 CLSID encoderClsid; ImageCodecInfo* pICI=NULL; GetImageEncodersSize(&num,&size);//获得系统编码器的数量和大小 if(size==0) return false;//失败 pICI = (ImageCodecInfo*)(malloc(size)); //编码器 if(pICI==NULL) return false;//失败 GetImageEncoders(num,size,pICI); //获取编码器信息 for(int j=0;j<num;++j) { if(wcscmp(pICI[j].MimeType,L"image/png")==0)//jpeg bmp gif tiff png { encoderClsid = pICI[j].Clsid; } } free(pICI); 转换为freebasic语法
时间: 2023-12-06 13:42:58 浏览: 39
Dim num As UINT '图像编码器的数量
Dim size As UINT '图像编码器数组的字节数
Dim encoderClsid As CLSID '编码器的CLSID
Dim pICI As ImageCodecInfo Ptr '编码器
GetImageEncodersSize(num, size) '获得系统编码器的数量和大小
If size = 0 Then Return False '失败
pICI = ImageCodecInfo Ptr(malloc(size)) '分配编码器空间
If pICI = NULL Then Return False '失败
GetImageEncoders(num, size, pICI) '获取编码器信息
For j As Integer = 0 To num - 1
If StrCompare(pICI(j).MimeType, L"image/png") = 0 Then 'jpeg bmp gif tiff png
encoderClsid = pICI(j).Clsid
End If
Next
Free(pICI) '释放编码器空间
相关问题
linux下提取ole中的嵌入文件的库c/c++
可以使用libole2库来提取OLE中的嵌入文件。libole2是一个开源的库,用于操作OLE2格式的文件,包括Microsoft Office文件和COM结构化存储对象。
以下是提取OLE中嵌入文件的示例C代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ole2.h>
int main(int argc, char *argv[]) {
HRESULT hr;
LPWSTR wszPath = NULL;
LPSTR szPath = NULL;
LPWSTR wszFile = NULL;
LPSTR szFile = NULL;
LPWSTR wszClsid = NULL;
LPSTR szClsid = NULL;
LPSTORAGE pStg = NULL;
LPENUMSTATSTG pEnumStg = NULL;
STATSTG statstg;
LPSTREAM pStream = NULL;
DWORD dwMode = STGM_READ | STGM_SHARE_EXCLUSIVE;
if (argc != 2) {
fprintf(stderr, "Usage: %s OLE_FILE\n", argv[0]);
return 1;
}
wszPath = (LPWSTR) malloc((strlen(argv[1]) + 1) * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, argv[1], -1, wszPath, strlen(argv[1]) + 1);
hr = StgOpenStorage(wszPath, NULL, dwMode, NULL, 0, &pStg);
if (FAILED(hr)) {
fprintf(stderr, "Failed to open OLE file: 0x%x\n", hr);
goto Cleanup;
}
hr = pStg->lpVtbl->EnumElements(pStg, 0, NULL, 0, &pEnumStg);
if (FAILED(hr)) {
fprintf(stderr, "Failed to enumerate elements: 0x%x\n", hr);
goto Cleanup;
}
while (S_OK == pEnumStg->lpVtbl->Next(pEnumStg, 1, &statstg, NULL)) {
wszFile = (LPWSTR) malloc((wcslen(statstg.pwcsName) + 1) * sizeof(WCHAR));
wcscpy(wszFile, statstg.pwcsName);
szFile = (LPSTR) malloc((wcslen(wszFile) + 1) * sizeof(CHAR));
WideCharToMultiByte(CP_ACP, 0, wszFile, -1, szFile, wcslen(wszFile) + 1, NULL, NULL);
wszClsid = (LPWSTR) malloc(40 * sizeof(WCHAR));
StringFromGUID2(&statstg.clsid, wszClsid, 40);
szClsid = (LPSTR) malloc((wcslen(wszClsid) + 1) * sizeof(CHAR));
WideCharToMultiByte(CP_ACP, 0, wszClsid, -1, szClsid, wcslen(wszClsid) + 1, NULL, NULL);
printf("File: %s, Class ID: %s\n", szFile, szClsid);
if (statstg.type == STGTY_STREAM) {
hr = pStg->lpVtbl->OpenStream(pStg, wszFile, NULL, dwMode, 0, &pStream);
if (FAILED(hr)) {
fprintf(stderr, "Failed to open stream: 0x%x\n", hr);
goto Cleanup;
}
// TODO: Read from pStream to extract data
pStream->lpVtbl->Release(pStream);
}
CoTaskMemFree(statstg.pwcsName);
free(wszFile);
free(szFile);
free(wszClsid);
free(szClsid);
}
Cleanup:
if (pEnumStg) pEnumStg->lpVtbl->Release(pEnumStg);
if (pStg) pStg->lpVtbl->Release(pStg);
if (wszPath) free(wszPath);
if (szPath) free(szPath);
return 0;
}
```
这段代码首先打开OLE文件,然后枚举它的元素。对于每个元素,它会输出文件名和类ID,如果元素是流,则打开流并从中提取数据。
注意:这段代码并没有提供完整的OLE文件提取功能,你需要根据自己的需求修改代码。
Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown works. PSDispatch looks fine. Weird.
这个问题看起来是 VirtualBox 组件无法正确实例化 CLSID_VirtualBox with IVirtualBox 这个接口导致的。但是,使用 CLSID_VirtualBox with IUnknown 却可以正常工作。可能的原因是 VirtualBox 计算机控制台组件的问题。建议您检查 VirtualBox 安装是否正确,并确保所有依赖项都已正确安装。同时,您可以尝试重新安装 VirtualBox 计算机控制台组件,或者尝试使用其他版本的 VirtualBox 计算机控制台组件。