Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 GetOpenFileName в 64-х битных версиях  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4668
В своих программах в 32-х битных версиях Access для создания диалога выбора файла я использовал чаще всего функции GetOpenFileName и GetSaveFileName из comdlg32.dll
Сейчас мне приходится переписывать одну из моих программ в 64-х битную версию.
Я исправил вызов функции в соответствии документа Win32API_PtrSafe (он тут на форуме пару раз выкладывался).
Но диалог выбора файла не запускается. В 32-х битных всё работает, а в 64-х - нет.

Просто не выводится окно выбора файла. Ни каких сообщений об ошибках. Просто не отрабатывает и всё. Как быть?

Тестовый пример прилагаю.

-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?

К сообщению приложен файл (test_GetOpenFileName.rar - 14Kb) cкачать
7 янв 19, 21:49    [21779632]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4668
Оказывается, этот вопрос уже поднимался GetOpenFileName для 64 битного Access Проверил пример, выложенный там. Тот же результат. Или у меня что-то криво стоит либо это какой-то общий глюк Access 64 бит
7 янв 19, 22:04    [21779643]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4668
И вот здесь этот вопрос поднимался Диалог открытия файла, выбора папки
Кстати, я его и поднимал. Решение найдено не было. Было предложение перейти на другие способы задания диалога выбора файла.
7 янв 19, 22:20    [21779655]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Stanislav P
Member

Откуда: Сочи
Сообщений: 40
Глянь здесь: Declaring API functions in 64 bit Office. Есть разница между твоей функцией открытия файла и той, что у них написана.
9 янв 19, 12:37    [21780464]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4668
Stanislav P, спасибо за ссылку, но сейчас проверить не могу Офис 64 бит у меня дома.

Что увидел.
1. Деление в примере идёт не между Win64 и Win32, а между VBA7 и VBA6. Хорошо. Считаем VBA7 за Win64.

2. Единственное различие, что я нашел.
    #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
Но 32-х битной версии LenB(OpenFile) = Len(OpenFile) = 76 (это без следующих строк в структуре)
        pvReserved As LongPtr
        dwReserved As Long
        FlagsEx As Long
(они взяты из документа Office 2010 Help Files: Win32API_PtrSafe with 64-bit Support и 32-х битных версий они не задействованы).
А вот LenB(OpenFile.lpstrFile) - 1 и Len(OpenFile.lpstrFile) - 1 отличаются в 2 раза. Но опять же для Access 2003 и Access 2010 32-bit это не имеет значения

Вечером покручу у себя дома. Но терзают меня смутные сомнения...
11 янв 19, 09:38    [21782456]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Stanislav P
Member

Откуда: Сочи
Сообщений: 40
VBA7 умеет сам LongPtr преобразовывать к нужному Long-у в зависимости от разрядности, поэтому, в большинстве случаев, проверка на WIN64 не нужна.

Сам этот код не проверял, потому как руки ещё не дошли на виртуалках поднять все возможные варианты для тестов.
У себя в проекте использую: Application.Filedialog() для выбора файла.
11 янв 19, 11:56    [21782599]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4668
Прогнал программу с этим ветвлением в Access 2010 64 bit - заработало Оказывается всё дело во в этом операторе
        OpenFile.lStructSize = LenB(OpenFile)

В 64 бит версии LenB(OpenFile) = 152, а Len(OpenFile) = 140

На счёт Application.Filedialog(), Первые базы я писал ещё на Access 97. И с Filedialog() там были проблемы. А так же в Access 2000, 2002, 2003 (? - точно не помню). Я как отладил этот диалог на API, так и таскал его из программы в программу.

О способах задания диалога выбора файла почитай вот тут Диалог выбора файла / папки

Там написано, что Application.Filedialog() не работает, если аксесс запущен с опцией /runtime
11 янв 19, 20:40    [21783281]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Stanislav P
Member

Откуда: Сочи
Сообщений: 40
У меня на Access 2016/2019/365 прекрасно работает Application.FileDialog(3) как в полной версии, так и с ключём /runtime и с файлом .accdr
12 янв 19, 00:20    [21783386]     Ответить | Цитировать Сообщить модератору
 Re: GetOpenFileName в 64-х битных версиях  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4668
Stanislav P
У меня на Access 2016/2019/365 прекрасно работает Application.FileDialog(3) как в полной версии, так и с ключём /runtime и с файлом .accdr
Ну, значит, доработали. Если пошарить по форуму, то в старых топиках есть к нему претензии. Сейчас уже нет.
12 янв 19, 08:43    [21783484]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить