最近一个工程中,我采用VC6.0写了一个控制Word的基于Dialog的Dll程序,供主工程调用。在Dll的InitInstance函数中,调用AfxOleInit()初始化COM(此处编译通过)。但是,在按下按钮创建Word对象时,CreateDispatch语句出错。编辑环境: Win2000 Server+VC6.0(sp5)+Word2000.调试了很久,怎么也通不过。还请各位高手不吝赐教,本人感激不尽!
附:(创建代码)
HRESULT hr;
hr=CoInitialize(NULL);
ASSERT(!FAILED(hr));
IUnknown *pUnk;
IDispatch *pDisp;
CLSID clsid;
_Application m_wordApp;
CLSIDFromProgID(L"Word.Application", &clsid);
//查看是否有已经打开的Word对象
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
if (!FAILED(hr))
{
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
ASSERT(!FAILED(hr));
m_wordApp.AttachDispatch(pDisp,TRUE);
pUnk->Release();
}
else
// 若无,则新建一个Word对象
{
if(!m_wordApp.CreateDispatch("Word.Application",NULL))
{
AfxMessageBox("创建ms_word对象失败");
exit(1);
}
}
附:(创建代码)
HRESULT hr;
hr=CoInitialize(NULL);
ASSERT(!FAILED(hr));
IUnknown *pUnk;
IDispatch *pDisp;
CLSID clsid;
_Application m_wordApp;
CLSIDFromProgID(L"Word.Application", &clsid);
//查看是否有已经打开的Word对象
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
if (!FAILED(hr))
{
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
ASSERT(!FAILED(hr));
m_wordApp.AttachDispatch(pDisp,TRUE);
pUnk->Release();
}
else
// 若无,则新建一个Word对象
{
if(!m_wordApp.CreateDispatch("Word.Application",NULL))
{
AfxMessageBox("创建ms_word对象失败");
exit(1);
}
}
放到InitInstance中CoUninitialize
放到ExitInstance中试试
/////DLL :
void CallwordDlg::OnOK()
{
// TODO: Add extra validation here
HRESULT hr;
hr=CoInitialize(NULL);
if(FAILED(hr))
AfxMessageBox("failed to call CoInitialize()");
// ASSERT(!FAILED(hr));
IUnknown *pUnk;
IDispatch *pDisp;
CLSID clsid;
_Application m_wordApp;
CLSIDFromProgID(L"Word.Application", &clsid);
//²é¿´ÊÇ·ñÓÐÒѾ­´ò¿ªµÄWord¶ÔÏó
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
if (!FAILED(hr))
{
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
ASSERT(!FAILED(hr));
m_wordApp.AttachDispatch(pDisp,TRUE);
pUnk->Release();
}
else
// ÈôÎÞ£¬Ôòн¨Ò»¸öWord¶ÔÏó
{
COleException e;
if(!m_wordApp.CreateDispatch("Word.Application",&e))
{
e.ReportError();
AfxMessageBox("´´½¨ms_word¶ÔÏóʧ°Ü");
return;
// exit(1);
}
}
m_wordApp.SetVisible(TRUE);
AfxMessageBox("Start word OK");
COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);m_wordApp.Quit(&vOpt,&vOpt,&vOpt);
CDialog::OnOK();
}
extern "C" __declspec(dllexport) BOOL ExportedFunction();extern "C" BOOL ExportedFunction()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// normal function body here
CallwordDlg dlg;
dlg.DoModal();
return TRUE;
}
////application to call DLL
extern "C" __declspec(dllimport) BOOL ExportedFunction();
#pragma comment(lib,"callword.lib") // lib of above DLL
void CCallword_testDlg::OnOK()
{
// TODO: Add extra validation here
// AfxOleInit();
ExportedFunction();
CDialog::OnOK();
}VC6.0 SP6, Word2003, Windows XP SP2
COleException e;
if(!m_wordApp.CreateDispatch("Word.Application",&e))
{
e.ReportError();
exit(1);
}
之后,运行时弹出“Class not registered”提示框。很奇怪,怎么会出现这种错误呢?Word2000肯定是已经装过的了。
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Word.Application]
@="Microsoft Word aplication"[HKEY_CLASSES_ROOT\Word.Application\CLSID]
@="{000209FF-0000-0000-C000-000000000046}"[HKEY_CLASSES_ROOT\Word.Application\CurVer]
@="Word.Application.10"