powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetOpenFileName для 64 битного Access
9 сообщений из 9, страница 1 из 1
GetOpenFileName для 64 битного Access
    #39283484
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа приветствую.
нарвался и я на Access 64бит...
Ранее хорошо работавшая API на 32/64 оси и 32Access перестала компилироваться в 64Access
Объявляю:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#If Win64 Then
    #If VBA7 Then
        Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As LongPtr
    #Else
        Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As LongPtr
    #End If
    Public Type OPENFILENAME
        lStructSize As LongPtr
        hWndOwner As LongPtr
        hInstance As LongPtr
        lpstrFilter As String
        lpstrCustomFilter As LongPtr
        nMaxCustrFilter As LongPtr
        nFilterIndex As LongPtr
        lpstrFile As String
        nMaxFile As LongPtr
        lpstrFileTitle As String
        nMaxFileTitle As LongPtr
        lpstrInitialDir As String
        lpstrTitle As String
        flags As LongLong
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustrData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As LongPtr
    End Type
#Else
    #If VBA7 Then
        Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #Else
        Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #End If
    Public Type OPENFILENAME
        lStructSize As Long
        hWndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As Long
        nMaxCustrFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustrData As Long
        lpfnHook As Long
        lpTemplateName As Long
    End Type
#End If


Public Const OFN_ALLOWMULTISELECT = &H200
Public Const OFN_CREATEPROMPT = &H2000
Public Const OFN_EXPLORER = &H80000
Public Const OFN_FILEMUSTEXIST = &H1000
Public Const OFN_HIDEREADONLY = &H4
Public Const OFN_NOCHANGEDIR = &H8
Public Const OFN_NODEREFERENCELINKS = &H100000
Public Const OFN_NONETWORKBUTTON = &H20000
Public Const OFN_NOREADONLYRETURN = &H8000
Public Const OFN_NOVALIDATE = &H100
Public Const OFN_OVERWRITEPROMPT = &H2
Public Const OFN_PATHMUSTEXIST = &H800
Public Const OFN_READONLY = &H1
Public Const OFN_SHOWHELP = &H10



использую: тут и выпадает
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
Public Function OpenFile(ByVal InitDir As String, ByVal fName As String, _
                Optional ByVal strExt As String, Optional das As String, Optional blMultiSelect As Boolean = False) As String
' InitDir- можно установить адрес папки - от куда открывать окно поиска
' fname - можно назначить имя файла для фильтрации видимых имен
' strExt - установка фильтра
' das - установка фильтра расширений файлов
' blMultiSelect - возможность выбора одного/нескольких файлов

'Dim strFile As String * 512
Dim of As OPENFILENAME
'Dim f As String
Dim p%

   On Error GoTo OpenFile_Error

' Установка начальных значений структуры
'.hwndOwner = Application.hWndAccessApp - переписал строку кодом ниже
#If Win64 Then
' здесь бьет ошибку - метод или член данных не найден
    of.hWndOwner = Application.HWND32
#Else
    of.hWndOwner = Application.hWndAccessApp
#End If
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
of.lCustrData = 0
of.lpstrFilter = das & Chr$(0) & Chr$(0)
of.nFilterIndex = 3
#If Win64 Then
    of.nMaxFile = LenB(of.lpstrFile) - 1
    of.lStructSize = LenB(of)
    of.nMaxFileTitle = LenB(of.lpstrFile) - 1
#Else
    of.nMaxFile = 511
    of.nMaxFileTitle = 511
#End If
of.lpstrFile = fName & String$(512 - Len(fName), 0)
of.lpstrFileTitle = String$(512, 0)
' Ниже вы можете изменить заголовок окна
of.lpstrTitle = "Поиск файла данных: " & fName
of.lpstrInitialDir = InitDir
'Ниже вы можете изменить фильтры для поиска файлов
of.lpstrDefExt = strExt
If blMultiSelect = True Then
    of.flags = OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST + OFN_ALLOWMULTISELECT + OFN_EXPLORER
Else
    of.flags = OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST
End If

of.lStructSize = Len(of)
If GetOpenFileName(of) Then
    If blMultiSelect = False Then
        p% = InStr(1, of.lpstrFile, Chr$(0))
        OpenFile = Left(of.lpstrFile, p% - 1)
    Else
        p% = InStr(1, of.lpstrFile, Chr$(0) & Chr$(0))
        OpenFile = Left(of.lpstrFile, p% + 1)
    End If
Else
    OpenFile = ""
End If

   On Error GoTo 0
   Exit Function

OpenFile_Error:
'    If LogError(Err.Number, Err.Description, Erl, "OpenFile", "OpenFiles", "") = True Then
'        Call ErrorLogFunct
'    Else
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure OpenFile of OpenFiles", , "Error!"
'    End If
End Function


В коде описал, где спотыкается. Скрин еще приложил.
Сказать бы пронесло - поговорил с человеком, он переставился на 32битный.
Но, первый раз, не означает, что он же и последний.
искал варианты в облаке, видел несколько описаний и они все разные. Проблема в попробовать любой из них.
У меня нет возможности себе поставить это счастье.
Клиенту во время обсуждения несколько раз намекал, на попасть к нему на машину и "проверить" работу кода. Но согласия так и не получил...
Получилось как то все дистанционно...

Господа, у кого есть опыт работы с GetOpenFileName в 64битн Access, напишите, как переписать те строки, что связаны с битностью в самой функции..
Была бы у меня возможность, сам бы игрался...да нет возможности себе поставить
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #39283533
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан,
нашел в инете пример использования GetOpenFileName для 64 битного офиса (может чем поможет)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
Option Explicit

 #If VBA7 Then
     Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
             "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
        
     Public Type OPENFILENAME
         lStructSize As Long
         hwndOwner As LongPtr
         hInstance As LongPtr
         lpstrFilter As String
         lpstrCustomFilter As String
         nMaxCustFilter As Long
         nFilterIndex  As Long
         lpstrFile As String
         nMaxFile As Long
         lpstrFileTitle As String
         nMaxFileTitle  As Long
         lpstrInitialDir As String
         lpstrTitle As String
         flags As Long
         nFileOffset As Integer
         nFileExtension As Integer
         lpstrDefExt As String
         lCustData As Long
         lpfnHook As LongPtr
         lpTemplateName As String
     End Type
    
 #Else

     Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
             "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
        
     Public Type OPENFILENAME
         lStructSize As Long
         hwndOwner As Long
         hInstance As Long
         lpstrFilter As String
         lpstrCustomFilter As String
         nMaxCustFilter As Long
         nFilterIndex  As Long
         lpstrFile As String
         nMaxFile As Long
         lpstrFileTitle As String
         nMaxFileTitle  As Long
         lpstrInitialDir As String
         lpstrTitle As String
         flags As Long
         nFileOffset As Integer
         nFileExtension As Integer
         lpstrDefExt As String
         lCustData As Long
         lpfnHook As Long
         lpTemplateName As String
     End Type
 #End If
'/////////////////////////////////
'// End code GetOpenFileName    //
'/////////////////////////////////


Public Function GetMyFile(strTitle As String) As String

     Dim OpenFile    As OPENFILENAME
     Dim lReturn     As Long
    
     OpenFile.lpstrFilter = ""
     OpenFile.nFilterIndex = 1
     OpenFile.hwndOwner = 0
     OpenFile.lpstrFile = String(257, 0)
     #If VBA7 Then
         OpenFile.nMaxFile = LenB(OpenFile.lpstrFile) - 1
         OpenFile.lStructSize = LenB(OpenFile)
     #Else
         OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1
         OpenFile.lStructSize = Len(OpenFile)
     #End If
     OpenFile.lpstrFileTitle = OpenFile.lpstrFile
     OpenFile.nMaxFileTitle = OpenFile.nMaxFile
     OpenFile.lpstrInitialDir = "C:\"
     OpenFile.lpstrTitle = strTitle
     OpenFile.flags = 0
     lReturn = GetOpenFileName(OpenFile)
    
     If lReturn = 0 Then
         GetMyFile = ""
     Else
         GetMyFile = Trim(Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, vbNullChar) - 1))
     End If
    
End Function
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #39283537
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport,

Спасибо за участие!
Да по примеру
Код: vbnet
1.
OpenFile.hwndOwner = 0


один из вариантов, встречал еще несколько, но ка то даже не запоминал, так как не сложилось поиграться с вариантами.
И вообще, к чему такое разнообразие в этой строке...
Как раз просил людей с 64 Access попробовать/ответить на их вариант строки
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #39283564
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

Вероятно неправильно описал, в чем просил помощи.
Правда сейчас рыл гугл, как то странно, но действительно, кроме OpenFile.hwndOwner = 0
ничего другого нет. В разных вариациях, но по факту это одно решение....
Если кого то не затруднит, проверить в системе 64 и офисе 64:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
#If Win64 Then
    #If VBA7 Then
        Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As LongPtr
    #Else
        Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As LongPtr
    #End If
    Public Type OPENFILENAME
        lStructSize As LongPtr
        hWndOwner As LongPtr
        hInstance As LongPtr
        lpstrFilter As String
        lpstrCustomFilter As LongPtr
        nMaxCustrFilter As LongPtr
        nFilterIndex As LongPtr
        lpstrFile As String
        nMaxFile As LongPtr
        lpstrFileTitle As String
        nMaxFileTitle As LongPtr
        lpstrInitialDir As String
        lpstrTitle As String
        flags As LongLong
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustrData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As LongPtr
    End Type
#Else
    #If VBA7 Then
        Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #Else
        Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    #End If
    Public Type OPENFILENAME
        lStructSize As Long
        hWndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As Long
        nMaxCustrFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustrData As Long
        lpfnHook As Long
        lpTemplateName As Long
    End Type
#End If


Public Const OFN_ALLOWMULTISELECT = &H200
Public Const OFN_CREATEPROMPT = &H2000
Public Const OFN_EXPLORER = &H80000
Public Const OFN_FILEMUSTEXIST = &H1000
Public Const OFN_HIDEREADONLY = &H4
Public Const OFN_NOCHANGEDIR = &H8
Public Const OFN_NODEREFERENCELINKS = &H100000
Public Const OFN_NONETWORKBUTTON = &H20000
Public Const OFN_NOREADONLYRETURN = &H8000
Public Const OFN_NOVALIDATE = &H100
Public Const OFN_OVERWRITEPROMPT = &H2
Public Const OFN_PATHMUSTEXIST = &H800
Public Const OFN_READONLY = &H1
Public Const OFN_SHOWHELP = &H10

Public Product_Code As String

'---------------------------------------------------------------------------------------
' Procedure : OpenFile
' Author    : IHAR
' Purpose   : открытие окна поиска файла
'---------------------------------------------------------------------------------------
'
Public Function OpenFile(ByVal InitDir As String, ByVal fName As String, _
                Optional ByVal strExt As String, Optional das As String, Optional blMultiSelect As Boolean = False) As String
' InitDir- можно установить адрес папки - от куда открывать окно поиска
' fname - можно назначить имя файла для фильтрации видимых имен
' strExt - установка фильтра
' das - установка фильтра расширений файлов
' blMultiSelect - возможность выбора одного/нескольких файлов

'Dim strFile As String * 512
Dim of As OPENFILENAME
'Dim f As String
Dim p%

   On Error GoTo OpenFile_Error

' Установка начальных значений структуры
#If Win64 Then
    #If VBA7 Then
        of.hWndOwner = 0
    #Else
        of.hWndOwner = Application.HWND32
    #End If
#Else
'    #If VBA7 Then
'        of.hWndOwner = Application.HWND32
'    #Else
        of.hWndOwner = Application.hWndAccessApp
'    #End If
#End If
'.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
of.lCustrData = 0
of.lpstrFilter = das & Chr$(0) & Chr$(0)
of.nFilterIndex = 3
#If Win64 Then
    of.nMaxFile = LenB(of.lpstrFile) - 1
    of.lStructSize = LenB(of)
    of.nMaxFileTitle = LenB(of.lpstrFile) - 1
#Else
' несилен в API, но при Len(of.lpstrFile) - 1 тупо проходит до конца кода и срока подключения не создается
    of.nMaxFile = 511 'Len(of.lpstrFile) - 1
    of.nMaxFileTitle = 511 'Len(of.lpstrFile) - 1
    of.lStructSize = 511 'Len(of)
#End If
of.lpstrFile = fName & String$(512 - Len(fName), 0)
of.lpstrFileTitle = String$(512, 0)
' Ниже вы можете изменить заголовок окна
of.lpstrTitle = "Поиск файла данных: " & fName
of.lpstrInitialDir = InitDir
'Ниже вы можете изменить фильтры для поиска файлов
of.lpstrDefExt = strExt
If blMultiSelect = True Then
    of.flags = OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST + OFN_ALLOWMULTISELECT + OFN_EXPLORER
Else
    of.flags = OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST
End If

of.lStructSize = Len(of)
If GetOpenFileName(of) Then
    If blMultiSelect = False Then
        p% = InStr(1, of.lpstrFile, Chr$(0))
        OpenFile = Left(of.lpstrFile, p% - 1)
    Else
        p% = InStr(1, of.lpstrFile, Chr$(0) & Chr$(0))
        OpenFile = Left(of.lpstrFile, p% + 1)
    End If
Else
    OpenFile = ""
End If

   On Error GoTo 0
   Exit Function

OpenFile_Error:
'    If LogError(Err.Number, Err.Description, Erl, "OpenFile", "OpenFiles", "") = True Then
'        Call ErrorLogFunct
'    Else
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure OpenFile of OpenFiles", , "Error!"
'    End If
End Function



Запуск функции
Код: vbnet
1.
2.
3.
4.
Public Function Open_Files() As String

MsgBox OpenFile("", "", , "Baze (*.accdb)" & Chr$(0) & "*.accdb", False)
End Function



посмотрите пожалуйста кого есть (в системе 64 и офисе 64) - у вас нормально сформирует строку?
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #39283638
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

А чем стандартный Application.FileDialog(msoFileDialogFilePicker) не устраивает?

Ну и по теме - не совсем понял, зачем вы пытаетесь получить HWND32 в 64-х разрядной среде. Аксовские хандлеры не меняют своих названий в 64 и 32 бит системх, разрядность при этом меняется.

Тестовую среду рекомендую все-таки завести - под виртуалкой. Даже на лаптопе с не очень большой памятью работает
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #39283876
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

Да когда то в началах, пробовал FileDialog.
Да как то мне окошко не понравилось. Куцое какое то.
FileDialog -это уже "последний рубеж", понимаю, что он родной.
А HWND32 применял потому что, когда то код взял, да и использовал.
Не сильно понимаю в API, потому только если подсмотрю чьи то решения...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
GetOpenFileName для 64 битного Access
    #40117798
VDeltsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делюсь кодом работающим как MS ACCESS 2003 x32 и MS ACCESS 2016 x64.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
Option Explicit

#If Win64 And VBA7 Then
    Private Declare PtrSafe Function GetOpenFileNameSys Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Private Declare PtrSafe Function GetSaveFileNameSys Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
    
    Type OPENFILENAME
        lStructSize As Long
        hwndOwner As LongLong
        hInstance As LongLong
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        Flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As LongLong
        lpfnHook As LongLong
        lpTemplateName As String
    End Type
#Else
    Private Declare Function GetOpenFileNameSys Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Private Declare Function GetSaveFileNameSys Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long

    Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        Flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
#End If

Public Function GetSaveFileName(Optional FileName = "" _
, Optional FileFilter = "All Files(*.*)|*.*" _
, Optional FileTitle As String _
, Optional DefExt As String, Optional OwnerHwnd As Long = 0 _
) As String
    
Dim Result As Long
Dim OpenFile As OPENFILENAME

    With OpenFile
        If OwnerHwnd <> 0 Then
            .hwndOwner = OwnerHwnd
        Else
            .hwndOwner = Application.hWndAccessApp
        End If
        .lpstrFile = FileName + String(256 - Len(FileName), 0)
        .lpstrFilter = FileFilter
        .lpstrTitle = FileTitle
        .lpstrFileTitle = String(256, 0)
        .lpstrCustomFilter = String(255, 0)
        
        .nMaxCustFilter = 255
        .nMaxFile = Len(.lpstrFile)
        .nMaxFileTitle = 255
        .Flags = &H1000 Or &H800
        .lpstrDefExt = DefExt
        .lStructSize = LenB(OpenFile)
        
    End With
    Result = GetSaveFileNameSys(OpenFile)
    If Result > 0 Then
        GetSaveFileName = Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, Chr(0)) - 1)
        FileName = Mid(GetSaveFileName, OpenFile.nFileOffset + 1)
    Else
        GetSaveFileName = ""
    End If
End Function

Public Function GetOpenFileName(Optional FileName = "" _
, Optional FileFilter = "All Files(*.*)|*.*" _
, Optional FileTitle As String _
, Optional DefExt As String, Optional OwnerHwnd As Long = 0 _
) As String

Dim Result As Long
Dim OpenFile As OPENFILENAME

    With OpenFile
        If OwnerHwnd <> 0 Then
            .hwndOwner = OwnerHwnd
        Else
            .hwndOwner = Application.hWndAccessApp
        End If
        .lpstrFile = FileName + String(256 - Len(FileName), 0)
        .lpstrFilter = FileFilter
        .lpstrTitle = FileTitle
        .lpstrFileTitle = String(256, 0)
        .lpstrCustomFilter = String(255, 0)
        .nMaxFile = Len(.lpstrFile)
        .nMaxCustFilter = 255
        .nMaxFileTitle = 255
        .Flags = &H1000 Or &H800
        .lpstrDefExt = DefExt
        .lStructSize = LenB(OpenFile)
    End With
    Result = GetOpenFileNameSys(OpenFile)
    If Result > 0 Then
        GetOpenFileName = Left(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, Chr(0)) - 1)
        FileName = Mid(GetOpenFileName, OpenFile.nFileOffset + 1)
    Else
        GetOpenFileName = ""
    End If
End Function
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #40117846
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDeltsov, А зачем всё это? Чем Application.FileDialog не устраивает? Работает всегда и на всех версиях
...
Рейтинг: 0 / 0
GetOpenFileName для 64 битного Access
    #40117849
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDeltsov
Код: vbnet
1.
Optional OwnerHwnd As Long

А тут всё нормально?
Я конечно могу запамятовать, но handle в x64 вроде как LongLong, а тут идёт уменьшение разрядности числа... Будет ошибка?
Могу ошибаться...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetOpenFileName для 64 битного Access
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]