主頁 > 軟體工程 > 如何獲得列印份數?急求,紅包感謝啊

如何獲得列印份數?急求,紅包感謝啊

2020-09-16 01:15:47 軟體工程

Private Type PRINTER_DEFAULTS
        pDatatype As String
        pDevMode As Long
        DesiredAccess As Long
End Type

Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long

Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type

Private Type JOB_INFO_1
        JobId As Long
        pPrinterName As Long
        pMachineName As Long
        pUserName As Long
        pDocument As Long
        pDatatype As Long
        pStatus As Long
        Status As Long
        Priority As Long
        Position As Long
        TotalPages As Long
        PagesPrinted As Long
        Submitted As SYSTEMTIME
        dmCopies As Long
End Type

Private Const PRINTER_ACCESS_ADMINISTER = &H4

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200

Private Sub Command1_Click()
    Dim hPrinter        As Long
    Dim RetVal          As Long
    Dim pd              As PRINTER_DEFAULTS
    Dim lngCount        As Long
    
    Dim JI1()           As JOB_INFO_1
    Dim aJi1()          As Byte
    
    Dim dwBytesNeed     As Long
    Dim dwBytesRet      As Long
    
    Dim lngSize         As Long
    Dim JI_1             As JOB_INFO_1
    
    lngSize = Len(JI_1)
    pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
    RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
    ReDim aJi1(lngSize - 1)
    RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)
    
    If RetVal = 0 And dwBytesNeed = 0 Then
        GetAPIError Err.LastDllError
        Exit Sub
    End If
    
    If dwBytesNeed = 0 Then
        MsgBox "沒有列印任務!", vbInformation
        Exit Sub
    End If
    
    If dwBytesNeed > lngSize Then
        ReDim aJi1(dwBytesNeed - 1)
        RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
    End If
    
    ReDim JI1(1 To dwBytesRet)
    List1.Clear
    For lngCount = 1 To dwBytesRet
        Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
        List1.AddItem "列印任務" & lngCount
        List1.AddItem "JobID:" & JI1(lngCount).JobId
        List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
        List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
        List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
        List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
        List1.AddItem "pStatus:" & JI1(lngCount).pStatus
        List1.AddItem "Status:" & JI1(lngCount).Status
        List1.AddItem "Priority:" & JI1(lngCount).Priority
        List1.AddItem "Position:" & JI1(lngCount).Position
        List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
        List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
        List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
        List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
        List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
        List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
        List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
        List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
        List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
        List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
        List1.AddItem "copyies:" & Printer.Copies
    Next
    ClosePrinter (hPrinter)
End Sub

Public Function GetAPIError(ByVal API_ERROR As Long)
    Dim Lret As Long
    Dim M_Msg As String
    M_Msg = String(256, " ")
    Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
    If Lret <> 0 Then
       M_Msg = Trim(M_Msg)
       MsgBox M_Msg, , "API錯誤資訊"
    End If
End Function

'從給定的記憶體地址中獲得字串
Private Function GetStringFromMem(ByVal Addr As Long) As String
    Dim lngSize         As Long
    Dim bytStr()        As Byte
    Dim lngX            As Long
    
    '獲得字串的長度
    Call CopyMemory(lngSize, ByVal Addr - 4, 4)
    ReDim bytStr(lngSize / 2)
    Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
    GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function


uj5u.com熱心網友回復:

dmCopies

uj5u.com熱心網友回復:

dmCopies在哪里獲取呢?

uj5u.com熱心網友回復:

Private Type PRINTER_DEFAULTS
        pDatatype As String
        pDevMode As Long
        DesiredAccess As Long
End Type

Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long

Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type

Private Type JOB_INFO_1
        JobId As Long
        pPrinterName As Long
        pMachineName As Long
        pUserName As Long
        pDocument As Long
        pDatatype As Long
        pStatus As Long
        Status As Long
        Priority As Long
        Position As Long
        TotalPages As Long
        PagesPrinted As Long
        Submitted As SYSTEMTIME
        dmCopies As Long
End Type

Private Const PRINTER_ACCESS_ADMINISTER = &H4

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200

