Тема: В Windows 7 не работает стандартная библиотека открытия файла

При внедрении для расширения функциональности системы были написаны несколько макросов, которые используют стандартную библиотеку windows для выбора файла:

В Windows 7 макрос валится на строке: Set OpenDialog = CreateObject("UserAccounts.CommonDialog")

Как я понял данная библиотека есть только в Win XP и в win 7 не поддерживается.

Использовать сторонние библиотеки не хотелось бы (их надо добавляить в пакет обновлений)


Наверняка кто то с этим уже сталкивался.

Как с меньшими трудозатратами исправить данную ситуацию?  Какую библиотеку windows можно использовать, чтобы она работала на всех версиях Windows или проверять версию винды и в зависимости от этого использовать разные библиотеки???

(изменено: Дмитрий Гамий, 7 октября 2011 09:19:25)

Re: В Windows 7 не работает стандартная библиотека открытия файла

Используйте вызов аналогичной функции из Excel

    If isEmpty(objXL) Then Set objXL = CreateObject("Excel.Application")
     
    objXL.Visible = False
     
    FileName = objXL.GetOpenFilename("Excel файлы (*.xls),*.xls,*.All Files,*.*", 1, "Выберите файл MS Excel")
    If FileName = False Then           
        Exit Sub               
    End If
    Set objXL = Nothing

Re: В Windows 7 не работает стандартная библиотека открытия файла

Предлагают использовать вот такой код

Function BrowseForFile(pstrPath, pstrFilter)
 Set objDialog = CreateObject("MSComDlg.CommonDialog")
 objDialog.Filter = pstrFilter
 objDialog.InitDir = pstrPath
 objDialog.MaxFileSize = 256
 objDialog.Flags = &H80000 + &H4 + &H8
 intResult = objDialog.ShowOpen()
 BrowseForFile = objDialog.FileName
End Function

BrowseForFile "c:","*.vbs"

http://blogs.technet.com/heyscriptinggu … 15-09.aspx

(изменено: Дмитрий Гамий, 7 октября 2011 09:35:53)

Re: В Windows 7 не работает стандартная библиотека открытия файла

Олег Зырянов пишет:

Set objDialog = CreateObject("MSComDlg.CommonDialog")

Это тоже не всегда срабатывает, особенно, если не стоит Visual Studio (по крайней мере, в Windows XP).

Re: В Windows 7 не работает стандартная библиотека открытия файла

Олег Зырянов пишет:

Предлагают использовать вот такой код
Function BrowseForFile(pstrPath, pstrFilter)
Set objDialog = CreateObject("MSComDlg.CommonDialog")


http://blogs.technet.com/heyscriptinggu … 15-09.aspx


Это от туда же:
Make sure that the MSComDlg.CommonDialog program ID (MSCOMDLG32.OCX) is registered for the below to work. This object does not, however, seem to be available on all systems; it might be included with Visual Studio or Microsoft Office. We are not sure.

Мы пробовали эту библиотеку
На Set objDialog = CreateObject("MSComDlg.CommonDialog") макрос валится

, как я понял эта библиотека не входит в винду и её надо регистрировать

Re: В Windows 7 не работает стандартная библиотека открытия файла

Дмитрий Гамий пишет:
Олег Зырянов пишет:

Set objDialog = CreateObject("MSComDlg.CommonDialog")

Это тоже не всегда срабатывает, особенно, если не стоит Visual Studio (по крайней мере, в Windows XP).


В семёрке также не работает,

а регить данную библиотеку каждому пользователю как то не хочется,

неужели нет нормальной стандартной библиотеке в винде , вне зависимости от её версии?


За версию с ёксилем спасибо, как зап. вариант оставим

Re: В Windows 7 не работает стандартная библиотека открытия файла

kaff пишет:

как я понял эта библиотека не входит в винду и её надо регистрировать

В принципе, она даже есть в дополнительной установке TechnologiCS, но для её использования сторонними программами, как оказалось, необходима какая-то лицензия.

Re: В Windows 7 не работает стандартная библиотека открытия файла

Да действительно, с ним тоже есть проблемки. Сейчас смотрю еще способы.
В принципе, начиная с 5.7 (хотя лучше в 6-ки) можно свою формочку просто нарисовать, это самый лучший способ видимо, так как простого решения я не вижу (все юзают слишком большие либы - не стоит того думаю).
Формочку накидать попробуем сейчас.

