⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modmain.bas

📁 一个把VB原代码转换为VC原代码的软件代码。
💻 BAS
📖 第 1 页 / 共 5 页
字号:
Attribute VB_Name = "ModMain"
' -------------------------------------
' VB2Cpp - Visual Basic to C++ translator.
' Copyright (C) 2002-2003 Franck Charlet.
'
' VB2Cpp is free software; you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation; either version 2, or (at your option)
' any later version.
'
' VB2Cpp is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with VB2Cpp; see the file Copying.txt.  If not, write to
' the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
' Boston, MA 02111-1307, USA.
' -------------------------------------
' Main module
' -------------------------------------

Option Explicit

' --- Version number --- '
Global Const APPVersion = "0.8.67"

' --- Main program --- '
Public Sub Main()
    SetEnv          ' Create some variables
    ReadPrefs       ' Fill preferences
    InitGUI         ' Launch GUI
End Sub

' --- Perform project conversion --- '
Public Sub DoConversion()
    Dim FirstProjectElement As String
    Dim VB4Prj As Boolean
    
    ReadPrefs
    AlloctempFile
    If InitConversionContext() = False Then GoTo NoContext
    WriteText "------------------------------------------------------------------------\n"
    WriteText "Project to convert: " & ProjectName & "...\n\n"
    WriteText "Generating temporary project file..."
    StatusBarSetText hStatusBar, "Converting..."
    
    ' Convert VB project file into ini file
    WriteOut "[VBProject]\n"
    ProjectMem = LoadFileIntoMemory(FileInput)
    If ProjectMem <> 0 Then
        TempProjectToChange = String(FileReaded, " ")
        CopyMemory ByVal TempProjectToChange, ByVal ProjectMem, FileReaded
        FreeMem ProjectMem
        i = 0
        ' Save first found project element (VB4)
        FirstProjectElement = UCase(left(TempProjectToChange, 7))
        ' Convert module= to modulex=
        Do While InStr(1, TempProjectToChange, "module=", vbTextCompare) <> 0
            TempProjectToChange = Replace(TempProjectToChange, "module=", "module" & i & "=", , 1, vbTextCompare)
            i = i + 1
        Loop
        WriteFile FileOutput, ByVal TempProjectToChange, Len(TempProjectToChange), ProjectBytesW, 0
    Else
        WriteText "\n*** Fatal error: can't create temporary file.\n"
    End If
    WriteText " Ok.\n"
    If FileOutput <> 0 Then CloseHandle FileOutput
    FileOutput = 0
    WriteText "Checking project validity..."
    
    ' Check if project starts with main()
    VB4Prj = False
    ProjectStartupProc = IniReadKey("VBProject", "Startup", TempProjectName)
    If lstrlen(ProjectStartupProc) = 0 Then
        ' Might be a VB4 project
        ' (if starting with a module then it's a sub main())
        If FirstProjectElement <> "MODULE=" Then
            WriteText "\n*** Fatal error: project must start with main().\n"
            GoTo StopAll
        End If
        VB4Prj = True
    Else
        If lstrcmpi(ProjectStartupProc, "SUB MAIN") <> 0 Then
            WriteText "\n*** Fatal error: project must start with main().\n"
            GoTo StopAll
        End If
    End If
    
    ' Read project informations
    ' (No project type for VB4 projects)
    If VB4Prj = False Then
        ProjectType = IniReadKey("VBProject", "Type", TempProjectName)
        If lstrlen(ProjectType) = 0 Then
            WriteText "\n*** Fatal error: can't retrieve project type.\n"
            GoTo StopAll
        End If
    End If
    
    ' Single threading model required (no modules/forms system)
    ' (VB4 projects don't handle such things)
    If VB4Prj = False Then
        If IniReadKey("VBProject", "MaxNumberOfThreads", TempProjectName) <> "1" Then
            WriteText "\n*** Fatal error: can't convert multi-threading based projects.\n"
            GoTo StopAll
        End If
    End If
    
    ' Retrieve general informations
    ProjectMajor = IniReadKey("VBProject", "MajorVer", TempProjectName)
    ProjectMinor = IniReadKey("VBProject", "MinorVer", TempProjectName)
    ProjectRevision = IniReadKey("VBProject", "RevisionVer", TempProjectName)
    WriteText " Ok.\n"
    
    InitWorkingArrays
    
    NbrErrors = 0
    NbrWarnings = 0
    StatsLines = 0
    ForTempUVarNbr = 0
    ForTempLVarNbr = 0
    TemporaryVars = 0
    TemporaryStrArgs = 0
    TemporarySelects = 0
    LiteralStrVar = 0
    RefVariablesWORD = 0
    RefVariablesDWORD = 0
    RefVariablesCHAR = 0
    RefVariablesBOOL = 0
    RefVariablesBYTE = 0
    RefVariablesDOUBLE = 0
    RefVariablesFLOAT = 0
    
    i = 0
    
    ' Get project title
    ProjectTitle = IniReadKey("VBProject", "Title", TempProjectName)
    ' Fallback
    If lstrlen(ProjectTitle) = 0 Then ProjectTitle = RemoveFileExtension(GetFileName(ProjectName))
    
    ' Retrieve modules informations
    ModuleName = IniReadKey("VBProject", "Module" & i, TempProjectName)
    If lstrlen(ModuleName) = 0 Then
        WriteText "\n*** Fatal error: no modules in project.\n"
        GoTo StopAll
    End If
    WriteText "Retrieving referenced modules..."
    Do While lstrlen(ModuleName) <> 0
        ModuleNameArray() = Split(ModuleName, ";")
        If UBound(ModuleNameArray()) <> 1 Then
            WriteText "\n*** Fatal error: mangled module reference.\n"
            GoTo StopAll
        End If
        ModuleEmptyName = Trim(ModuleNameArray(1))
        If lstrlen(ModuleEmptyName) <> 0 Then
            ModulesArray(UBound(ModulesArray())) = ModuleEmptyName
            ReDim Preserve ModulesArray(0 To UBound(ModulesArray()) + 1)
        End If
        i = i + 1
        ModuleName = IniReadKey("VBProject", "Module" & i, TempProjectName)
    Loop
    
    ' Retrieve .res file
    ResourceName = IniReadKey("VBProject", "ResFile32", TempProjectName)
    DeleteFile TempProjectName
    WriteText " Ok.\n"
    
    ReDim ModulesArrayConversion(UBound(ModulesArray()))
    CreateModalDialog 402, 244, hWndDialog, AddressOf SelectModsProc, WS_BORDER Or WS_CAPTION Or WS_SYSMENU
    If ModulesChoice = MODULES_CANCEL Then GoTo StopAll
    
    ' Initialize output files
    Ticks = (GetTickCount \ 1000)
    OutHeaderName = Mid(ProjectName, 1, Len(ProjectName) - 3) & "cpp"
    OutHeaderHandle = OpenFileW(OutHeaderName)
    If OutHeaderHandle = -1 Then
        WriteText "\n*** Fatal error: can't open output project file.\n"
        GoTo StopAll
    End If
    OutHTypeHandle = OpenFileW(Mid(ProjectName, 1, Len(ProjectName) - 4) & "type.h")
    If OutHTypeHandle = -1 Then
        WriteText "\n*** Fatal error: can't open output project file header.\n"
        GoTo StopAll
    End If
    OutHConstHandle = OpenFileW(Mid(ProjectName, 1, Len(ProjectName) - 4) & "const.h")
    If OutHConstHandle = -1 Then
        WriteText "\n*** Fatal error: can't open output constants file header.\n"
        GoTo StopAll
    End If
    OutHVarHandle = OpenFileW(Mid(ProjectName, 1, Len(ProjectName) - 4) & "var.h")
    If OutHVarHandle = -1 Then
        WriteText "\n*** Fatal error: can't open output variables file header.\n"
        GoTo StopAll
    End If
    
    ' Remove obsolete VC files
    DeleteFile Mid(ProjectName, 1, Len(ProjectName) - 3) & "dsp"
    DeleteFile Mid(ProjectName, 1, Len(ProjectName) - 3) & "dsw"
    
    ' Create new VC project file
    OutCPrjHandle = OpenFileW(Mid(ProjectName, 1, Len(ProjectName) - 3) & "dsp")
    If OutHVarHandle = -1 Then
        WriteText "\n*** Fatal error: can't open output Visual C++ project file.\n"
        GoTo StopAll
    End If
    
    ' Create new VC workspace file
    OutCPrjWorkSpcHandle = OpenFileW(Mid(ProjectName, 1, Len(ProjectName) - 3) & "dsw")
    If OutCPrjWorkSpcHandle = -1 Then
        WriteText "\n*** Fatal error: can't open output Visual C++ workspace file.\n"
        GoTo StopAll
    End If
    
    WriteConstHeader
    WriteVarHeader
    WriteHeaders
    WriteTypeHeader
    WriteText "\nPass 1...\n"
    AddCLibFunctions

    ' First pass: retrieve the constants/variables/subs/functions/user types/enums definitions
    For i = 0 To UBound(ModulesArray()) Step 1
        If lstrlen(ModulesArray(i)) <> 0 Then
            CurrentModuleName = ModulesArray(i)
            If InStr(1, CurrentModuleName, "\") <> 0 Then
                OriginalModuleName = CurrentModuleName
                CurrentModuleName = "\" & CurrentModuleName

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -