判斷本機office安裝版本的方法分享
#include "msword.h"
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp,
LPOLESTR ptName, int cArgs...)
{
// Begin variable-argument list
va_list marker;
va_start(marker, cArgs);
if (!pDisp)
{
_putws(L"NULL IDispatch passed to AutoWrap()");
_exit(0);
return E_INVALIDARG;
}
// Variables used
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
// Get DISPID for name passed
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if (FAILED(hr))
{
wprintf(L"IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx\n",
ptName, hr);
_exit(0);
return hr;
}
// Allocate memory for arguments
VARIANT *pArgs = new VARIANT[cArgs + 1];
// Extract arguments...
for(int i=0; i < cArgs; i++)
{
pArgs[i] = va_arg(marker, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts
if (autoType & DISPATCH_PROPERTYPUT)
{
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
autoType, &dp, pvResult, NULL, NULL);
if (FAILED(hr))
{
wprintf(L"IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx\n",
ptName, dispID, hr);
_exit(0);
return hr;
}
// End variable-argument section
va_end(marker);
delete[] pArgs;
return hr;
}
void Cwps_msword2013Dlg::OnBnClickedButton1()
{
CString strAppName = OLESTR("word.application");
bool bResult = false;
IDispatch * wordApp;
CLSID appClsid;
if(S_OK == CLSIDFromProgID(strAppName, &appClsid))
{
if(S_OK == CoCreateInstance(appClsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&wordApp))
{
Word::_Application appWord;
if(S_OK == wordApp->QueryInterface(IID_IDispatch, (void**)&appWord))
{
CString strVersion = _T("");
strVersion = appWord.GetVersion();
if(_ttoi(strVersion) >= 15.0)
{
bResult = true;
}
}
}
AutoWrap(DISPATCH_METHOD, NULL, wordApp, L"Quit", 0);
wordApp->Release();
}
if(bResult)
MessageBox(_T("ok"), _T("tip"));
else
MessageBox(_T("no"), _T("tip"));
//return bResult;
}
相關(guān)文章
深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對齊
要求數(shù)據(jù)內(nèi)存的起始地址的值是某個數(shù)k的倍數(shù),這就是所謂的內(nèi)存對齊,本文就來深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對齊,需要的朋友可以參考下2016-05-05C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題
這篇文章我們九里講講C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容2021-09-09全面解析設(shè)計模式中的建造者模式及相關(guān)C++實現(xiàn)
這篇文章主要介紹了設(shè)計模式中的建造者模式及相關(guān)C++實現(xiàn),需要的朋友可以參考下2016-03-03