none
vc通过com调用word打印,打印状态无法返回 RRS feed

  • 问题

  • 运行环境: windows2008(x86) , Office2003
    开发平台: vs.net2008(vc9.0)

    现象:
        程序发布版本部署在windows2008(x86)操作系统中,启动后一段时间内能正常打印word文件,运行一段时间后,word文件无法打印。
        通过程序日志,发现程序在 获取word打印状态 循环中无法结束。
        此时,在操作系统进程管理器中能够看到有 winword进程 , 手动终止该 winword进程后,程序又正常打印word文件。


    打印逻辑:
        vc调用word COM 组件,
        通过代码调用 word 宏生成待打印文件,并在word宏中打印;宏运行成功则返回文件页数,否则返回零
        通过代码循环获取 word打印状态 ,打印结束则返回,否则继续循环判断。

    程序代码:
    int count = 0;
    try{
    CoInitialize(NULL);
    _Application app;
    Documents docs;
    _Document doc;

    app.ReleaseDispatch();
    docs.ReleaseDispatch();
    doc.ReleaseDispatch();

    if(!app.CreateDispatch(_T("Word.Application")))
    {
    CoUninitialize();
    return 0;
    }

    app.SetVisible(false);
    app.SetDisplayAlerts(false);

    COleVariant varFilePath(strFilePath);
    COleVariant varstrNull("");
    COleVariant varZero((short)0);
    COleVariant varTrue(short(1),VT_BOOL);
    COleVariant varFalse(short(0),VT_BOOL);

    docs=app.GetDocuments();
    doc = docs.Open(varFilePath,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional);

    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant printer(printerName);

    VARIANT count1 = app.Run("word宏函数名",printer,参数1,参数2,参数3,
    参数4,参数5,参数6,参数7,参数8,参数9,
    covOptional,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional,
    covOptional,covOptional,covOptional,covOptional);

    count = count1.intVal;

    //程序运行一段时间后,在打印word时会在该循环内无法正常结束
    while( app.GetBackgroundPrintingStatus()> 0 ){
    Sleep(1000);
    }

    short save=0;
    COleVariant vsave(save, VT_BOOL);
    doc.Close(vsave,covOptional,covOptional);
    doc.ReleaseDispatch();
    docs.ReleaseDispatch();
    app.Quit(covOptional,covOptional,covOptional);
    app.ReleaseDispatch();

    CoUninitialize();

    return count;
    }catch(...)
    {
    return 0;
    }
    2014年8月6日 1:30

答案

  • 非常感谢您的回复。

    链接http://word.mvps.org/faqs/macrosvba/WaitForPrint.htm 中提到的方法就是我之前用的方法。只是属性的设置是在 word 宏中进行的。 (使用word 宏的原因是为了以后修改方便。)

    目前的解决办法是: 使用word宏生成待打印文件,在word宏中不进行打印输出操作。  打印输出操作在程序中代码实现。

    目前运行正常。

    • 已编辑 dongbao 2014年8月25日 0:58
    • 已标记为答案 Shu 2017 2014年8月25日 1:07
    2014年8月25日 0:50

全部回复