最近一个工程中,我采用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);
}
}

解决方案 »

  1.   

    CoInitialize
    放到InitInstance中CoUninitialize
    放到ExitInstance中试试
      

  2.   

    我试了一下没有问题
    /////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
      

  3.   

    可能是和杀毒软件冲突。比如KV300,NORTON之类的。
      

  4.   

    取一下错误信息看看是什么问题,还有会不会是DCOM权限配置的问题(一般不会,默认管理员是有权限的)
      

  5.   

    程序改为使用
    COleException e;
    if(!m_wordApp.CreateDispatch("Word.Application",&e))
    {
    e.ReportError();
     exit(1);
    }
    之后,运行时弹出“Class not registered”提示框。很奇怪,怎么会出现这种错误呢?Word2000肯定是已经装过的了。
      

  6.   

    先把杀毒软件禁用试试。把能禁用的程序都禁用试试。重装OFFICE试试。
      

  7.   

    装了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"