(изменено: kaff, 7 октября 2011 10:09:57)

Re: В Windows 7 не работает стандартная библиотека открытия файла

Дмитрий Гамий пишет:

Используйте вызов аналогичной функции из Excel

    If isEmpty(objXL) Then Set objXL = CreateObject("Excel.Application")
     
    objXL.Visible = False
     
    FileName = objXL.GetOpenFilename("Excel файлы (*.xls),*.xls,*.All Files,*.*", 1, "Выберите файл MS Excel")
    If FileName = False Then           
        Exit Sub               
    End If
    Set objXL = Nothing

Окно не появляется :)   верней оно за окном technologics

Re: В Windows 7 не работает стандартная библиотека открытия файла

Ну вот самый простой вариант на формах ввода (хотя саму форму можно конечно сильно улучшить - но тогда лучше ее прямо в дизайнере сделать)

'<doc Выбор папки
'<par %1 As String Первоначальный путь>
'<par %2 As String Заголовок>
'>
Function BrowseForFolder( StartPath, Caption )
   BrowseForFolder = ""
   Set objShell = CreateObject("Shell.Application")
   If Caption="" Then Caption = "Выберите папку:"
   Set objFolder = objShell.BrowseForFolder( 0, Caption, 0, StartPath) 
   If Not objFolder Is Nothing Then
     BrowseForFolder =  objFolder.Self.Path      
   End If
End Function 


'<doc Выбор файла
'<par %1 As String Первоначальный путь>
'<par %2 As String Заголовок>
'<par %3 As String Маска для выбора>
'>
Function BrowseForFile( StartPath, Caption, FileMask )
   BrowseForFile = ""
   Set Form = TCSApp.TCSForm( "", False )
   If Caption="" Then Caption = "Выберите файл:"
   Form.Caption = Caption
   Call Form.CreateControl( "TVBCSFilenameEdit", "FName", "" )    
   Set C = Form.Controls( "FName" )
   C.FileName = ""
   C.Left = 5
   C.Top = 5
   C.Width = 400
   Form.Width = 400 + 15
   Form.Height = C.Height + 40
   If StartPath<>"" Then C.InitialDir = StartPath
   If FileMask<>"" Then C.Filter = FileMask
   Form.ShowModal
   BrowseForFile = C.FileName   
