IMAGE_FILE_LARGE_ADDRESS_AWARE и переключатель ОС на 3 ГБ

Вы можете сделать что-то вроде этого - вам нужно передать оба пути в ProcessFolders

Sub ExcelPlot()

    Dim sourceFolder As String, destFolder As String

    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .Title = "Locate the Excel files"
        If .Show = -1 Then
            sourceFolder = .SelectedItems(1)
            .Title = "Where would you like to save the PDFs?"
            If .Show = -1 Then
                destFolder = .SelectedItems(1)
                ProcessFolders sourceFolder, destFolder
                Shell "Explorer.exe" & " " & destFolder, vbNormalFocus
            End If
        End If
    End With
End Sub

РЕДАКТИРОВАТЬ: Вот обновленная (не рекурсивная) версия вашей подпрограммы обработки папок: [114 ]

Sub ProcessFolders(sourceFolder As String, destFolder As String)

    Dim objFileSystem As Object
    Dim objFolder As Object
    Dim objSubFolder As Object
    Dim objFile As Object
    Dim objWorkbook As Excel.Workbook
    Dim strWorkbookName As String, strFileExtension As String

    Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Dim colFolders As New Collection

    colFolders.Add sourceFolder

    Do While colFolders.Count > 0

        Set objFolder = objFileSystem.GetFolder(colFolders(1)) 'get the first path
        colFolders.Remove 1 'remove from listing

        'Process files in this folder
        For Each objFile In objFolder.Files

            strFileExtension = objFileSystem.GetExtensionName(objFile)
            If LCase(strFileExtension) = "xls" Or LCase(strFileExtension) = "xlsx" Then

               Set objWorkbook = Application.Workbooks.Open(objFile.Path)

               strWorkbookName = Left(objWorkbook.Name, _
                                     (Len(objWorkbook.Name) - Len(strFileExtension)) - 1)
               objWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
                  Filename:=objFileSystem.buildpath(destFolder, strWorkbookName & ".pdf")

               objWorkbook.Close False
            End If
        Next

        'Process subfolders
        For Each objSubFolder In objFolder.SubFolders
            If ((objSubFolder.Attributes And 2) = 0) And ((objSubFolder.Attributes And 4) = 0) Then
               colFolders.Add objSubFolder.Path  'add this to the collection for processing
            End If
        Next

    Loop

End Sub
16
задан Jan Goyvaerts 29 July 2010 в 11:41
поделиться

2 ответа

В основном эти IMAGE_FILE_LARGE_ADDRESS_AWARE говорит систему, "Я знаю, что адреса с высоким набором битов не отрицательны, и могут обработать их". Если система будет готова обеспечить адреса непривилегированного режима выше 2 ГБ, то она будет. Если система не готова дать те адреса (т.е., 32-разрядный Windows OS без/3GB, устанавливающего), процесс не может получить те адреса так или иначе - но никакой причиненный вред.

Также примечание, что, если изображение имеет IMAGE_FILE_LARGE_ADDRESS_AWARE набор битов, это получит доступ к адресному пространству выше 2 ГБ в системах Win64, которые не поддерживают (или потребность) переключатель/3GB. 32-разрядное приложение получит адресное пространство чего-то близко к 4 ГБ, и 64-разрядное приложение получит огромное адресное пространство - 7 ТБ к 8 ТБ в зависимости от платформы (64-разрядные сборки устанавливают бит по умолчанию).

http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits

20
ответ дан 30 November 2019 в 17:53
поделиться

Переключатель проигнорирован, если можно назвать его этим. На этот раз Microsoft на самом деле удалось придумать описательное имя.

флаг означает точно, что он говорит. Этот файл изображения знающий , что существуют большие адреса. Таким образом, это не откажет, если это будет дано подсказка выше границы на 2 ГБ.

И это - все. ОС не должна рассматривать процесс, особенный всегда. Это просто указывает, что , если ОС в состоянии обеспечить память больше чем на 2 ГБ, этот процесс может обработать ее без катастрофического отказа. Можно сделать простое привет мировым приложением, которое никогда не использует больше чем 1.5 МБ и все еще имеет этот набор флага. Это не означает, что "Я хочу использовать 3 ГБ памяти", это означает, "Когда я запрашиваю память, я не забочусь, ли это выше или ниже границы на 2 ГБ".

Поэтому, так как флаг не требует, чтобы ОС сделала что-либо специальное, ОС просто не сделает ничего специального, если не будет ничего специального, которое это может сделать.

10
ответ дан 30 November 2019 в 17:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: