VB断点拷贝大文件(WIN7系统需要更改某个API函数,具体我也忘了)

小弟以前租碟在电脑上看VCD,有时候拷贝经典的影片到硬盘上可惜碰到比较粗糙的碟子就很难拷贝过去,因此编了个断点拷贝文件的程序。本程序用于拷贝大文件,并可在旧文件上接着拷贝本程序能在无法读取数据的情况下复制空白数据并跳过坏数据区接着拷贝,专门对付烂盘.
本程序特别适合在恶劣的环境下拷贝大文件,比如拷盘,在网络中拷大文件等。
本程序是一个VB程序,包括5个文件,主窗口为 frmCopy 
使用了 Microsoft Common Dialog Control6.0 和
Micorsoft Windows Common Controls 6.0 两个控件库
拷贝文件使用了Win32API,速度比较快。

###############################################################################
      frmCopy.frm  内容
      
###############################################################################
VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
Begin VB.Form frmCopy 
   Caption         =   "断点拷贝"
   ClientHeight    =   3555
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   9135
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   ScaleHeight     =   3555
   ScaleWidth      =   9135
   StartUpPosition =   3  '窗口缺省
   Begin VB.TextBox TextStart 
      Height          =   300
      Left            =   6330
      TabIndex        =   17
      Text            =   "-1"
      Top             =   735
      Width           =   1410
   End
   Begin VB.PictureBox picStatus 
      Appearance      =   0  'Flat
      BackColor       =   &H80000005&
      ForeColor       =   &H80000008&
      Height          =   195
      Left            =   75
      ScaleHeight     =   165
      ScaleWidth      =   150
      TabIndex        =   14
      Top             =   3075
      Width           =   180
   End
   Begin VB.CheckBox chkFillData 
      Caption         =   "遇到错误时自动填充空白数据"
      Height          =   225
      Left            =   6090
      TabIndex        =   13
      Top             =   405
      Value           =   1  'Checked
      Width           =   2670
   End
   Begin VB.CheckBox chkShutdown 
      Caption         =   "完成任务后关机"
      Height          =   315
      Left            =   6090
      TabIndex        =   12
      Top             =   45
      Width           =   1680
   End
   Begin VB.CommandButton cmdCopy 
      Caption         =   "开始拷贝(&S)"
      Height          =   360
      Left            =   6225
      TabIndex        =   10
      Top             =   2535
      Width           =   1170
   End
   Begin VB.CommandButton cmdStop 
      Caption         =   "停止"
      Height          =   360
      Left            =   6255
      TabIndex        =   9
      Top             =   3015
      Width           =   1170
   End
   Begin MSComctlLib.ProgressBar myProc 
      Height          =   360
      Left            =   270
      TabIndex        =   7
      Top             =   2985
      Width           =   5385
      _ExtentX        =   9499
      _ExtentY        =   635
      _Version        =   393216
      Appearance      =   1
      Scrolling       =   1
   End
   Begin MSComDlg.CommonDialog dlgFile 
      Left            =   5265
      Top             =   1395
      _ExtentX        =   847
      _ExtentY        =   847
      _Version        =   393216
      CancelError     =   -1  'True
   End
   Begin VB.CommandButton cmdTo 
      Caption         =   "..."
      Height          =   345
      Left            =   5235
      TabIndex        =   5
      Top             =   1005
      Width           =   510
   End
   Begin VB.CommandButton cmdFrom 
      Caption         =   "..."
      Height          =   375
      Left            =   5250
      TabIndex        =   4
      Top             =   270
      Width           =   510
   End
   Begin VB.TextBox textTo 
      Height          =   345
      Left            =   975
      TabIndex        =   3
      Top             =   1005
      Width           =   4245
   End
   Begin VB.TextBox textFrom 
      Height          =   375
      Left            =   975
      TabIndex        =   1
      Top             =   270
      Width           =   4260
   End
   Begin VB.Label Label3 
      AutoSize        =   -1  'True
      BackStyle       =   0  'Transparent
      Caption         =   "从                 KB处开始拷贝"
      Height          =   180
      Left            =   6090
      TabIndex        =   16
      Top             =   780
      Width           =   2790
   End
   Begin VB.Label lblBlank 
      BackStyle       =   0  'Transparent
      Caption         =   "空白数据"
      Height          =   180
      Left            =   285
      TabIndex        =   15
      Top             =   2760
      Width           =   5070
   End
   Begin VB.Label lblSpeed 
      BackStyle       =   0  'Transparent
      Caption         =   "速度"
      Height          =   180
      Left            =   285
      TabIndex        =   11
      Top             =   2475
      Width           =   5070
   End
   Begin VB.Label lblTotal 
      BackStyle       =   0  'Transparent
      Caption         =   "总计"
      Height          =   180
      Left            =   285
      TabIndex        =   8
      Top             =   1890
      Width           =   5070
   End
   Begin VB.Label lblInfo 
      BackStyle       =   0  'Transparent
      Caption         =   "状态"
      Height          =   180
      Left            =   285
      TabIndex        =   6
      Top             =   2175
      Width           =   5070
   End
   Begin VB.Label Label2 
      AutoSize        =   -1  'True
      Caption         =   "目标文件:"
      Height          =   180
      Left            =   105
      TabIndex        =   2
      Top             =   1050
      Width           =   810
   End
   Begin VB.Label Label1 
      AutoSize        =   -1  'True
      Caption         =   "源文件:"
      Height          =   180
      Left            =   135
      TabIndex        =   0
      Top             =   315
      Width           =   630
   End
End
Attribute VB_Name = "frmCopy"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff AsOFSTRUCT, ByVal wStyle As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
'Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByVal lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long

Private Declare Function StrFormatByteSize Lib "shlwapi" Alias _
"StrFormatByteSizeA" (ByVal dw As Long, ByVal pszBuf As String, ByRef _
cchBuf As Long) As String

'Private Type OVERLAPPED
'        Internal As Long
'        InternalHigh As Long
'        offset As Long
'        OffsetHigh As Long
'        hEvent As Long
'End Type
Private Const OFS_MAXPATHNAME = 128
Private Type OFSTRUCT
        cBytes As Byte
        fFixedDisk As Byte
        nErrCode As Integer
        Reserved1 As Integer
        Reserved2 As Integer
        szPathName(OFS_MAXPATHNAME) As Byte
End Type
Private Const OF_CREATE = &H1000
Private Const OF_WRITE = &H1
Private Const OF_READ = &H0
Private Const FILE_END = 2
Private Const FILE_BEGIN = 0
Private bolStop     As Boolean
Private bolReady    As Boolean
Private myCount     As clsCount
Private myIni       As clsIniFile
Private bolUnload   As Boolean
Private Sub cmdCopy_Click()
    Call SetControl(True)
    Call CopyFile
    Call SetControl(False)
    If chkShutdown.Value = 1 Then
        dlgShutDown.Show vbModal
    End If
End Sub

Private Sub cmdFrom_Click()
    On Error Resume Next
    dlgFile.FileName = textFrom.Text
    dlgFile.ShowOpen
    If Err.Number = 0 Then
        textFrom.Text = dlgFile.FileName
    End If
    On Error GoTo 0
End Sub
Private Sub cmdStop_Click()
    Call SetControl(False)
End Sub
Private Sub cmdTo_Click()
    On Error Resume Next
    dlgFile.FileName = textTo.Text
    dlgFile.ShowOpen
    If Err.Number = 0 Then
        textTo.Text = dlgFile.FileName
    End If
    lblInfo.Enabled = True
    On Error GoTo 0
    
End Sub
Private Sub Form_Load()
    Set myCount = New clsCount
    Set myIni = New clsIniFile
    myIni.IniFileName = "Copy.ini"
    myIni.CurrentSection = "Copy"
    textFrom.Text = myIni.IniString("From")
    textTo.Text = myIni.IniString("To")
    bolStop = False
    bolReady = True
    bolUnload = True
    Call SetControl(False)
End Sub
Private Sub SetControl(bolCopying As Boolean)
    Dim myCtl As Control
    On Error Resume Next
    For Each myCtl In Controls
        myCtl.Enabled = Not bolCopying
        If TypeOf myCtl Is Label Then
            myCtl.Enabled = True
        End If
    Next myCtl
    cmdStop.Enabled = bolCopying
    bolStop = Not bolCopying
End Sub
Private Sub CopyFile()
    Dim lngFrom     As Long
    Dim lngTo       As Long
    Const c_BufSize As Long = 8 * 1024
    Dim myResult    As OFSTRUCT
    'Dim myOverLapped    As OVERLAPPED
    Dim lngTotal    As Long
    Dim lngCurrent  As Long
    Dim lngCopy     As Long
    Dim buf(0 To c_BufSize - 1) As Byte
    Dim lCount      As Long
    Dim lBlankCount As Long
    Dim strRate     As String
    Dim lStart      As Long
    bolReady = False
    On Error Resume Next
    
    On Error GoTo CopyErr
    lngTotal = FileLen(textFrom.Text)
    lblTotal.Caption = "共计 " & VBStrFormatByteSize(lngTotal)
    lngFrom = OpenFile(textFrom.Text, myResult, OF_READ)
    
    'If myResult.nErrCode > 0 Then
    '    Err.Raise 0, , "打开源文件错误,文件:" & textFrom.Text & "  错误号:" & myResult.nErrCode
    'End If
    If Dir(textTo.Text) = "" Then
        lngTo = OpenFile(textTo.Text, myResult, OF_CREATE)
        lngCurrent = 0
    Else
        lngCurrent = FileLen(textTo.Text)
        lStart = CLng(TextStart.Text) * 1024
        lngTo = OpenFile(textTo.Text, myResult, OF_WRITE)
        If lStart > 0 And lngCurrent > lStart Then
            SetFilePointer lngTo, lStart, 0, FILE_BEGIN
            lngCurrent = lStart
        Else
            Call SetFilePointer(lngTo, 0, 0, FILE_END)
        End If
    End If
    'If myResult.nErrCode > 0 Then
    '    Err.Raise 0, , "打开目标文件错误,文件:" & textFrom.Text & "  错误号:" & myResult.nErrCode
    'End If
    If lngCurrent >= lngTotal Then
        bolStop = True
    Else
        If lngCurrent > 0 Then
            SetFilePointer lngFrom, lngCurrent, 0, FILE_BEGIN
        End If
        bolStop = False
    End If
    myCount.Clear
    bolUnload = False
    lBlankCount = 0
    lblBlank.Caption = ""
    Do
        If bolStop = True Then GoTo CopyExit
        'picStatus.BackColor = Me.BackColor
        ReadFile lngFrom, VarPtr(buf(0)), c_BufSize, lngCopy, 0
        If lngCopy <> c_BufSize And lngCurrent <> lngTotal And lngCurrent + lngCopy <> lngTotal Then
            If chkFillData.Value = 1 Then
                For lCount = 0 To c_BufSize - 1
                    buf(lBlankCount) = &HFF
                Next lCount
                lBlankCount = lBlankCount + 1
                lngCopy = lngTotal - lngCurrent
                lblBlank.Caption = "填充空白数据:" & VBStrFormatByteSize(lBlankCount * c_BufSize)
                If lngCopy > c_BufSize Then
                    lngCopy = c_BufSize
                End If
                picStatus.BackColor = vbRed
                SetFilePointer lngFrom, lngCurrent + lngCopy, 0, FILE_BEGIN
            Else
                Exit Do
            End If
            
        Else
            picStatus.BackColor = vbGreen
        End If
        WriteFile lngTo, VarPtr(buf(0)), lngCopy, lngCopy, 0
        lngCurrent = lngCurrent + lngCopy
        myCount.Count lngCopy
        '** 设置进度信息
        strRate = Format(lngCurrent / lngTotal, "0.00%")
        lblInfo.Caption = "目前完成 " _
                & VBStrFormatByteSize(lngCurrent) & "(" & strRate & ")"
        If myCount.NewSpeed Then
            lblSpeed.Caption = "速度:" & VBStrFormatByteSize(myCount.Speed) & "/秒"
        End If
        Me.Caption = strRate
        
        If lngCurrent * 100# / lngTotal > 100 Then
            myProc.Value = 100
        Else
            myProc.Value = lngCurrent * 100# / lngTotal
        End If
        DoEvents
    Loop Until lngCopy <> c_BufSize
CopyExit:
    CloseHandle lngFrom
    CloseHandle lngTo
    lblInfo.Caption = "共拷贝 " & VBStrFormatByteSize(lngCurrent) & ",所花时间 " &myCount.TotalTickCount & " 毫秒"
    lblSpeed.Caption = "平均速度: " & VBStrFormatByteSize(myCount.TotalSpeed) & " 字节/秒"
    myProc.Value = 0
    bolReady = True
    If bolUnload = True Then
        Unload Me
    End If
    bolUnload = True
    On Error GoTo 0
    Exit Sub
CopyErr:
    MsgBox "系统错误:" & Err.Description, vbCritical
   'Resume
    If lngFrom <> 0 Then CloseHandle lngFrom
    If lngTo <> 0 Then CloseHandle lngTo
    bolReady = True
    If bolUnload = True Then
        Unload Me
    End If
    On Error GoTo 0
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If bolUnload = False Then
        bolUnload = True
        bolStop = True
        Cancel = True
    Else
        myIni.IniString("From") = textFrom.Text
        myIni.IniString("To") = textTo.Text
        Set myCount = Nothing
        Set myIni = Nothing
        End
    End If
End Sub
Private Function VBStrFormatByteSize(ByVal lngSize As Long) As String
    Dim strSize As String * 128
    Dim strData As String
    Dim lPos        As Long
    StrFormatByteSize lngSize, strSize, 128
    lPos = InStr(1, strSize, Chr$(0))
    strData = Left$(strSize, lPos - 1)
    If lngSize > 1024 Then
        strData = lngSize & "字节(" & strData & ")"
    End If
    VBStrFormatByteSize = strData
End Function
###############################################################################
      dlgShutDown.frm  内容
      
###############################################################################
VERSION 5.00
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
Begin VB.Form dlgShutDown 
   BorderStyle     =   3  'Fixed Dialog
   Caption         =   "关机"
   ClientHeight    =   3195
   ClientLeft      =   2760
   ClientTop       =   3750
   ClientWidth     =   6735
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   3195
   ScaleWidth      =   6735
   ShowInTaskbar   =   0   'False
   StartUpPosition =   2  '屏幕中心
   Begin VB.Timer myTimer 
      Interval        =   1000
      Left            =   6075
      Top             =   915
   End
   Begin MSComctlLib.ProgressBar myProc 
      Height          =   390
      Left            =   180
      TabIndex        =   2
      Top             =   1980
      Width           =   6120
      _ExtentX        =   10795
      _ExtentY        =   688
      _Version        =   393216
      Appearance      =   1
   End
   Begin VB.CommandButton cmdCancel 
      Caption         =   "取消"
      Height          =   375
      Left            =   4950
      TabIndex        =   1
      Top             =   2640
      Width           =   1215
   End
   Begin VB.CommandButton cmdShutDown 
      Caption         =   "关机"
      Height          =   375
      Left            =   3510
      TabIndex        =   0
      Top             =   2640
      Width           =   1215
   End
   Begin VB.Label lblTitle 
      Caption         =   "Label1"
      BeginProperty Font 
         Name            =   "宋体"
         Size            =   12
         Charset         =   134
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   390
      Left            =   480
      TabIndex        =   3
      Top             =   795
      Width           =   5190
   End
End
Attribute VB_Name = "dlgShutDown"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long)As Long
Private Const EWX_SHUTDOWN = 1
Private Const cTimeCount As Long = 15
Private lngCount As Long
Private Sub cmdCancel_Click()
    Unload Me
End Sub
Private Sub cmdShutDown_Click()
    ExitWindowsEx EWX_SHUTDOWN, 0
End Sub
Private Sub Form_Load()
    Dim myWin As New clsWindow
    myWin.hwnd = Me.hwnd
    myWin.TopMost = True
    Set myWin = Nothing
    lngCount = cTimeCount
    myProc.Max = cTimeCount
    myProc.Min = 0
    Call myTimer_Timer
End Sub
Private Sub myTimer_Timer()
    lngCount = lngCount - 1
    myProc.Value = cTimeCount - lngCount
    lblTitle.Caption = lngCount & "秒后关机"
    If lngCount = 0 Then
        ExitWindowsEx EWX_SHUTDOWN, 0
        lngCount = cTimeCount
    End If
End Sub

###############################################################################
      mdlCopy.bas  内容
      
###############################################################################
Attribute VB_Name = "mdlCopy"
Option Explicit
Public Const c_NullID As Long = -9999

###############################################################################
      clsCount.cls  内容
      
###############################################################################
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsCount"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
'******************************************************************************
'**
'**     用于计算速度的类模块
'**
'** 该类模块设定一个计数器,由程序不断的累计数据,并根据所花时间计算数据
'**
'** 编制: 袁永福
'** 时间: 2002-4-2
'**
'******************************************************************************
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private lngCountStart   As Long
Private lngCountCurrent As Long
Private lngCountLast    As Long
Private lngSpeed        As Long
Private lngTickStart    As Long
Private lngTickCurrent  As Long
Private lngTickLast     As Long
'Public StopCount        As Boolean
'** 获得计数数据 **************************************************************
    '** 累计初始值
    Public Property Get CountStart() As Long
        CountStart = lngCountStart
    End Property
    '** 累计终止值
    Public Property Get CountEnd() As Long
        CountEnd = lngCountCurrent
    End Property
    '** 累计总的速度
    Public Property Get TotalSpeed() As Long
        If lngTickCurrent = lngTickStart Then
            TotalSpeed = 0
        Else
            TotalSpeed = (lngCountCurrent - lngCountStart) / ((lngTickCurrent - lngTickStart) / 1000)
        End If
    End Property
    '** 累计所花毫秒数
    Public Property Get TotalTickCount() As Long
        TotalTickCount = lngTickCurrent - lngTickStart
    End Property
'** 清除所有数据 **************************************************************
    Public Sub Clear()
        lngCountStart = 0
        lngCountCurrent = 0
        lngCountLast = 0
        
        lngSpeed = 0
        
        lngTickStart = GetTickCount()
        lngTickCurrent = lngTickStart
        lngTickLast = lngTickStart
        
        'StopCount = False
    End Sub
'** 设置累计基数
    Public Property Let CountStart(ByVal lStart As Long)
        lngCountStart = lStart
        lngCountCurrent = lStart
    End Property
'** 累加数据 **
    Public Sub Count(Optional ByVal lCount As Long = 1)
        lngCountCurrent = lngCountCurrent + lCount
        lngTickCurrent = GetTickCount()
    End Sub
    
'** 获得速度 **
    Public Property Get Speed() As Long
        'lngTickCurrent = GetTickCount()
        If lngTickLast = lngTickCurrent Then
            Speed = lngSpeed
        Else
            Speed = (lngCountCurrent - lngCountLast) / ((lngTickCurrent - lngTickLast) / 1000)
            lngSpeed = Speed
            lngTickLast = lngTickCurrent
            lngCountLast = lngCountCurrent
        End If
    End Property
    
'** 数据是否是最新更新的 **
    Public Property Get NewSpeed() As Boolean
        Dim bolNew As Boolean
        If lngTickCurrent > lngTickLast + 1000 Then
            bolNew = True
        Else
            bolNew = False
        End If
        NewSpeed = bolNew
    End Property
    
'** 本模块结束 ****************************************************************

###############################################################################
      clsIniFile.cls  内容
      
###############################################################################
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsIniFile"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
'******************************************************************************
'**
'**             INI文件操作类模块
'**
'** 本模块定义了INI文件读写的API操作及中间的数据转化
'**
'** 编制: 袁永福
'** 时间: 2001-12-11
'**
'** 该模块在配第5版补丁的VB6.0企业版/Windows98第二版的环境下调试通过
'**
'******************************************************************************
'** 定义变量 **
    Public IniFileName          As String       ' 当前的配置文件名
    Public CurrentSection       As String       ' 当前的类别
    Public CurrentData          As String       ' 当前值
'    Public AutoSave             As Boolean      ' 是否自动保存
'** 声明API函数 **
    Private Declare Function GetPrivateProfileString& Lib "kernel32" Alias _
    "GetPrivateProfileStringA" _
            (ByVal lpAppName$, _
             ByVal lpKeyName$, _
             ByVal lpDefault$, _
             ByVal lpRetStr$, _
             ByVal nSize&, _
             ByVal lpFileName$)
    Private Declare Function GetPrivateProfileInt& Lib "kernel32" Alias _
    "GetPrivateProfileIntA" _
            (ByVal lpAppName$, _
             ByVal lpKeyName$, _
             ByVal nDefault&, _
             ByVal lpFileName$)
    Private Declare Function WritePrivateProfileString& Lib "kernel32" Alias _
    "WritePrivateProfileStringA" _
            (ByVal lpAppName$, _
             ByVal lpKeyName$, _
             ByVal lpString$, _
             ByVal lpFileName$)
