执行到第二句时VB就异常退出。如果把另一个打印机设为默认值就没这种现象。真是奇怪啊。
    Call DocumentProperties(0&, hPrn, printerName, dm, dm, 0&)
    ln = DocumentProperties(Me.hwnd, hPrn, printerName, dm, dm, DM_OUT_BUFFER)

解决方案 »

  1.   

    参考:
    http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q180/6/45.asp&NoWebContent=1下面是DocumentProperties 的说明:DocumentProperties VB声明 
    Declare Function DocumentProperties& Lib "winspool.dll" Alias "DocumentPropertiesA" (ByVal hwnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, ByVal pDevModeOutput As Long, ByVal pDevModeInput As Long, ByVal fMode As Long) 
    说明 
    这是一个灵活的打印机配置控制函数。该函数定义了两个DEVMODE结构,可在创建一个设备场景时为单个应用程序改变打印机设置。甚至能在文档打印期间改变打印机设置 
    返回值 
    Long,由fMode字段的值决定。如下所示:
    若fMode为零,这个函数就返回DEVMODE结构的尺寸。注意这个结构可能比类型定义文件API32.TXT中规定的尺寸大
    若fMode设置了DM_IN_PROMPT标志,那么打印机设置对话框就会出现。在这种情况下,返回值将是常数IDOK 或 IDCANCEL——具体由用户关闭对话框时按下的按钮决定
    在其他任何情况下,该函数执行成功后会返回IDOK。而在任何情况下,如函数执行失败,都会返回一个负数 
    参数表 
    参数 类型及说明 
    hwnd Long,对话框父窗口的句柄。这通常是当前的活动窗体 
    hPrinter Long,一个已打开的打印机对象的句柄 
    pDeviceName String,打印机的名字 
    pDevModeOutput Long,指向一个DEVMODE数据结构的指针。请参考DocumentProperties运行模式表。注意这个指针必须引用一个足够大的缓冲区,它能同时容下专用打印机驱动程序数据,以及标准的DEVMODE结构 
    pDevModeInput Long,指向一个DEVMODE数据结构的指针。请参考DocumentProperties运行模式表 
    fMode Long,决定这个函数运作模式的一个标志。请参考DocumentProperties运行模式表 DocumentProperties运行模式表
     
    常数标志 运行模式 
    无 不使用pDevModeInput。pDevModeOutput可能为零。函数会返回由这两个参数引用的DEVMODE结构需要的大小 
    DM_IN_BUFFER pDevModeInput缓冲区应载入打印机驱动程序的新位置。在调用这个函数判断应使用结构中的哪些字段前,应设置结构的dmFields字段 
    DM_IN_PROMPT 显示出打印机设置对话框,以便用户指定输出时采用的打印机设置。如指定了DM_IN_BUFFER,那么在显示对话框前,输入缓冲区中指定的任何字段都会与当前的打印机DEVMODE结构合并起来 
    DM_OUT_BUFFER 令打印机设置信息输出到由pDevModeOutput参数指定的缓冲区。这些设置由两个输入标志决定,而且由此反映了原始的输入结构、当前的打印机设置以及用户在打印机设置对话框中作出的任何修改。如未指定这个标志,lpdmOutput参数就可以设为零