Private Sub Command1_Click()
    Dim hPrinter        As Long
    Dim RetVal          As Long
    Dim pd              As PRINTER_DEFAULTS
    Dim lngCount        As Long
    
    Dim JI1()           As JOB_INFO_1
    Dim aJi1()          As Byte
    
    Dim dwBytesNeed     As Long
    Dim dwBytesRet      As Long
    
    Dim lngSize         As Long
    Dim JI_1             As JOB_INFO_1
    
    lngSize = Len(JI_1)
    pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
    RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
    ReDim aJi1(lngSize - 1)
    RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)
    
    If RetVal = 0 And dwBytesNeed = 0 Then
        GetAPIError Err.LastDllError
        Exit Sub
    End If
    
    If dwBytesNeed = 0 Then
        MsgBox "沒有列印任務!", vbInformation
        Exit Sub
    End If
    
    If dwBytesNeed > lngSize Then
        ReDim aJi1(dwBytesNeed - 1)
        RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
    End If
    
    ReDim JI1(1 To dwBytesRet)
    List1.Clear
    For lngCount = 1 To dwBytesRet
        Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
        List1.AddItem "列印任務" & lngCount
        List1.AddItem "JobID:" & JI1(lngCount).JobId
        List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
        List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
        List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
        List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
        List1.AddItem "pStatus:" & JI1(lngCount).pStatus
        List1.AddItem "Status:" & JI1(lngCount).Status
        List1.AddItem "Priority:" & JI1(lngCount).Priority
        List1.AddItem "Position:" & JI1(lngCount).Position
        List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
        List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
        List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
        List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
        List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
        List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
        List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
        List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
        List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
        List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
'       List1.AddItem "copyies:" & Printer.Copies
        List1.AddItem "copyies:" & JI1(lngCount).dmCopies
    Next
    ClosePrinter (hPrinter)
End Sub

Public Function GetAPIError(ByVal API_ERROR As Long)
    Dim Lret As Long
    Dim M_Msg As String
    M_Msg = String(256, " ")
    Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
    If Lret <> 0 Then
       M_Msg = Trim(M_Msg)
       MsgBox M_Msg, , "API錯誤資訊"
    End If
End Function

'從給定的記憶體地址中獲得字串
Private Function GetStringFromMem(ByVal Addr As Long) As String
    Dim lngSize         As Long
    Dim bytStr()        As Byte
    Dim lngX            As Long
    
    '獲得字串的長度
    Call CopyMemory(lngSize, ByVal Addr - 4, 4)
    ReDim bytStr(lngSize / 2)
    Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
    GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function

uj5u.com熱心網友回復:

'       List1.AddItem "copyies:" & Printer.Copies
        List1.AddItem "copyies:" & JI1(lngCount).dmCopies
己按這個修改了。為什么任務里是列印4份,獲取得數是0呢?

uj5u.com熱心網友回復:

另外,我在另一臺電腦接列印機實際測驗,不管打幾份,dmCopies的值都是:1414397952
這是什么原因呢?

uj5u.com熱心網友回復:

不一定對,僅供參考:
Private Type PRINTER_DEFAULTS
        pDatatype As String
        pDevMode As Long
        DesiredAccess As Long
End Type

Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long

Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type

Private Type JOB_INFO_1
        JobId As Long
        pPrinterName As Long
        pMachineName As Long
        pUserName As Long
        pDocument As Long
        pDatatype As Long
        pStatus As Long
        Status As Long
        Priority As Long
        Position As Long
        TotalPages As Long
        PagesPrinted As Long
        Submitted As SYSTEMTIME
        'dmCopies As Long
End Type

Private Const PRINTER_ACCESS_ADMINISTER = &H4

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200