'******************************************************************************
'*************      定义读写配置文件的接口函数          ***********************
'******************************************************************************
        
        '** 从系统配置文件中读取相应配置字符串
        Public Function GetIniStr(ByVal sSection As String, _
                                  ByVal sKey As String, _
                                  Optional ByVal sDefault As String = "") As String
            Dim sReturnStr As String
            Dim lTemp As Long
        
            sReturnStr = Space(1024)
            '此处虽然设定在读不成功时为NONE,但绝对不会为NONE(webpaul)
            GetPrivateProfileString sSection, sKey, sDefault, _
                                    sReturnStr, 1024, IniFileName
        
            sReturnStr = Trim$(sReturnStr)
            lTemp = LenB(sReturnStr)
            If lTemp > 0 Then
                sReturnStr = Trim(MidB(sReturnStr, 1, lTemp - 1))
            End If
        
            If sReturnStr = "" Then
                sReturnStr = sDefault
            End If
            GetIniStr = sReturnStr
        End Function
        
        '** 从系统配置文件中读取相应配置数值
        Public Function GetIniNum(ByVal sSection As String, _
                                  ByVal sKey As String, _
                                  Optional ByVal lDefault As Long = c_NullID) As Long
        
            Dim lReturn As Long
        
            lReturn = GetPrivateProfileInt(sSection, sKey, lDefault, IniFileName)
        
            GetIniNum = lReturn
        End Function
        
        '** 从配置文件中读取Boolean类型变量的设置
        Public Function GetIniBoolean _
                (ByVal strSection As String, _
                 ByVal strKey As String, _
                 Optional ByVal bolDefault As Boolean = False) _
                 As Boolean
            Dim strData As String
            strData = GetIniStr(strSection, strKey, IIf(bolDefault, "True", "False"))
        
            GetIniBoolean = CBool(strData)
        End Function
        
        
        
        '** 将配置信息写入配置文件中
        Public Sub WriteIniStr(ByVal sSection As String, ByVal sKey As String, ByVal sValue As String)
            Dim lReturn As Long
            lReturn = WritePrivateProfileString(sSection, sKey, sValue, IniFileName)
        End Sub
        
        '**
        '** 初始化模块 **
        '**
        Public Sub Reset()
            IniFileName = ""
            CurrentSection = ""
            CurrentData = ""
        End Sub
        
        '**
        '** 获得设置值 **
        '**
        Public Property Get IniValue(ByVal strKey As String) As Variant
            Dim strData As String
            Dim strTemp As String
            strData = GetIniStr(CurrentSection, strKey, "")
            If strData = "" Then
                IniValue = ""
            Else
                If IsNumeric(strData) Then
                    IniValue = Val(strData)
                    Exit Property
                End If
                If IsDate(strData) Then
                    IniValue = CDate(strData)
                    Exit Property
                End If
                strTemp = UCase(strData)
                If strTemp = "TRUE" Or strTemp = "FALSE" Then
                    IniValue = CBool(strData)
                    Exit Property
                End If
                IniValue = strData
            End If
        End Property
        
        '**
        '** 保存设置值 **
        '**
        Public Property Let IniValue(ByVal strKey As String, ByVal vData As Variant)
            Dim strData As String
            If IsDate(vData) Then
                strData = Format(vData, "yyyy-mm-dd hh:mm:ss")
            ElseIf TypeName(vData) = "String" Then
                strData = vData
            Else
                strData = Trim(CStr(vData))
            End If
            WriteIniStr CurrentSection, strKey, strData
        End Property
         
        '**
        '** 获得字符串设置
        '**
        Public Property Get IniString(ByVal strKey As String) As String
            IniString = GetIniStr(CurrentSection, strKey)
        End Property
        '**
        '** 保存字符串设置
        '**
        Public Property Let IniString(ByVal strKey As String, ByVal strData As String)
            WriteIniStr CurrentSection, strKey, strData
        End Property
        
        '**
        '**  获得数字设置
        '**
        Public Property Get IniNumber(ByVal strKey As String, Optional ByVal sngDefault As Single = 0) As Single
            Dim strData As String
            strData = GetIniStr(CurrentSection, strKey)
            If IsNumeric(strData) Then
                IniNumber = strData
            Else
                IniNumber = sngDefault
            End If
        End Property
        
'        Public Property Let IniNumber(ByVal strKey As String, ByVal vData As Variant)
'            WriteIniStr IniFileName, CurrentSection, strKey, Str(vData)
'        End Property
        '**
        '** 获得布儿值设置
        '**
        Public Property Get IniBoolean(ByVal strKey As String, Optional ByVal bolDefault As Boolean = False)As Boolean
            Dim strData As String
            strData = GetIniStr(CurrentSection, strKey)
            On Error Resume Next
            IniBoolean = CBool(strData)
            If Err.Number <> 0 Then
                IniBoolean = bolDefault
            End If
            On Error GoTo 0
        End Property
'        Public Property Let IniBooleanl(ByVal strKey As String, ByVal bolData As Boolean)
'            WriteIniStr IniFileName, CurrentSection, strKey, IIf(bolData, "True", "False")
'        End Property
        
'******************************************************************************
'*************      定义内部私有的过程                  ***********************
'******************************************************************************
'** 初始化模块
Private Sub Class_Initialize()
    Me.Reset
End Sub

###############################################################################
      clsWindow.cls  内容
      
