C语言 DISPATCH_PROPERTYPUT 写入值
时间: 2023-07-22 14:10:22 浏览: 157
DISPATCH_PROPERTYPUT是一种用于写入COM对象的属性值的宏。在C语言中使用该宏时,通常需要先声明一个IDispatch接口指针,然后使用该指针来调用DISPATCH_PROPERTYPUT宏来写入属性值。例如:
```c
IDispatch* pDispatch; // 声明IDispatch指针
// ...
// 使用DISPATCH_PROPERTYPUT宏写入属性值
DISPATCH_PROPERTYPUT(pDispatch, "Property", 0, &newValue);
```
上述示例中,pDispatch是一个IDispatch接口指针,"Property"是要设置的属性名称,0是属性的参数数量,&newValue是要设置的新属性值。
需要注意的是,使用DISPATCH_PROPERTYPUT宏时,需要先创建一个VARIANT结构体来存储要写入的属性值。例如,如果要写入一个整数值,可以这样创建VARIANT结构体:
```c
VARIANT newValue;
VariantInit(&newValue);
newValue.vt = VT_I4;
newValue.lVal = 123;
```
上述示例中,创建了一个新的VARIANT结构体newValue,并将其类型设置为VT_I4(即整数类型),将其值设置为123。最后,将指向newValue的指针传递给DISPATCH_PROPERTYPUT宏即可完成属性值的写入。
相关问题
C语言 DISPATCH_PROPERTYPUT 写入Excel表格数据
在C语言中使用DISPATCH_PROPERTYPUT宏写入Excel表格数据,通常需要借助于Microsoft Office Excel自带的COM组件。以下是一个简单的示例,可以帮助你快速了解如何使用DISPATCH_PROPERTYPUT宏将数据写入Excel表格中:
```c
#include <Windows.h>
#include <Ole2.h>
#include <OleAuto.h>
int main()
{
// 初始化COM库
CoInitialize(NULL);
// 创建Excel应用程序对象
IDispatch* pExcelApp;
CoCreateInstance(&CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, &IID_IDispatch, (void**)&pExcelApp);
// 打开Excel文件
VARIANT vFilename;
VariantInit(&vFilename);
vFilename.vt = VT_BSTR;
vFilename.bstrVal = SysAllocString(L"C:\\test.xlsx");
IDispatch* pWorkbook;
IDispatch* pWorksheet;
VARIANT vIndex;
VariantInit(&vIndex);
vIndex.vt = VT_I4;
vIndex.lVal = 1;
DISPATCH_PROPERTYPUT(pExcelApp, "Visible", 0, &vTrue);
DISPATCH_METHOD(pExcelApp, "Workbooks", &pWorkbook);
DISPATCH_METHOD(pWorkbook, "Open", &pWorksheet, 1, &vFilename);
DISPATCH_METHOD(pWorksheet, "Activate", NULL);
// 写入数据
VARIANT vCell;
VariantInit(&vCell);
vCell.vt = VT_BSTR;
vCell.bstrVal = SysAllocString(L"A1");
VARIANT vData;
VariantInit(&vData);
vData.vt = VT_BSTR;
vData.bstrVal = SysAllocString(L"Hello, world!");
DISPATCH_METHOD(pWorksheet, "Range", &pRange, 1, &vCell);
DISPATCH_PROPERTYPUT(pRange, "Value", 0, &vData);
// 保存并关闭Excel文件
DISPATCH_METHOD(pWorkbook, "Save", NULL);
DISPATCH_METHOD(pWorkbook, "Close", NULL);
// 释放资源
pWorksheet->Release();
pWorkbook->Release();
pExcelApp->Release();
SysFreeString(vFilename.bstrVal);
SysFreeString(vCell.bstrVal);
SysFreeString(vData.bstrVal);
CoUninitialize();
return 0;
}
```
上述示例中,我们首先初始化了COM库,然后创建了一个Excel应用程序对象,使用它来打开指定的Excel文件。接着,我们使用DISPATCH_PROPERTYPUT宏将数据写入单元格A1中,最后保存并关闭Excel文件,并释放所有资源。
需要注意的是,在使用DISPATCH_PROPERTYPUT宏时,需要先创建一个VARIANT结构体来存储要写入的数据。例如,如果要将字符串"Hello, world!"写入单元格中,可以这样创建VARIANT结构体:
```c
VARIANT vData;
VariantInit(&vData);
vData.vt = VT_BSTR;
vData.bstrVal = SysAllocString(L"Hello, world!");
```
上述示例中,我们创建了一个新的VARIANT结构体vData,并将其类型设置为VT_BSTR(即字符串类型),将其值设置为"Hello, world!"。最后,将指向vData的指针传递给DISPATCH_PROPERTYPUT宏即可完成数据的写入。
DISPATCH_PROPERTYPUT C语言实例源码
以下是一个简单的 C++ 示例,展示了如何使用 DISPATCH_PROPERTYPUT 来进行属性设置:
```c++
void SetWindowText(HWND hwnd, LPCWSTR text) {
// 获取 IDispatch 接口
IDispatch* pDispatch;
HRESULT hr = SendMessageTimeout(hwnd, WM_GETOBJECT, 0, OBJID_NATIVEOM, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&pDispatch);
if (FAILED(hr) || !pDispatch) {
return;
}
// 获取 IAccessible 接口
IAccessible* pAccessible;
hr = AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible, (void**)&pAccessible);
if (FAILED(hr) || !pAccessible) {
pDispatch->Release();
return;
}
// 获取文本属性
DISPID dispid;
hr = pAccessible->get_accChildCount(&dispid);
if (FAILED(hr)) {
pAccessible->Release();
pDispatch->Release();
return;
}
// 设置文本属性
VARIANTARG varg;
varg.vt = VT_BSTR;
varg.bstrVal = SysAllocString(text);
DISPPARAMS dispParams = { &varg, nullptr, 1, 0 };
hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams, nullptr, nullptr, nullptr);
VariantClear(&varg);
pAccessible->Release();
pDispatch->Release();
}
```
以上代码演示了如何使用 SendMessageTimeout 函数来获取 IDispatch 接口,然后使用 AccessibleObjectFromWindow 函数获取 IAccessible 接口。接下来,使用 get_accChildCount 获取文本属性的 DISPID,最后使用 DISPATCH_PROPERTYPUT 来进行属性设置。
阅读全文