powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetOpenFileName в 64-х битных версиях
9 сообщений из 9, страница 1 из 1
GetOpenFileName в 64-х битных версиях
    #39756589
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В своих программах в 32-х битных версиях Access для создания диалога выбора файла я использовал чаще всего функции GetOpenFileName и GetSaveFileName из comdlg32.dll
Сейчас мне приходится переписывать одну из моих программ в 64-х битную версию.
Я исправил вызов функции в соответствии документа Win32API_PtrSafe (он тут на форуме пару раз выкладывался).
Но диалог выбора файла не запускается. В 32-х битных всё работает, а в 64-х - нет.

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

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

-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39756595
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается, этот вопрос уже поднимался GetOpenFileName для 64 битного Access Проверил пример, выложенный там. Тот же результат. Или у меня что-то криво стоит либо это какой-то общий глюк Access 64 бит
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39756598
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот здесь этот вопрос поднимался Диалог открытия файла, выбора папки
Кстати, я его и поднимал. Решение найдено не было. Было предложение перейти на другие способы задания диалога выбора файла.
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39757103
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глянь здесь: Declaring API functions in 64 bit Office . Есть разница между твоей функцией открытия файла и той, что у них написана.
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39758268
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav P, спасибо за ссылку, но сейчас проверить не могу Офис 64 бит у меня дома.

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

2. Единственное различие, что я нашел.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
    #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 (это без следующих строк в структуре)
Код: vbnet
1.
2.
3.
        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 это не имеет значения

Вечером покручу у себя дома. Но терзают меня смутные сомнения...
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39758364
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VBA7 умеет сам LongPtr преобразовывать к нужному Long-у в зависимости от разрядности, поэтому, в большинстве случаев, проверка на WIN64 не нужна.

Сам этот код не проверял, потому как руки ещё не дошли на виртуалках поднять все возможные варианты для тестов.
У себя в проекте использую: Application.Filedialog () для выбора файла.
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39758607
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогнал программу с этим ветвлением в Access 2010 64 bit - заработало Оказывается всё дело во в этом операторе
Код: vbnet
1.
        OpenFile.lStructSize = LenB(OpenFile)


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

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

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

Там написано, что Application.Filedialog() не работает, если аксесс запущен с опцией /runtime
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39758656
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня на Access 2016/2019/365 прекрасно работает Application.FileDialog(3) как в полной версии, так и с ключём /runtime и с файлом .accdr
...
Рейтинг: 0 / 0
GetOpenFileName в 64-х битных версиях
    #39758697
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav PУ меня на Access 2016/2019/365 прекрасно работает Application.FileDialog(3) как в полной версии, так и с ключём /runtime и с файлом .accdr Ну, значит, доработали. Если пошарить по форуму, то в старых топиках есть к нему претензии. Сейчас уже нет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / GetOpenFileName в 64-х битных версиях
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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