###############################################################################
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsWindow"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
'******************************************************************************
'**
'**             窗体状态类模块
'**
'** 本模块用户处理窗体的大小,位置,状态.
'**
'** 编制 : 袁永福
'** 时间 : 2001-12-7
'**
'** 该模块在配第5版补丁的VB6.0企业版/Windows98第二版的环境下调试通过
'**
'******************************************************************************
'** 声明API函数及常量 **
    Private Declare Function SetWindowPos Lib "user32" _
            (ByVal hwnd As Long, _
             ByVal hWndInsertAfter As Long, _
             ByVal x As Long, _
             ByVal y As Long, _
             ByVal cx As Long, _
             ByVal cy As Long, _
             ByVal wFlags As Long) _
             As Long
    Private Declare Function FlashWindow Lib "user32" _
            (ByVal hwnd As Long, _
             ByVal bInvert As Long) _
             As Long
    Private Declare Function UpdateWindow Lib "user32" _
            (ByVal hwnd As Long) As Long
           
    'Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As Long, _
             ByVal wMsg As Long, _
             ByVal wParam As Long, _
             lParam As Any)
    'Private Declare Function SendMessageBynum& Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As Long, _
             ByVal wMsg As Long, _
             ByVal wParam As Long, _
             ByVal lParam As Long)
    Private Const WM_CHAR = &H102
             
    Private Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As Long, _
             ByVal wMsg As Long, _
             ByVal wParam As Long, _
             ByVal lParam As String) _
             As Long
    'Private Declare Function GetDC Lib "user32" (ByVal Hwnd As Long) As Long
    'Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _
            (ByVal hdc As Long, _
             ByVal x As Long, _
             ByVal y As Long, _
             ByVal lpString As String, _
             ByVal nCount As Long) As Long
             
    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    
    'Private Declare Function ReleaseDC Lib "user32" _
            (ByVal Hwnd As Long, ByVal hdc As Long) As Long
    Private Declare Function InvalidateRect Lib "user32" _
            (ByVal hwnd As Long, _
             lpRect As RECT, _
             ByVal bErase As Long) _
             As Long
    Private Declare Function ValidateRect Lib "user32" _
            (ByVal hwnd As Long, _
             lpRect As RECT) _
             As Long
    Private Declare Function GetClientRect Lib "user32" _
            (ByVal hwnd As Long, _
             lpRect As RECT) _
             As Long
    
'** 定义窗体状态的枚举量 **
    Public Enum enumWindowStatus
        WIN_Normal = 0          ' 一般窗体
        WIN_Min = 1             ' 最小化
        WIN_Max = 2             ' 最大化
    End Enum
    
'** 定义关于窗体状态的变量 **
    Private myRect          As RECT
    Public Left             As Single
    Public Top              As Single
    Public Width            As Single
    Public Height           As Single
    Public WindowState      As enumWindowStatus
    'Private MYFrm           As Form
    Public hwnd             As Long
    'Public myForm           As Form
    'Public MoveRect         As clsMoveRect
    'Public SysEvent         As clsSystemEvent
    
'** 定义接口过程及函数 ********************************************************
    
    '** 窗体大小改变时改变窗体大小方框 **
    Public Sub GetRect()
        Call Resize
    End Sub
    Public Sub Resize()
        GetClientRect hwnd, myRect
    End Sub
    
    '** 禁止客户区重画 **
    Public Sub ForbitDraw()
        ValidateRect hwnd, myRect
    End Sub
'
'    '** 设置当前窗体
'    Public Property Let Hwnd(ByVal lngHwnd As Long)
'
'        lngHwnd = frm.Hwnd
'        Set MYFrm = frm
'    End Property
    
    '** 获得窗体状态数据
    Public Sub GetWindowState()
'        If MYFrm Is Nothing Then Exit Sub
'        With MYFrm
'            WindowState = .WindowState
'            If WindowState <> WIN_Normal Then
'                .WindowState = WIN_Normal
'            End If
'            Left = .Left
'            Top = .Top
'            Width = .Width
'            Height = .Height
'        End With
    End Sub
    
    '** 设置窗体状态数据
    Public Sub SetWindowState()
'        If MYFrm Is Nothing Then Exit Sub
'        With MYFrm
'            .WindowState = WIN_Normal
'            .Left = Left
'            .Top = Top
'            .Width = Width
'            .Height = Height
'            .WindowState = WindowState
'        End With
    End Sub
    '将窗体放在屏幕最高层
    
    Public Property Let TopMost(ByVal bolTopMost As Boolean)
        Const HWND_TOPMOST = -&H1
        Const HWND_NOTOPMOST = -&H2
        Const SWP_NOSIZE = &H1
        Const SWP_NOMOVE = &H2
        If bolTopMost Then
            SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
        Else
            SetWindowPos hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
        End If
    End Property
    
    Public Property Let FlashWin(ByVal bolFlash As Boolean)
        FlashWindow hwnd, bolFlash
    End Property
    Public Sub Refresh()
        UpdateWindow hwnd
    End Sub
    
    Public Function SendString(ByVal wMsg As Long, ByVal wParam As Long, ByVal strMsg As String) As Long
        SendString = SendMessageByString(hwnd, wMsg, wParam, strMsg)
    End Function
    Public Function SendKey(ByVal KeyAscii As Integer) As Long
        SendKey = SendMessageByString(hwnd, WM_CHAR, KeyAscii, 0)
    End Function