Private Sub Command1_Click()
    Dim hPrinter        As Long
    Dim RetVal          As Long
    Dim pd              As PRINTER_DEFAULTS
    Dim lngCount        As Long
    Dim n               As Long

    Dim JI1()           As JOB_INFO_1
    Dim aJi1()          As Byte

    Dim dwBytesNeed     As Long
    Dim dwBytesRet      As Long

    Dim lngSize         As Long
    Dim JI_1             As JOB_INFO_1

    lngSize = Len(JI_1)
    pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
    RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
    ReDim aJi1(lngSize - 1)
    RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)

    If RetVal = 0 And dwBytesNeed = 0 Then
        GetAPIError Err.LastDllError
        Exit Sub
    End If

    If dwBytesNeed = 0 Then
        MsgBox "沒有列印任務!", vbInformation
        Exit Sub
    End If

    If dwBytesNeed > lngSize Then
        ReDim aJi1(dwBytesNeed - 1)
        RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
    End If

    ReDim JI1(1 To dwBytesRet)
    List1.Clear
    'For lngCount = 1 To dwBytesRet
    n=0
    lngCount=1
    Do
        if lngSize * n > dwBytesRet then exit do
        Call CopyMemory(JI1(lngCount), aJi1(lngSize * n), lngSize)
        List1.AddItem "列印任務" & lngCount
        List1.AddItem "JobID:" & JI1(lngCount).JobId
        List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
        List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
        List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
        List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
        List1.AddItem "pStatus:" & JI1(lngCount).pStatus
        List1.AddItem "Status:" & JI1(lngCount).Status
        List1.AddItem "Priority:" & JI1(lngCount).Priority
        List1.AddItem "Position:" & JI1(lngCount).Position
        List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
        List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
        List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
        List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
        List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
        List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
        List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
        List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
        List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
        List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
        List1.AddItem "copyies:" & Printer.Copies
    'Next
    Loop
    ClosePrinter (hPrinter)
End Sub

Public Function GetAPIError(ByVal API_ERROR As Long)
    Dim Lret As Long
    Dim M_Msg As String
    M_Msg = String(256, " ")
    Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
    If Lret <> 0 Then
       M_Msg = Trim(M_Msg)
       MsgBox M_Msg, , "API錯誤資訊"
    End If
End Function

'從給定的記憶體地址中獲得字串
Private Function GetStringFromMem(ByVal Addr As Long) As String
    Dim lngSize         As Long
    Dim bytStr()        As Byte
    Dim lngX            As Long

    '獲得字串的長度
    Call CopyMemory(lngSize, ByVal Addr - 4, 4)
    ReDim bytStr(lngSize / 2)
    Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
    GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function

 
Copies 屬性
      

回傳或設定需要列印的份數。對于 Printer 物件,在設計時不可用。

語法

object.Copies [= number]

Copies 屬性語法包含下面部分:

部分 描述 
Object 物件運算式,其值是“應用于”串列中的一個物件。 
Number 數值運算式,指定需要列印的份數。該值必須是整型值。 


說明

對于“列印”對話框,該屬性回傳在“份數”框中用戶輸入的份數。如果設定 CommonDialog 控制元件的 cdlPDUseDevModeCopies 標志,則該屬性始侄訓傳 1。

對于 Printer 物件,對多份列印可能進行、也可能不進行核對,這取決于列印機驅動程式。可以將整個檔案或將每一頁列印多份。對于不支持核對的列印機,設定 Copies = 1,然后在程式中使用回圈,就可以將整個檔案列印多份。

注意 Printer 物件屬性的效果取決于列印機生產商提供的驅動程式。一些屬性設定可能不起作用,或幾個不同的屬性設定具有相同的結果。如果設定值超出可接受范圍,就會產生錯誤。更多的資訊,參閱有關驅動程式的生產商檔案。

uj5u.com熱心網友回復:

QQ:511606848 等待發紅包中……

uj5u.com熱心網友回復:

參考 7 樓 zhao4zhong1 的回復:
QQ:511606848 等待發紅包中……

你想得太天真了……

你用Printer.Copies肯定不對!
(我沒有列印機,只能“猜測分析”,也可能我的想法也不對)
這個“值”要么是“所有列印作業”的總份數,要么是在代碼中通過Printer物件操作的“當前作業”的列印份數。
肯定會不是列印佇列中某個特定作業的份數。

uj5u.com熱心網友回復:

