c++——HRESULT用法、实例

1. HRESULT 返回值有哪些、及其含义:
S_OK 操作成功 0x00000000
S_FALSE   函数调用成功  #define S_FALSE    ((HRESULT)1L)
E_UNEXPECTED 意外的失败 0x8000FFFF   
E_NOTIMPL 未实现 0x80004001   
E_OUTOFMEMORY 未能分配所需的内存 0x8007000E   
E_INVALIDARG 一个或多个参数无效 0x80070057   
E_NOINTERFACE 不支持此接口 0x80004002   
E_POINTER 无效指针 0x80004003   
E_HANDLE 无效句柄 0x80070006   
E_ABORT 操作已中止 0x80004004   
E_FAIL 未指定的失败 0x80004005   
E_ACCESSDENIED 一般的访问被拒绝错误 0x80070005 
2.HRESULT使用方法:
其中最常用的是S_OK,S_FALSE,E_FAIL.
S_OK 操作成功,调用成功。需要用SUCCEEDED(hr) 来判断。
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
S_FALSE 函数调用成功,可以处理有问题。需要用(hr == S_FALSE)来判断
E_FAIL 未指定的失败,一般来讲是函数调用错误。需要用(hr == E_FAIL) 来判断。
从以上分析可以看出,FAILED 泛指一切错误。
#define FAILED(hr) (((HRESULT)(hr)) < 0)

URLDownloadToFile() 直接下载文件

  

HRESULT URLDownloadToFile(
     LPUNKNOWN pCaller, // 控件的接口,如果不是控件则为0.
     LPCTSTR szURL, //要下载的url地址,不能为空
     LPCTSTR szFileName, //下载后保存的文件名.
     DWORD dwReserved, //保留字段,必需为0
     LPBINDSTATUSCALLBACK lpfnCB ////下载进度状态回调
);

HRESULT ret=URLDownloadToFile(NULL,"http://img1.2345.com/duoteimg/softImg/soft/7/1331706305_41.jpg","123.jpg",0,NULL);


HRESULT ret=URLDownloadToFile(NULL,"http://a2.att.hudong.com/14/31/01000000000000119093157443914.jpg","111.jpg",0,NULL);
if (S_OK ==ret)//下载url函数
MessageBox(_T("Success DownLoad"));
else
MessageBox(_T(" UnSuccess"));
}

### 使用C++读写或控制Excel的方法及库 #### 方法一:使用 COM 自动化技术 通过 Visual C++ 提供的 `#import` 指令可以引入 Excel 的类型库,从而利用 COM 接口来操作 Excel 文件。这种方式允许开发者直接调用 Excel 的对象模型来进行复杂的交互。 以下是基本流程: 1. 导入 Excel 类型库并生成智能指针。 2. 创建 `_ApplicationPtr` 对象实例化 Excel 应用程序。 3. 打开现有工作簿或将新工作簿加载到内存中。 4. 访问特定的工作表并通过单元格地址设置或获取数据。 这种方法的优点在于可以直接访问 Excel 的全部功能集;然而缺点则是依赖于安装有 Microsoft Office 的环境[^3]。 ```cpp #include "stdafx.h" #import "excel.exe" no_namespace rename("RGB", "ExlRGB") int main() { try { CoInitialize(NULL); _ApplicationPtr pApp; WorkbookPtr pWorkBook; WorksheetPtr pSheet; // 启动Excel应用 HRESULT hr = pApp.CreateInstance(__uuidof(Application)); if (FAILED(hr)) throw _com_error(hr); Variant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR); // 可选参数占位符 // 添加新的工作薄 pWorkBook = pApp->Workbooks->Add(vOpt); pSheet = ((_WorkbookPtr)pWorkBook)->ActiveSheet; // 设置A1单元格的内容为"Hello World!" ((RangePtr)(pSheet->Cells(1, 1)))->Value = "Hello World!"; // 显示Excel窗口 pApp->Visible = true; CoUninitialize(); } catch (_com_error &e) { printf("Error: %s\n", e.ErrorMessage()); } } ``` #### 方法二:采用第三方库 - BasicExcel 或 xlnt 对于不希望绑定至具体操作系统或者不想依赖微软Office套件的应用场景来说,可以选择一些轻量级且跨平台支持良好的开源项目如 **BasicExcel** 和 **xlnt** 来处理 .xls/.xlsx 格式的文件。 ##### 基于 BasicExcel 的例子: 此方案适合简单的只涉及数值存储而无需考虑样式等复杂特性的场合[^2]. ```cpp // Example of using BasicExcel library from CodeProject. #include <iostream> #include "BasicExcel.h" void writeExample(const char* filename){ BasicExcel xls(filename,true); int row=0,col=0; double value=123.456; std::string str="Sample Text"; xls.setCell(row++,col,str.c_str()); xls.setCell(row++,col,value); xls.save(); } int main(){ const char *filename="output.xls"; writeExample(filename); return 0; } ``` ##### 利用 xlnt 进行更高级别的操作: 如果需要更加灵活的功能比如图表绘制、条件格式设定等等,则推荐选用较新颖活跃维护中的选项——xlnt[^1]. 它不仅兼容最新版本的标准而且文档详尽易于上手. ```cpp #include <xlnt/xlnt.hpp> using namespace xlnt; workbook wb; worksheet ws = wb.active_sheet(); ws.cell("A1").value().set<std::string>("Name"); ws.cell("B1").value().set<std::string>("Age"); wb.save("example.xlsx"); ``` 以上介绍了几种主流途径帮助您基于C++完成对Excel的操作需求。无论是追求极致性能还是寻求便捷开发体验都有相应的解决方案可供挑选。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值