C语言参数 封装IDispatch*入参 并返回
时间: 2023-07-10 12:11:44 浏览: 141
在 C 语言中,使用 IDispatch 接口封装对象可以实现对象的方法调用和属性访问。在函数中,我们可以通过传递 IDispatch* 类型的指针参数来访问和修改对象的属性和方法。函数也可以通过返回 IDispatch* 类型的指针来返回一个封装对象的实例。
以下是一个示例代码,演示了如何使用 IDispatch 接口封装对象来传递参数并返回对象:
```c
#include <stdio.h>
#include <windows.h>
IDispatch* create_object() {
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (FAILED(hr)) {
return NULL;
}
IDispatch* pExcel = NULL;
hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**) &pExcel);
if (FAILED(hr)) {
return NULL;
}
return pExcel;
}
void set_cell_value(IDispatch* pWorksheet, int row, int col, LPWSTR value) {
DISPID dispId;
BSTR propName = SysAllocString(L"Cells");
VARIANT result;
VariantInit(&result);
DISPPARAMS params = { 0 };
VARIANT args[2];
args[0].vt = VT_I4;
args[0].lVal = row;
args[1].vt = VT_I4;
args[1].lVal = col;
params.cArgs = 2;
params.rgvarg = args;
HRESULT hr = pWorksheet->GetIDsOfNames(IID_NULL, &propName, 1, LOCALE_SYSTEM_DEFAULT, &dispId);
if (FAILED(hr)) {
return;
}
hr = pWorksheet->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, ¶ms, &result, NULL, NULL);
if (FAILED(hr)) {
return;
}
IDispatch* pCell = result.pdispVal;
if (pCell == NULL) {
return;
}
propName = SysAllocString(L"Value");
VARIANTARG valueArg;
valueArg.vt = VT_BSTR;
valueArg.bstrVal = SysAllocString(value);
DISPID putDispId;
hr = pCell->GetIDsOfNames(IID_NULL, &propName, 1, LOCALE_SYSTEM_DEFAULT, &putDispId);
if (FAILED(hr)) {
return;
}
params.cArgs = 1;
params.rgvarg = &valueArg;
hr = pCell->Invoke(putDispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, NULL);
if (FAILED(hr)) {
return;
}
SysFreeString(propName);
VariantClear(&result);
}
int main() {
IDispatch* pExcel = create_object();
if (pExcel == NULL) {
printf("Failed to create Excel instance.\n");
return 1;
}
BSTR propName = SysAllocString(L"ActiveWorkbook");
DISPID dispId;
HRESULT hr = pExcel->GetIDsOfNames(IID_NULL, &propName, 1, LOCALE_SYSTEM_DEFAULT, &dispId);
if (FAILED(hr)) {
printf("Failed to get ActiveWorkbook property.\n");
return 1;
}
VARIANT result;
VariantInit(&result);
hr = pExcel->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, NULL, &result, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to invoke ActiveWorkbook property.\n");
return 1;
}
IDispatch* pWorkbook = result.pdispVal;
if (pWorkbook == NULL) {
printf("Failed to get workbook instance.\n");
return 1;
}
propName = SysAllocString(L"ActiveSheet");
hr = pWorkbook->GetIDsOfNames(IID_NULL, &propName, 1, LOCALE_SYSTEM_DEFAULT, &dispId);
if (FAILED(hr)) {
printf("Failed to get ActiveSheet property.\n");
return 1;
}
VariantClear(&result);
hr = pWorkbook->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, NULL, &result, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to invoke ActiveSheet property.\n");
return 1;
}
IDispatch* pWorksheet = result.pdispVal;
if (pWorksheet == NULL) {
printf("Failed to get worksheet instance.\n");
return 1;
}
set_cell_value(pWorksheet, 1, 1, L"Hello");
set_cell_value(pWorksheet, 1, 2, L"World");
pWorksheet->Release();
pWorkbook->Release();
pExcel->Release();
return 0;
}
```
在这个示例中,我们使用 IDispatch 接口封装了一个 Excel.Application 对象,并使用 create_object 函数来创建对象实例。我们还定义了 set_cell_value 函数来设置单元格的值。该函数接受一个 IDispatch* 类型的指针参数,该参数指向一个 Excel.Worksheet 对象。在函数内部,我们使用 GetIDsOfNames 和 Invoke 函数来访问单元格对象,并使用 SetProperty 函数来设置单元格的值。最后,我们在 main 函数中调用 set_cell_value 函数来设置单元格的值,并释放对象实例。
阅读全文