我想在打印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这个会出现!!!百思不得其解,我估计是在用程序调用的这块上出现毛病吧?驱动应该是没错的了吧?特来请教。请大侠们出来救救我。谢谢啊
如有一文档: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这个会出现!!!百思不得其解,我估计是在用程序调用的这块上出现毛病吧?驱动应该是没错的了吧?特来请教。请大侠们出来救救我。谢谢啊
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);
....
}
通过打开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).
为什么会这样!!!!
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即可。