我不是想得太天真,我是只會復制粘貼MSDN中的內容。
不象Chen8013經常目光焦距失準,連我復制粘貼MSDN中的內容都無視。

uj5u.com熱心網友回復:

Using a Print Dialog Box and Retrieving a Printer Device Context
The first step in printing involves setting up the printer and obtaining a printer DC. In the sample application, the File menu contains two options, Print and Print Setup. By selecting either option, the user can configure the printer. When the user selects the Print Setup option, the Print Setup dialog box is displayed and the user can select a printer, a page orientation, a paper size, and so on. When the user selects the Print option, the Print dialog box is displayed and the user can select a range of pages, a print quality, a number of copies, and so on. The user can also display the Print Setup dialog box by clicking the Setup push button.

The Print and Print Setup dialog boxes are both displayed by initializing the members of aPRINTDLG structure and calling thePrintDlg function. (For more information about displaying the Print Setup dialog box, seeCommon Dialog Box Library). In addition to retrieving user-specified data, PrintDlg can be used to obtain a printer DC by specifying the PD_RETURNDC value in the Flags member of the PRINTDLG structure. The following code sample shows how to intialize the members of the structure and to display the Print dialog box. 

// Initialize the PRINTDLG members. 
 
pd.lStructSize = sizeof(PRINTDLG); 
pd.hDevMode = (HANDLE) NULL; 
pd.hDevNames = (HANDLE) NULL; 
pd.Flags = PD_RETURNDC; 
pd.hwndOwner = hwnd; 
pd.hDC = (HDC) NULL; 
pd.nFromPage = 1; 
pd.nToPage = 1; 
pd.nMinPage = 0; 
pd.nMaxPage = 0; 
pd.nCopies = 1; 
pd.hInstance = (HANDLE) NULL; 
pd.lCustData = 0L; 
pd.lpfnPrintHook = (LPPRINTHOOKPROC) NULL; 
pd.lpfnSetupHook = (LPSETUPHOOKPROC) NULL; 
pd.lpPrintTemplateName = (LPSTR) NULL; 
pd.lpSetupTemplateName = (LPSTR)  NULL; 
pd.hPrintTemplate = (HANDLE) NULL; 
pd.hSetupTemplate = (HANDLE) NULL; 
 
// Display the PRINT dialog box. 
 
PrintDlg(&pd); 
 
 

uj5u.com熱心網友回復:

紅包一定有啊。搞定了一定發。我先按看看

uj5u.com熱心網友回復:

參考 8 樓 Chen8013 的回復:
Quote: 參考 7 樓 zhao4zhong1 的回復:

QQ:511606848 等待發紅包中……

你想得太天真了……

你用Printer.Copies肯定不對!
(我沒有列印機,只能“猜測分析”,也可能我的想法也不對)
這個“值”要么是“所有列印作業”的總份數,要么是在代碼中通過Printer物件操作的“當前作業”的列印份數。
肯定會不是列印佇列中某個特定作業的份數。


其實要求很簡單,得到總份數也行,我會限制列印佇列里只有一個任務。

uj5u.com熱心網友回復:

加點分加點分

uj5u.com熱心網友回復:

參考 7 樓 zhao4zhong1 的回復:
QQ:511606848 等待發紅包中……

應該是有效果的.我測驗了一下.
但不知道是數量太多還是什么的.會報錯.沒深入研究了

uj5u.com熱心網友回復:

參考 12 樓 hongzm 的回復:
Quote: 參考 8 樓 Chen8013 的回復:

Quote: 參考 7 樓 zhao4zhong1 的回復:

QQ:511606848 等待發紅包中……

你想得太天真了……

你用Printer.Copies肯定不對!
(我沒有列印機,只能“猜測分析”,也可能我的想法也不對)
這個“值”要么是“所有列印作業”的總份數,要么是在代碼中通過Printer物件操作的“當前作業”的列印份數。
肯定會不是列印佇列中某個特定作業的份數。


其實要求很簡單,得到總份數也行,我會限制列印佇列里只有一個任務。

那你就準備給趙4發紅包吧。

uj5u.com熱心網友回復:

