我想在打印PPT的时候获取这个PPT的文件名。打印驱动是自己弄的。在打印PPT的时候遇上一个怪问题就是。如果打印时手动打开文档点击菜单的打印时,驱动能正常地获取到PPT的文件名。但是如果用程序调用来打印PPT文档时,驱动获取到的文件名就不对了。BOOL APIENTRY OEMStartDoc(SURFOBJ *pso,PWSTR pwszDocName, DWORD dwJobId)
如有一文档:test.ppt。通过PowerPoint 打开文档并用PowerPoint的打印菜单命令打印,OEMStartDoc()中的pwszDocName正常为:pwszDocName = "MicroSoft PowerPoint - test.ppt";
编程调用,代码如下:LRESULT CDlg::Print_PPT(WPARAM wParam, LPARAM lParam)
{
char *szFileName = (char *)wParam;
_ApplicationPPT* ppt = new _ApplicationPPT; if( !ppt->m_lpDispatch )
{
if( !ppt->CreateDispatch( "PowerPoint.Application" ) )
{
delete ppt;
return 0;
}
} try
{ Presentations presents = ppt->GetPresentations();
_Presentation present = presents.Open( szFileName, 1, 1, 0 );
////
PrintOptions po = present.GetPrintOptions();
po.SetPrintInBackground( 0 );
po.SetActivePrinter( szUDCPrinterName );
////
Slides sl = present.GetSlides();
long slNum = sl.GetCount();
if( slNum )
present.PrintOut( 0, slNum, 0, 1, 0 );
////
present.Close();
}
catch(...)
{} ppt->Quit();
ppt->ReleaseDispatch();
delete ppt; SetEvent(m_hPrintEvent);
return 0;
}这时驱动中的OEMStartDoc()pwszDocName 不正常为:pwszDocName = "MicroSoft PowerPoint - 演示文档.ppt";
之后,我尝试在OEMStartDoc用GetJob()去获取打印文档名,毛病依旧,依然是只要用程序去调用虚拟驱动打印PPT就会出现这种文件名。但是这个驱动打印其他文档(Word,Excel)等时又不会这样。只有PPT这个会出现!!!百思不得其解,我估计是在用程序调用的这块上出现毛病吧?驱动应该是没错的了吧?特来请教。请大侠们出来救救我。谢谢啊

解决方案 »

  1.   

    OEMStartDoc( 
    SURFOBJ *pso, 
    PWSTR pwszDocName, 
    DWORD dwJobId 


    .... 
    PDEVOBJ pdevobj=(PDEVOBJ)pso->dhpdev; 
    .... 
    JOB_INFO_1 *pJobinfo; 
    DWORD tt,nwriten; 
    UCHAR docname[256]; 
    ....... 
    GetJob(pdevobj->hPrinter,dwJobId,1,pJobinfo,tt,nwriten); 
    ...... 
    WideCharToMutiByte(cp_acp,0,pJobinfo->pDocment,-1,docname,256,NULL,NULL); 
    .... 

      

  2.   

    楼上的。。GetJob()得到的还是“MicroSoft PowerPoint - 演示文档.ppt”上面不是说了,打印时如果是通过PowerPoint打印的,是可以正常。但是通过微软的Office COM接口去打印PPT时,得到的就成了“演示文档”了。但其他文档都不会出现这种情况。我真日了!!!我贴出来的是程序打印PPT,是不是那段代码有问题呀?虚拟打印驱动应该是没错的了。
      

  3.   

    文件:5566.ppt
    通过打开PPT文件打印的windbg()输出:
    UNI:  OEMStartDoc() entry.
    UNI:  pwszDocName= Microsoft PowerPoint - 5566_test.ppt.
    UNI:  GetJob Fail .The ErrorCode is = (122).
    UNI:  GetJob Fail .dwBuf is = (0).
    UNI:  GetJob Fail .pcNeed is = (272).
    UNI:  The szPath = (F:\ServU\5566).
    UNI:  The jobInfo.pDocument = (Microsoft PowerPoint - 5566_test.ppt).
    通过程序调用打印的windbg()输出:
    UNI:  OEMStartDoc() entry.
    UNI:  pwszDocName= Microsoft PowerPoint - 演示文稿1.
    UNI:  GetJob Fail .The ErrorCode is = (122).
    UNI:  GetJob Fail .dwBuf is = (0).
    UNI:  GetJob Fail .pcNeed is = (256).
    UNI:  The jobInfo.pDocument = (Microsoft PowerPoint - 演示文稿1).
    为什么会这样!!!!
      

  4.   

    结贴,整天都是自问自答。汗一下问题在于
    LRESULT CDlg::Print_PPT(WPARAM wParam, LPARAM lParam)
    这函数里的打开PPT那一句:
    _Presentation present = presents.Open( szFileName, 1, 1, 0 );
    调用参数不正确。Open()的第三个参数会决定打开的PPT文档是否有标题等。
    修正为:
    _Presentation present = presents.Open( szFileName, 0, 0, 1 );
    主要是第三个参数不能为1即可。