本帖最后由 rehuo 于 2009-10-12 15:14:46 编辑

解决方案 »

  1.   

    office2003自带的虚拟打印机.用的不是LPT 是 虚拟接口 Local Port  [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
            private static extern IntPtr CreateFile
            (
                string FileName,          // file name 
                uint DesiredAccess,      // access mode 
                uint ShareMode,          // share mode 
                uint SecurityAttributes,  // Security Attributes 
                uint CreationDisposition, // how to create 
                uint FlagsAndAttributes,  // file attributes 
                int hTemplateFile        // handle to template file 
            );返回的 IntPtr 为-1 没有打开接口
      

  2.   

    to zgke:
    office2003自带的虚拟打印机.用的不是LPT 是 虚拟接口 Local Port ,这里可以修改端口,将其端口变为LPT1,问题是不知为什么不管LPT1这个端口有没有打印机,handle.IsInvalid总等于false,后来我在一个有真实打印机的机器上试了一下,也是这个样子!真是奇怪!
      

  3.   

    另外SafeFileHandle是2.0新加的,和IntPtr 在实质上是一样的
      

  4.   

    CreateFile传递参数的问题吧
    问问VC区的高手,做过这方面的应该比较多
      

  5.   

    不管你接不接打印机,只要存在lpt端口,就可以打开
    但是你可以通过对端口进行状态查询,来大概获知是否连接了设备如果你是要打开指定打印机的,则可以通过调用打印方面的函数,直接取得某个名字的打印机的DC
      

  6.   

    to littlegang
    很有道理,我在试验的时候,将虚拟打印机端口设置成LPT1,然后向端口输出数据,虚拟打印机会出现正在打印信息,这个时候再调用CreateFile时,就出现handle.IsInvalid=true,如果把打印任务清理了,handle.IsInvalid就会又变成false了.
      

  7.   

    还有一个问题,能够使用CreateFile打开一个虚拟端口吗?比如office2003自带的虚拟打印机默认所在的端口?还有我怎么才能得到一个设备所在的端口,比如打印机,知道了默认打印机,怎么才能知道他所在的端口呢?
      

  8.   

    添加虚拟打印机Microsoft Office Document Image Writer 控制面板→打印机和传真→添加打印机→下一步→选择“连接到此计算机的本地打印机”→取消勾选“自动检测并安装即插即用打印机”→下一步→“使用以下端口”中选择“Microsoft Document Imaging Writer Port(Local)”→下一步→厂商选择“Generic”→打印机选择“Generic/Text Only”→点击“下一步”直到完成。右击刚添加的打印机→属性→高级→“驱动程序”选“Microsoft Office Document Image Writer”→应用→常规→打印首选项→高级→“输出格式”选择“MDI”并勾选“压缩文档中的图像”→确定→确定。
      

  9.   

    调用CreateFile打开虚拟端口,死活不行,不明白怎么回事?使用CreateFile能够打开的端口,是不是必须物理存在的?
      

  10.   

    我调用CreateFile是来实现类似超市里面的那种打印,不换页,有多少数据打印多少,但是现在有些打印机是USB口的,不知道如何打开USB口,使用API函数OpenPrinter等来打开指定的打印机,然后向打印机发送,运行倒是没问题,但是打印效果不好办,字体特别大,而且打印20行就不动了,真是麻烦,不知道大家有什么好方法吗?
      

  11.   

    http://topic.csdn.net/u/20091104/13/0088ed54-e2cc-4975-b61f-f30fa2526677.html?23513
    相同的问题,解决了200分送上!!!!!
      

  12.   

    根据打印机名,直接输出到打印机就行了,不用考虑是不是LPT1端口。
      

  13.   


    添加引用
    System.Printing;System.Printing.LocalPrintServer.GetDefaultPrintQueue().QueuePort.Name
    如果端口是LPT1,返回 "LPT1:"
    如果是虚拟打印机,比如Microsoft XPS Document Writer,返回"XPSPort:"
    可以在控制面板里的默认打印机的右键属性的端口里对对看
      

  14.   

    已经解决了,使用了API函数来的
      

  15.   

    楼主想问一下你 如何判断pos机是否连接电源  
      

  16.   

    我调用CreateFile("LPT1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0).DangerousGetHandle()=-1
    但是调用handle.DangerousGetHandle()就不等于-1 这是怎么回事
      

  17.   

    LZ,我也是在CreateFile这里失败,请问你是怎么解决的呢?