HRESULT AutoWrap(int autoType, VARIANT* pvResult, IDispatch* pDisp, LPOLESTR ptName, int cArgs...) {
// 变量定义
va_list marker;
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
char szName[200];
// 获取 DISPID
pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
// 分配内存用于参数
VARIANT* pArgs = new VARIANT[cArgs + 1];
// 提取参数
va_start(marker, cArgs);
for (int i = 0; i < cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
va_end(marker);
// 填充 DISPPARAMS 结构
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// 处理属性设置
if (autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// 调用 IDispatch
HRESULT hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
if (FAILED(hr)) {
return hr;
}
// 清理
delete[] pArgs;
return hr;
}
int main() {
HRESULT hr = CoInitialize(NULL); // 初始化 COM
if (FAILED(hr)) {
std::cout << "COM initialization failed. Error code: " << hr << std::endl;
return 1;
}
// 创建 Word 应用程序实例
CLSID clsid;
hr = CLSIDFromProgID(L"KWPS.Application", &clsid);
if (FAILED(hr)) {
std::cout << "CLSIDFromProgID failed. Error code: " << hr << std::endl;
CoUninitialize();
return 1;
}
IDispatch* pWordApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pWordApp);
if (FAILED(hr)) {
std::cout << "Word application creation failed. Error code: " << hr << std::endl;
CoUninitialize();
return 1;
}
// 设置 Word 不可见
VARIANT x;
x.vt = VT_I4;
x.lVal = 0;
hr = AutoWrap(DISPATCH_PROPERTYPUT, NULL, pWordApp, SysAllocString(L"Visible"), 1, x);
if (FAILED(hr)) {
std::cout << "Failed to set Word visibility. Error code: " << hr << std::endl;
pWordApp->Release();
CoUninitialize();
return 1;
}
// 获取 Documents 集合
VARIANT result;
VariantInit(&result);
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pWordApp, SysAllocString(L"Documents"), 0);
if (FAILED(hr)) {
std::cout << "Failed to get Documents collection. Error code: " << hr << std::endl;
pWordApp->Release();
CoUninitialize();
return 1;
}
IDispatch* pDocuments = result.pdispVal;
// 打开文档
VARIANT vtFilePath;
vtFilePath.vt = VT_BSTR;
vtFilePath.bstrVal = ::SysAllocString(L"C:\\xxx\\wps-test\\1.docx"); // 替换为您的 Word 文档路径
VARIANT resultDoc;
VariantInit(&resultDoc);
hr = AutoWrap(DISPATCH_METHOD, &resultDoc, pDocuments, SysAllocString(L"Open"), 1, vtFilePath);
if (FAILED(hr)) {
std::cout << "Failed to open document. Error code: " << hr << std::endl;
pDocuments->Release();
pWordApp->Release();
CoUninitialize();
return 1;
}
IDispatch* pDocument = resultDoc.pdispVal;
VARIANT vtSavePath;
vtSavePath.vt = VT_BSTR;
vtSavePath.bstrVal = ::SysAllocString(L"C:\\xxx\\wps-test\\1.pdf"); // PDF 保存路径
VARIANT vtFormat;
vtFormat.vt = VT_I4;
vtFormat.lVal = 17; // PDF 格式枚举值
// 调用 ExportAsFixedFormat 方法
hr = AutoWrap(DISPATCH_METHOD, NULL, pDocument, SysAllocString(L"ExportAsFixedFormat"), 2, vtSavePath, vtFormat);
if (FAILED(hr)) {
_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
std::wcout << L"Failed to save document as PDF. Error: " << errMsg << std::endl;
//释放
pDocument->Release();
pDocuments->Release();
pWordApp->Release();
CoUninitialize();
return 1;
}
// 关闭文档和 Word 应用程序
hr = AutoWrap(DISPATCH_METHOD, NULL, pDocument, SysAllocString(L"Close"), 0);
if (FAILED(hr)) {
std::cout << "Failed to close document. Error code: " << hr << std::endl;
}
hr = AutoWrap(DISPATCH_METHOD, NULL, pWordApp, SysAllocString(L"Quit"), 0);
if (FAILED(hr)) {
std::cout << "Failed to quit Word application. Error code: " << hr << std::endl;
}
// 释放资源
pDocument->Release();
pDocuments->Release();
pWordApp->Release();
::SysFreeString(vtFilePath.bstrVal);
::SysFreeString(vtSavePath.bstrVal);
CoUninitialize();
return 0;
}
以上是我写的通过c++调用com 接口的示例代码,但是发现执行到
hr = AutoWrap(DISPATCH_METHOD, NULL, pDocument, SysAllocString(L"ExportAsFixedFormat"), 2, vtSavePath, vtFormat);
开始报错,说类型不匹配,我的写法是参考这个的,目前java可以实现调用wps转pdf,但是自己去封装发现有问题
<dependency>
<groupId>net.sf.jacob-project</groupId>
<artifactId>jacob</artifactId>
<version>1.14.3</version>
</dependency>