參考 14 樓 qq574221329 的回復:
Quote: 參考 7 樓 zhao4zhong1 的回復:

QQ:511606848 等待發紅包中……

應該是有效果的.我測驗了一下.
但不知道是數量太多還是什么的.會報錯.沒深入研究了

你原來的代碼報錯的原因至少有兩個:
①MSDN中JOB_INFO_1結構后面沒有dmCopies,你無端添加一個,導致計算整個結構的大小    Dim JI_1             As JOB_INFO_1

    lngSize = Len(JI_1)
不對。

②For lngCount = 1 To dwBytesRet
        Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
這個回圈根本達不到每次取一個JOB_INFO_1結構的目的。

參考我最后給出的代碼是怎么做的。

uj5u.com熱心網友回復:

    n=0
    lngCount=1
    Do
        if lngSize * n > dwBytesRet then exit do
        Call CopyMemory(JI1(lngCount), aJi1(lngSize * n), lngSize)
        List1.AddItem "列印任務" & lngCount
        List1.AddItem "JobID:" & JI1(lngCount).JobId
        List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
        List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
        List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
        List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
        List1.AddItem "pStatus:" & JI1(lngCount).pStatus
        List1.AddItem "Status:" & JI1(lngCount).Status
        List1.AddItem "Priority:" & JI1(lngCount).Priority
        List1.AddItem "Position:" & JI1(lngCount).Position
        List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
        List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
        List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
        List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
        List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
        List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
        List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
        List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
        List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
        List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
        List1.AddItem "copyies:" & Printer.Copies
        n=n+1'★★★★★★注意這里原來少這一句
    'Next
    Loop

uj5u.com熱心網友回復:

Using a Print Dialog Box and Retrieving a Printer Device Context
The first step in printing involves setting up the printer and obtaining a printer DC. In the sample application, the File menu contains two options, Print and Print Setup. By selecting either option, the user can configure the printer. When the user selects the Print Setup option, the Print Setup dialog box is displayed and the user can select a printer, a page orientation, a paper size, and so on. When the user selects the Print option, the Print dialog box is displayed and the user can select a range of pages, a print quality, a number of copies, and so on. The user can also display the Print Setup dialog box by clicking the Setup push button.

The Print and Print Setup dialog boxes are both displayed by initializing the members of aPRINTDLG structure and calling thePrintDlg function. (For more information about displaying the Print Setup dialog box, seeCommon Dialog Box Library). In addition to retrieving user-specified data, PrintDlg can be used to obtain a printer DC by specifying the PD_RETURNDC value in the Flags member of the PRINTDLG structure. The following code sample shows how to intialize the members of the structure and to display the Print dialog box. 

// Initialize the PRINTDLG members. 
 
pd.lStructSize = sizeof(PRINTDLG); 
pd.hDevMode = (HANDLE) NULL; 
pd.hDevNames = (HANDLE) NULL; 
pd.Flags = PD_RETURNDC; 
pd.hwndOwner = hwnd; 
pd.hDC = (HDC) NULL; 
pd.nFromPage = 1; 
pd.nToPage = 1; 
pd.nMinPage = 0; 
pd.nMaxPage = 0; 
pd.nCopies = 1; 
pd.hInstance = (HANDLE) NULL; 
pd.lCustData = 0L; 
pd.lpfnPrintHook = (LPPRINTHOOKPROC) NULL; 
pd.lpfnSetupHook = (LPSETUPHOOKPROC) NULL; 
pd.lpPrintTemplateName = (LPSTR) NULL; 
pd.lpSetupTemplateName = (LPSTR)  NULL; 
pd.hPrintTemplate = (HANDLE) NULL; 
pd.hSetupTemplate = (HANDLE) NULL; 
 
// Display the PRINT dialog box. 
 
PrintDlg(&pd); 
 
 

uj5u.com熱心網友回復:

還是不行。我的天。再加分啊。我按代碼改了。printer.copies永遠是0,我把加的dmCopies也去掉了。

uj5u.com熱心網友回復:

參考 19 樓 hongzm 的回復:
還是不行。我的天。再加分啊。我按代碼改了。printer.copies永遠是0,我把加的dmCopies也去掉了。


說錯了。現在copies是永遠為1

uj5u.com熱心網友回復:

修改后的代碼。加一個form1,list1,command1就能運行

'Types Definition
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Const PRINTER_ACCESS_ADMINISTER = &H4
Private Const PRINTER_ACCESS_USE = &H8
Private Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type

Private Type PRINTER_DEFAULTS
        pDatatype As String
        pDevMode As DEVMODE
        DesiredAccess As Long
End Type

Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long

Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type

Private Type JOB_INFO_1
        JobId As Long
        pPrinterName As Long
        pMachineName As Long
        pUserName As Long
        pDocument As Long
        pDatatype As Long
        pStatus As Long
        Status As Long
        Priority As Long
        Position As Long
        TotalPages As Long
        PagesPrinted As Long
        Submitted As SYSTEMTIME
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200

Private Sub Command1_Click()
    Dim hPrinter        As Long
    Dim RetVal          As Long
    Dim pd              As PRINTER_DEFAULTS
    Dim lngCount        As Long
    
    Dim JI1()           As JOB_INFO_1
    Dim aJi1()          As Byte
    
    Dim dwBytesNeed     As Long
    Dim dwBytesRet      As Long
    
    Dim lngSize         As Long
    Dim JI_1             As JOB_INFO_1
    
    lngSize = Len(JI_1)
    pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
    RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
    ReDim aJi1(lngSize - 1)
    RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)
    
    If RetVal = 0 And dwBytesNeed = 0 Then
        GetAPIError Err.LastDllError
        Exit Sub
    End If
    
    If dwBytesNeed = 0 Then
        MsgBox "沒有列印任務!", vbInformation
        Exit Sub
    End If
    
    If dwBytesNeed > lngSize Then
        ReDim aJi1(dwBytesNeed - 1)
        RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
    End If
    
    ReDim JI1(1 To dwBytesRet)
    List1.Clear
    'For lngCount = 1 To dwBytesRet
n = 0
lngCount = 1
Do
    If lngSize * n > dwBytesRet Then Exit Do
    Call CopyMemory(JI1(lngCount), aJi1(lngSize * n), lngSize)
        'Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
        List1.AddItem "列印任務" & lngCount
        List1.AddItem "JobID:" & JI1(lngCount).JobId
        List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
        List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
        List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
        List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
        List1.AddItem "pStatus:" & JI1(lngCount).pStatus
        List1.AddItem "Status:" & JI1(lngCount).Status
        List1.AddItem "Priority:" & JI1(lngCount).Priority
        List1.AddItem "Position:" & JI1(lngCount).Position
        List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
        List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
        List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
        List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
        List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
        List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
        List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
        List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
        List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
        List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
        List1.AddItem "copies:" & Printer.Copies
        'List1.AddItem "dmCopies:" & pd.pDevMode.dmCopies
    n = n + 1 '★★★★★★注意這里原來少這一句
Loop
    'Next
    ClosePrinter (hPrinter)
End Sub

Public Function GetAPIError(ByVal API_ERROR As Long)
    Dim Lret As Long
    Dim M_Msg As String
    M_Msg = String(256, " ")
    Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
    If Lret <> 0 Then
       M_Msg = Trim(M_Msg)
       MsgBox M_Msg, , "API錯誤資訊"
    End If
End Function

'從給定的記憶體地址中獲得字串
Private Function GetStringFromMem(ByVal Addr As Long) As String
    Dim lngSize         As Long
    Dim bytStr()        As Byte
    Dim lngX            As Long
    
    '獲得字串的長度
    Call CopyMemory(lngSize, ByVal Addr - 4, 4)
    ReDim bytStr(lngSize / 2)
    Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
    GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function


uj5u.com熱心網友回復:

