Image::FromStream(pStream) 返回0

今天在做GDI,PNG的透明按钮时遇到一个问题,

pImage=Gdiplus::Image::FromStream(pStream);总是返回0;

原来是没有初始化GDI



Gdiplus::GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR           gdiplusToken;

//初始化GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
头文件包含:
#include <GdiPlusInit.h>
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在 C 语言中,可以使用 COM 技术来操作 OLE 对象并进行提取。 以下是提取 OLE 嵌入文件的基本步骤: 1. 使用 COM 技术创建一个 OLE 对象。 2. 获取 OLE 对象所包含的数据流,并将其保存到一个文件中。 3. 释放 OLE 对象。 下面是示例代码: ```c #include <windows.h> #include <ole2.h> int main() { // 初始化 COM 环境 CoInitialize(NULL); // 创建 OLE 对象 IOleObject* pOleObject = NULL; HRESULT hr = CoCreateInstance(CLSID_XXX, NULL, CLSCTX_LOCAL_SERVER, IID_IOleObject, (void**)&pOleObject); if (FAILED(hr)) { printf("Failed to create OLE object, error code: 0x%x\n", hr); CoUninitialize(); return -1; } // 获取 OLE 对象数据流 IStream* pStream = NULL; hr = pOleObject->GetClientSite()->GetContainer()->QueryInterface(IID_IStream, (void**)&pStream); if (FAILED(hr)) { printf("Failed to get OLE object data stream, error code: 0x%x\n", hr); pOleObject->Release(); CoUninitialize(); return -1; } // 保存数据流到文件 const WCHAR* filePath = L"ole_file"; HANDLE hFile = CreateFile(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("Failed to create file, error code: 0x%x\n", GetLastError()); pStream->Release(); pOleObject->Release(); CoUninitialize(); return -1; } STATSTG statstg; hr = pStream->Stat(&statstg, STATFLAG_DEFAULT); if (FAILED(hr)) { printf("Failed to get stream size, error code: 0x%x\n", hr); CloseHandle(hFile); pStream->Release(); pOleObject->Release(); CoUninitialize(); return -1; } ULONG written = 0; hr = pStream->CopyTo(hFile, statstg.cbSize, &written, NULL); if (FAILED(hr)) { printf("Failed to save stream to file, error code: 0x%x\n", hr); CloseHandle(hFile); pStream->Release(); pOleObject->Release(); CoUninitialize(); return -1; } CloseHandle(hFile); // 释放资源 pStream->Release(); pOleObject->Release(); CoUninitialize(); return 0; } ``` 需要注意的是,代码中的 CLSID_XXX、IID_IOleObject 等常量需要根据具体的 OLE 对象进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q472599451

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值