CLSIDFromProgID(L"Excel.Application", &clsid)
时间: 2023-07-24 08:06:33 浏览: 209
这段代码的作用是将字符串 "Excel.Application" 转换为对应的 CLSID (Class Identifier)。
CLSID 是 Windows 中用来标识每个 COM 类的唯一标识符。在这个例子中,"Excel.Application" 是 Excel 应用程序的 ProgID(Programmatic Identifier),而 clsid 变量将包含 Excel 应用程序的 CLSID。
这个函数的完整定义是:
```C++
HRESULT CLSIDFromProgID(
LPCOLESTR lpszProgID,
LPCLSID lpclsid
);
```
其中,lpszProgID 参数是要转换的 ProgID 字符串,lpclsid 参数是接收转换后的 CLSID 的指针。函数返回 HRESULT 类型的值,表示函数执行的结果。
相关问题
CLSIDFromProgID(L"Excel.Application", &clsid) 使用实例
CLSIDFromProgID 函数是 Windows API 中的一部分,可以将给定的 ProgID(程序标识符)转换为对应的 CLSID(类标识符)。在以下示例中,我们将使用 CLSIDFromProgID 函数将 "Excel.Application" 转换为对应的 CLSID。
```cpp
#include <Windows.h>
#include <atlbase.h> // CComBSTR 类
int main()
{
// 创建变量存储 CLSID
CLSID clsid;
// 将 "Excel.Application" 转换为对应的 CLSID
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (FAILED(hr))
{
// 转换失败,输出错误信息
printf("CLSIDFromProgID failed with error 0x%x\n", hr);
return 1;
}
// 将 CLSID 转换为字符串
CComBSTR bstrCLSID;
hr = StringFromCLSID(clsid, &bstrCLSID);
if (FAILED(hr))
{
// 转换失败,输出错误信息
printf("StringFromCLSID failed with error 0x%x\n", hr);
return 1;
}
// 输出转换后的 CLSID 字符串
printf("Excel.Application CLSID is %S\n", bstrCLSID);
return 0;
}
```
运行结果应该如下:
```
Excel.Application CLSID is {00024500-0000-0000-C000-000000000046}
```
CLSIDFromProgID(L"Excel.Application", &clsid) 使用WIN32 API 读取Excel表格
CLSIDFromProgID() 函数是用于获取指定程序的 CLSID 的 Win32 API 函数,它的参数是程序的 ProgID,即程序的注册名称。在这里,使用 CLSIDFromProgID() 函数获取 Excel 应用程序的 CLSID,然后可以使用该 CLSID 创建 Excel 应用程序的 COM 对象,进而操作 Excel 表格。
以下是一个使用 Win32 API 读取 Excel 表格的示例代码:
```c++
#include <Windows.h>
#include <ObjBase.h>
#include <atlbase.h>
#include <atlcomcli.h>
#include <Excel.h>
int main() {
// 初始化 COM 库
CoInitialize(NULL);
// 获取 Excel 应用程序的 CLSID
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (FAILED(hr)) {
// 处理获取 CLSID 失败的情况
return -1;
}
// 创建 Excel 应用程序的 COM 对象
CComPtr<IDispatch> pExcelApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IDispatch, (void**)&pExcelApp);
if (FAILED(hr)) {
// 处理创建 COM 对象失败的情况
return -1;
}
// 获取 Workbooks 对象
CComVariant vWorkbooks;
hr = pExcelApp->GetIDsOfNames(IID_NULL, L"Workbooks", 1, LOCALE_USER_DEFAULT,
&vWorkbooks);
if (FAILED(hr)) {
// 处理获取 Workbooks 对象失败的情况
return -1;
}
CComVariant vEmpty;
DISPPARAMS dp = {NULL, NULL, 0, 0};
CComVariant vResult;
hr = pExcelApp->Invoke(vWorkbooks.lVal, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理获取 Workbooks 对象失败的情况
return -1;
}
CComPtr<IDispatch> pWorkbooks;
pWorkbooks = vResult.pdispVal;
// 打开 Excel 表格
CComVariant vFilename(L"C:\\test.xlsx");
CComVariant vReadOnly(false);
hr = pWorkbooks->Invoke(DISPID_VALUE, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理打开 Excel 表格失败的情况
return -1;
}
CComPtr<IDispatch> pWorkbook;
pWorkbook = vResult.pdispVal;
// 获取 Worksheet 对象
CComVariant vWorksheets;
hr = pWorkbook->GetIDsOfNames(IID_NULL, L"Worksheets", 1, LOCALE_USER_DEFAULT,
&vWorksheets);
if (FAILED(hr)) {
// 处理获取 Worksheets 对象失败的情况
return -1;
}
CComVariant vIndex(1);
dp.rgvarg = &vIndex;
dp.cArgs = 1;
hr = pWorkbook->Invoke(vWorksheets.lVal, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理获取 Worksheet 对象失败的情况
return -1;
}
CComPtr<IDispatch> pWorksheet;
pWorksheet = vResult.pdispVal;
// 获取单元格的值
CComVariant vRange(L"A1");
hr = pWorksheet->Invoke(0x6c, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL);
if (FAILED(hr)) {
// 处理获取单元格的值失败的情况
return -1;
}
CComVariant vValue;
vValue = vResult;
// 输出单元格的值
wprintf(L"%s\n", vValue.bstrVal);
// 关闭 Excel 应用程序
dp.rgvarg = NULL;
dp.cArgs = 0;
hr = pExcelApp->Invoke(DISPID_APP_CLOSE, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dp, NULL, NULL, NULL);
// 释放 COM 对象
pWorksheet.Release();
pWorkbook.Release();
pWorkbooks.Release();
pExcelApp.Release();
// 反初始化 COM 库
CoUninitialize();
return 0;
}
```
注意:上述示例代码使用了 ATL(Active Template Library)和 C++ COM,所以需要添加 ATL 头文件并链接 ATL 库才能编译通过。如果没有使用 ATL 或者 C++ COM,可以使用纯 Win32 API 和 C COM 实现相同的功能。
阅读全文