typedef struct _JOB_INFO_2 { // ji2

DWORD JobId;

LPTSTR pPrinterName;

LPTSTR pMachineName;

LPTSTR pUserName;

LPTSTR pDocument;

LPTSTR pNotifyName;

LPTSTR pDatatype;

LPTSTR pPrintProcessor;

LPTSTR pParameters;

LPTSTR pDriverName;

LPDEVMODE pDevMode;

LPTSTR pStatus;

PSECURITY_DESCRIPTOR pSecurityDescriptor;

DWORD Status;

DWORD Priority;

DWORD Position;

DWORD StartTime;

DWORD UntilTime;

DWORD TotalPages;

DWORD Size;

SYSTEMTIME Submitted;

DWORD Time;

DWORD PagesPrinted ;

} JOB_INFO_2;

應該是取得這個結構,  某層專家那就是扯
他不知道哪取 dmcopies, 然后楞扯到 printer 去, lz要的應該是列印任務的屬性, 是事中或事后狀態, 他扯的是事前狀態,所以無限 1...

這句是對的:  List1.AddItem "dmCopies:" & pd.pDevMode.dmCopies
但這個devmode 應該先 
 addrdev =  globallock (pd.pdevmode)
copymemory mydevmode, byval addrdev,len(mydevmode)
然后取 mydevmode.dmcopies
再 globalunlock pd.pdevmode
globalfree pd.pdevmode

關于 devmode 內容怎么讀可以參照下面代碼, enumjob 那一步你自己百度吧


Sub GetSystemDefaultPrinter()
    
    Dim pd                  As PrinterDlg
    Dim pps                 As PrinterPageSetupDlg
    
    pd.lStructSize = Len(pd)
    pd.flags = PD_RETURNDC Or PD_RETURNDEFAULT
    
    If PrintDlg(pd) Then
        PG.HDC_Printer = pd.hdc
        
        Dim hGlobalData         As Long
    
        '// 鎖定臨時空間, 獲取驅動配置資訊
        hGlobalData = GlobalLock(ByVal pd.hDevMode)
        CopyMemory PG.dev_dlgMode, ByVal hGlobalData, Len(PG.dev_dlgMode)
        GlobalUnlock (hGlobalData)
        GlobalFree (pd.hDevMode)
        
        '// 鎖定臨時空間, 獲取驅動,設備資訊
        hGlobalData = GlobalLock(ByVal pd.hDevNames)
        CopyMemory PG.dev_dlgName, ByVal hGlobalData, Len(PG.dev_dlgName)
        GlobalUnlock (hGlobalData)
        GlobalFree (pd.hDevNames)
        
        Dim mulbits()       As Byte
        Dim i               As Long
        ReDim mulbits(PG.dev_dlgName.wDriverOffset - 1)
        CopyMemory mulbits(0), PG.dev_dlgName.extra(0), PG.dev_dlgName.wDriverOffset
        PG.dev_DriveName = StrConv(mulbits, vbUnicode)
        
        i = lstrlenByte(PG.dev_dlgName.extra(PG.dev_dlgName.wDriverOffset + 2))
        ReDim mulbits(i - 1)
        CopyMemory mulbits(0), PG.dev_dlgName.extra(PG.dev_dlgName.wDriverOffset + 2), i
        PG.dev_PrinterName = StrConv(mulbits, vbUnicode)
        
        '// 獲取默認列印機的列印配置
        pps.lStructSize = Len(pds)
        pps.flags = PSD_INHUNDREDTHSOFMILLIMETERS Or PSD_RETURNDEFAULT
        
        If PageSetupDlgX(pps) Then
            
            '// 鎖定臨時空間, 獲取驅動配置資訊
            hGlobalData = GlobalLock(ByVal pps.hDevMode)
            CopyMemory PG.dev_dlgMode, ByVal hGlobalData, Len(PG.dev_dlgMode)
            
            ResetDC PG.HDC_Printer, hGlobalData
            
            GlobalUnlock (hGlobalData)
            GlobalFree (pps.hDevMode)
            
            '// 獲取列印機解析度, 每英寸內像素量
            PG.PrinterResolveX = GetDeviceCaps(PG.HDC_Printer, LOGPIXELSX)
            PG.PrinterResolveY = GetDeviceCaps(PG.HDC_Printer, LOGPIXELSY)
            
            '// 轉換列印機默認邊距度量單位為螢屏邏輯像素
            PG.dev_RectMargin = pds.rtMargin
            PG.dev_RectMargin.Left = mmeterPerPixelX(PG.dev_RectMargin.Left \ 100)
            PG.dev_RectMargin.Right = mmeterPerPixelX(PG.dev_RectMargin.Right \ 100)
            PG.dev_RectMargin.Top = mmeterPerPixelX(PG.dev_RectMargin.Top \ 100)
            PG.dev_RectMargin.bottom = mmeterPerPixelX(PG.dev_RectMargin.bottom \ 100)
            
            '// 設定列印機視圖范圍度量單位為像素
            SetMapMode PG.HDC_Printer, MM_ANISOTROPIC
            
            '// 設定列印機設備視窗范圍, 視窗設定螢屏解析度
            SetWindowExtEx PG.HDC_Printer, PG.ScreenResolveX, PG.ScreenResolveY, ByVal 0&
            SetWindowOrgEx PG.HDC_Printer, 0, 0, ByVal 0&
    
            '// 設定列印機設備視圖范圍, 設定為縮放解析度,系統自動計算為比例
            SetViewportExtEx PG.HDC_Printer, PG.PrinterResolveX, PG.PrinterResolveY, ByVal 0&
            SetViewportOrgEx PG.HDC_Printer, 0, 0, ByVal 0&
            '// 以上api: SetWindowExtEx ,SetViewportExtEx , 也就是說以 WindowExt 設定的視圖范圍, 顯示以 ViewPort 設定的視圖范圍
            
            '// 獲取設備物理尺寸, 以像素為單位
            PG.dev_PaperSize.x = GetDeviceCaps(PG.HDC_Printer, HORZRES)
            PG.dev_PaperSize.y = GetDeviceCaps(PG.HDC_Printer, VERTRES)
            
            '// 物理尺寸決議為邏輯尺寸
            DPtoLP PG.HDC_Printer, PG.dev_PaperSize, 1
            
            
            
        End If
    End If
    
