怎么创建一个虚拟打印机,像pdf的那样

如何创建一个虚拟打印机,像pdf的那样
提供个思路吧,有现成的api吗,还是要硬件驱动方面的编程?
------最佳解决方案--------------------
下载ddk后直接build即可
将生成的SPL文件转成EMF文件
就可打印了
------其他解决方案--------------------
是不是按装一个虚拟打印机就行了,打印的时候选它。
------其他解决方案--------------------
Windows的思路是与设备无关,你输出到打印机与输出到显示器是一样的,唯一不同的是设备的逻辑单位。因此,你可以创建一个虚拟设备(写一段驱动程序),并安装到Windows设备中,打印时使用此驱动提供的DC处理即可。
------其他解决方案--------------------
先谢谢楼上两位,可能问题没说清楚。是建立一个系统的打印机,像Fineprint似的,在任何其他程序(如word,记事本,浏览器啊)点打印按钮时,有这样一个选项
------其他解决方案--------------------
可以用bat批处理生成,也可以用AddPrinter等生成
------其他解决方案--------------------
虚拟打印机有比较多的方式, 一个打印机需要的部分比较多, 包括
Driver(低级驱动)
Processor(处理器)
Monitor(端口)


如果写Driver这部分比较麻烦, 但是功能非常强大的, 比如生成PDF

我写过一个虚拟打印机, Driver,Processor使用微软的, Monitor自己写, 这样比较简单
可以实现打印文档生成图片

部分代码

BOOL CPrintInstall::FullInstall(CHAR *pText)
{
BOOL bRetVal;

bRetVal = InstallDriver();
if(bRetVal == FALSE)
{
strcpy(pText, "InstallDriver");
return FALSE;
}

bRetVal = InstallPort();
if(bRetVal == FALSE)
{
strcpy(pText, "InstallPort");
return FALSE;
}

bRetVal = InstallPrinter();
if(bRetVal == FALSE)
{
strcpy(pText, "InstallPrinter");
return FALSE;
}

strcpy(pText, "OK!");
return TRUE;
}


BOOL CPrintInstall::InstallDriver()
{
DRIVER_INFO_3A DrvInfo;
BOOL bRetVal;

Init();
bRetVal = CopyDriverFile();
if(bRetVal == FALSE)
{
ATLTRACE("CopyDriverFile Failed!\r\n");
return FALSE;
}

memset(&DrvInfo, 0, sizeof(DrvInfo));
DrvInfo.cVersion = 2;
DrvInfo.pName = m_szDrvName;
DrvInfo.pEnvironment = NULL;
DrvInfo.pDriverPath = m_szDriverPath;
DrvInfo.pDataFile = m_szDatePath;
DrvInfo.pConfigFile = m_szConfigPath;
DrvInfo.pHelpFile = NULL;
DrvInfo.pDependentFiles = m_szDependFile;
DrvInfo.pMonitorName = NULL;
DrvInfo.pDefaultDataType = DEFAULT_DATATYPE;
bRetVal = AddPrinterDriverA(NULL, 3, (BYTE *)&DrvInfo);
if(bRetVal == FALSE)
{
m_nLastError = GetLastError();
ATLTRACE("AddPrinterDriverA Failed:%d!\r\n", m_nLastError);
return FALSE;
}

ATLTRACE("AddPrinterDriverA OK!\r\n");
return TRUE;
}


BOOL CPrintInstall::InstallPort()
{
MONITOR_INFO_2A MonInfo;
BOOL bRetVal;
CHAR szMonPath[MAXPATH];
int nError;

Init();
bRetVal = CopyMonitorFile();
if(bRetVal == FALSE)
{
ATLTRACE("CopyMonitorFile Failed!\r\n");
return FALSE;
}

NFile::SpliteFilePath(m_szMontorPath, NULL, szMonPath);
memset(&MonInfo, 0, sizeof(MonInfo));
MonInfo.pDLLName = szMonPath;
MonInfo.pEnvironment = NULL;
MonInfo.pName = PRINT_MONITOR;
bRetVal = AddMonitorA(NULL, 2, (BYTE *)&MonInfo);
if(bRetVal)
return TRUE;

nError = GetLastError();
if(nError == ERROR_PRINT_MONITOR_ALREADY_INSTALLED)