转载于:https://www.cnblogs.com/boentouch/p/9951830.html

VB访问word书签。 '实现代码如下 Dim cn As New ADODB.Connection Dim AdoRs As New ADODB.Recordset Dim WordTemps As New Word.Application Private Sub Form_Load() If cn.State = 1 Then cn.Close End If cn.CursorLocation = adUseClient cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb" End Sub '开始导出数据 Private Sub Command1_Click() Dim strSQl As String Dim REC As Integer Dim i As Integer WordTemps.Documents.Add App.Path + "\货物合同.doc", False WordTemps.Selection.GoTo wdGoToBookmark, , , "合同标题" WordTemps.Selection.TypeText "关于冬季货物的成交合同" WordTemps.Selection.GoTo wdGoToBookmark, , , "合同编号" WordTemps.Selection.TypeText "2004000001" WordTemps.Selection.GoTo wdGoToBookmark, , , "签约单位" WordTemps.Selection.TypeText "宏大科技公司,天天科技公司" WordTemps.Selection.GoTo wdGoToBookmark, , , "签约地址" WordTemps.Selection.TypeText "北京中关村大厦" WordTemps.Selection.GoTo wdGoToBookmark, , , "签约时间" WordTemps.Selection.TypeText fromat(Now, "yyyy-mm-dd") strSQl = "select * from Matrixs" AdoRs.Open strSQl, cn, adOpenKeyset, adLockOptimistic REC = AdoRs.RecordCount If REC < 1 Then MsgBox "无商品记录!", vbOKOnly, "提示" AdoRs.Close Exit Sub Else AdoRs.MoveFirst WordTemps.Selection.GoTo wdGoToBookmark, , , "货物清单" For i = 1 To REC WordTemps.Selection.TypeText AdoRs!名称 WordTemps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 WordTemps.Selection.TypeText AdoRs!数量 WordTemps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 WordTemps.Selection.TypeText AdoRs!规格 AdoRs.MoveNext If AdoRs.EOF = False Then WordTemps.Selection.InsertRowsBelow 1 '表格换行 End If Next i AdoRs.Close WordTemps.Visible = True '显示WORD窗口 End If End Sub '实现代码如下 Dim cn As New ADODB.Connection Dim AdoRs As New ADODB.Recordset Dim WordTemps As New Word.Application Private Sub Form_Load() If cn.State = 1 Then cn.Close End If cn.CursorLocation = adUseClient cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb" End Sub '开始导出数据 Private Sub Command1_Click() Dim strSQl As String Dim REC As Integer Dim i As Integer WordTemps.Documents.Add App.Path + "\货物合同.doc", False WordTemps.Selection.GoTo wdGoToBookmark, , , "合同标题" WordTemps.Selection.TypeText "关于冬季货物的成交合同" WordTemps.Selection.GoTo wdGoToBookmark, , , "合同编号" WordTemps.Selection.TypeText "2004000001" WordTemps.Selection.GoTo wdGoToBookmark, , , "签约单位" WordTemps.Selection.TypeText "宏大科技公司,天天科技公司" WordTemps.Selection.GoTo wdGoToBookmark, , , "签约地址" WordTemps.Selection.TypeText "北京中关村大厦" WordTemps.Selection.GoTo wdGoToBookmark, , , "签约时间" WordTemps.Selection.TypeText fromat(Now, "yyyy-mm-dd") strSQl = "select * from Matrixs" AdoRs.Open strSQl, cn, adOpenKeyset, adLockOptimistic REC = AdoRs.RecordCount If REC < 1 Then MsgBox "无商品记录!", vbOKOnly, "提示" AdoRs.Close Exit Sub Else AdoRs.MoveFirst WordTemps.Selection.GoTo wdGoToBookmark, , , "货物清单" For i = 1 To REC WordTemps.Selection.TypeText AdoRs!名称 WordTemps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 WordTemps.Selection.TypeText AdoRs!数量 WordTemps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 WordTemps.Selection.TypeText AdoRs!规格 AdoRs.MoveNext If AdoRs.EOF = False Then WordTemps.Selection.InsertRowsBelow 1 '表格换行 End If Next i AdoRs.Close WordTemps.Visible = True '显示WORD窗口 End If End Sub end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值