End Sub

uj5u.com熱心網友回復:

好象22樓代碼沒用18#回復中紅色文字標注的內容相關技術似的。
好象孫猴子翻出如來的手掌心似的。

uj5u.com熱心網友回復:

你算如來佛? 百度搜了點東西, 就敢直接拿上來給別人用 

uj5u.com熱心網友回復:

參考 24 樓 PctGL 的回復:
你算如來佛? 百度搜了點東西, 就敢直接拿上來給別人用 

現代中國人的能力差別很大程度上體現在會不會合理高效地使用百度上。

uj5u.com熱心網友回復:

我再來圍觀一下。

uj5u.com熱心網友回復:

參考 16 樓 zhao4zhong1 的回復:
Quote: 參考 14 樓 qq574221329 的回復:

Quote: 參考 7 樓 zhao4zhong1 的回復:

QQ:511606848 等待發紅包中……

應該是有效果的.我測驗了一下.
但不知道是數量太多還是什么的.會報錯.沒深入研究了

你原來的代碼報錯的原因至少有兩個:
①MSDN中JOB_INFO_1結構后面沒有dmCopies,你無端添加一個,導致計算整個結構的大小    Dim JI_1             As JOB_INFO_1

    lngSize = Len(JI_1)
不對。

②For lngCount = 1 To dwBytesRet
        Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
這個回圈根本達不到每次取一個JOB_INFO_1結構的目的。

參考我最后給出的代碼是怎么做的。



我只是一個路過的.....我目前用不到這個.........趙老師回復錯樓層了吧....

uj5u.com熱心網友回復:

救命啊,再加點分。我太菜了,我怎么改都不行。誰能幫忙修改下我的代碼啊。救命,再加點分。搞定了不嫌棄的話。紅包一定的。救命啊

uj5u.com熱心網友回復:

http://bbs.csdn.net/topics/50006067

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/51391.html

標籤:數據庫(包含打印 安裝 報表)

上一篇:自繪頂級選單加入END 結束程式崩潰

下一篇:如何為combobox下拉值切換datagridview中指定資料庫表

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more