End Function 

 
Sub Test
  p = BrowseForFolder( "C:\", "" )
  MsgBox "Select path:" + p
  p = BrowseForFile( "C:\", "", "Текстовые файлы|*.txt|Ini-файлы|*.ini" )
  MsgBox "Select file:" + p
End Sub

Re: В Windows 7 не работает стандартная библиотека открытия файла

Простенькая форма ввода для выбора файла (во вложении). Вызов такой

Sub Test2
  p = CSDN_BrowseForFileForm.CSDNBrowseForFile( "" )
  MsgBox "Select file2:" + p  
End Sub

(код в основном позаимствован из расширения Модуль Импорта документов (идет в составе TechnologiCS 6.2).

Post's attachments

CSDN_BrowseForFileForm.eiScript 3.34 Кб, 12 скачиваний с 2011-10-07 

You don't have the permssions to download the attachments of this post.

(изменено: Евгений Слинкин, 7 октября 2011 12:55:40)

Re: В Windows 7 не работает стандартная библиотека открытия файла

К слову - эта же проблема есть на Windows Vista.
Но в Vista (и более старых версиях Windows) ее можно решить с использованием Internet Explorer, аналогично примеру с MS Excel.
Из ньюансов примера:
- Если выбран ярлык файла, то будет возвращен путь до самого файла;
- В Windows 7 с IE8 корректно будет отображаться только имя файла, путь до него будет всегда "C:\fakepath\Имя_Файла".

Function OpenFile()
    Dim objectIE, strSelected
    OpenFile = ""
    Set objectIE = CreateObject( "InternetExplorer.Application" )
    objectIE.visible = False
    objectIE.Navigate( "about:blank" )
    Do Until objectIE.ReadyState = 4
    Loop
    objectIE.Document.Write "<HTML><BODY><INPUT ID=""FileToOpen"" NAME=""FileToOpen"" TYPE=""file""><BODY></HTML>"
    With objectIE.Document.all.FileToOpen
        .focus
        .click
        strSelected = .value
    End With
    objectIE.Quit
    Set objectIE = Nothing
    OpenFile = strSelected
End Function

Re: В Windows 7 не работает стандартная библиотека открытия файла

Соберем вместе все варианты, а добавил кнопку к нашей функции  BrowseForFile

'<doc Выбор папки
'<par %1 As String Первоначальный путь>
'<par %2 As String Заголовок>
'>
Function BrowseForFolder( StartPath, Caption )
   BrowseForFolder = ""
   Set objShell = CreateObject("Shell.Application")
   If Caption="" Then Caption = "Выберите папку:"
   Set objFolder = objShell.BrowseForFolder( 0, Caption, 0, StartPath) 
   If Not objFolder Is Nothing Then
     BrowseForFolder =  objFolder.Self.Path      
   End If
End Function 


'<doc Выбор файла
'<par %1 As String Первоначальный путь>
'<par %2 As String Заголовок>
'<par %3 As String Маска для выбора>
'>
Function BrowseForFile( StartPath, Caption, FileMask )
   BrowseForFile = ""
   Set Form = TCSApp.TCSForm( "", False )
   If Caption="" Then Caption = "Выберите файл:"
   Form.Caption = Caption
   Call Form.CreateControl( "TVBCSFilenameEdit", "FName", "" )    
   Set C = Form.Controls( "FName" )
   C.FileName = ""
   C.Left = 5
   C.Top = 5
   C.Width = 400
   If StartPath<>"" Then C.InitialDir = StartPath
   If FileMask<>"" Then C.Filter = FileMask
   Call Form.CreateControl( "TVBButton", "OkBtn", "" )    
   Set B = Form.Controls( "OkBtn" )
   B.Caption = "Выбрать"
   B.Width = 120 
   B.Left =  C.Left + C.Width - B.Width
   B.Top = C.Top + C.Height + 10
   Call Form.SetControlEvent( "OkBtn", "ObjectClick", "CSDN_Nomenclatures.OnBrowseForFileOkClick" )
   Form.Width = 400 + 15
   Form.Height = B.Top + B.Height + 40 
   Form.ShowModal  
   If Form.ModalResult=1 Then BrowseForFile = C.FileName   
End Function 

Sub OnBrowseForFileOkClick( Form, ObjName )
  If Form.c_FName.FileName="" Then 
     Call TCSApp.ShowErrorMessage( "Выберите файл!" )
  Else   
    Form.Close( 1 )
  End If
End Sub

 
Sub Test
  p = BrowseForFolder( "C:\", "" )
  MsgBox "Select path:" + p
  p = BrowseForFile( "C:\", "", "Текстовые файлы|*.txt|Ini-файлы|*.ini" )
  MsgBox "Select file:" + p
  
  p = CSDN_BrowseForFileForm.CSDNBrowseForFile( "" )
  MsgBox "Select file2:" + p  
End Sub

Внимание! в данном примере необходимо создать какой нибудь скриптовый модуль, куда положить обработчик от кнопки на форме, созданной непосредственно в коде, после чего исправить код примера. В нашем случае это скриптовый модуль CSDN_Nomenclatures в нем должна быть функция OnBrowseForFileOkClick (тело которой сейчас расположено в этом же примере сейчас) - заменить строку CSDN_Nomenclatures.OnBrowseForFileOkClick

ФОрма ввода для третьего варианта там же https://forum.technologics.ru/post9048.html#p9048

Re: В Windows 7 не работает стандартная библиотека открытия файла

Олег Зырянов пишет:

Предлагают использовать вот такой код

Function BrowseForFile(pstrPath, pstrFilter)
 Set objDialog = CreateObject("MSComDlg.CommonDialog")
 objDialog.Filter = pstrFilter
 objDialog.InitDir = pstrPath
 objDialog.MaxFileSize = 256
 objDialog.Flags = &H80000 + &H4 + &H8
 intResult = objDialog.ShowOpen()
 BrowseForFile = objDialog.FileName
End Function

BrowseForFile "c:","*.vbs"

У меня команда MSComDlg.CommonDialog не работает, а нужно выделить несколько файлов из папки на диске, каким образом мне выйти из положения?

Re: В Windows 7 не работает стандартная библиотека открытия файла

В скриптах можно использовать ScriptHelper и его методы https://help.technologics.ru/7.1/TCSAPI … alog_9.htm