Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2016, 02:14   #1
Shuma1974
 
Регистрация: 01.05.2016
Сообщений: 6
По умолчанию Совместимость при вызове внешних функций Виндоуз.

Здравствуйте, уважаемые форумчане!
У меня такой вопрос: я пишу макрос в VBA 6.5 (штатный в офисе 2003).
Поскольку я использую некоторые функции API Windows, то шапка макроса такая:
Код:
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Declare Function sndplaysound32 Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpzsoundname As String, ByVal uFlags As Long) As Long
ПРОБЛЕМА: при попытке запустить макрос на компе с 64-битной Windows система выдает сообщение о несовместимости. Я прочитал про метод PtrSafe и Ptr-типы переменных. Не работает. Мой VBA не распознает этих операторов (они появились только с VBA 7). Учитывая, что макрос планируется использовать на неопределенно большом количестве компьютеров, среди которых возможно будут и на 32-битном 2003 офисе, можно ли как-то решить этот вопрос, не отсекая макросу возможность работать в старых VBA? Заранее спасибо за ответы.

Последний раз редактировалось Аватар; 01.05.2016 в 07:37.
Shuma1974 вне форума Ответить с цитированием
Старый 01.05.2016, 07:42   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Погуглите код #IF WIN32....#THEN....
В разделе він32 прописать без птрсейф а в если с птрсейф. Может поможет
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 01.05.2016, 09:10   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
#If VBA7 Then    '  Office 2010-2013
    Declare PtrSafe Function Beep Lib "kernel32" (ByVal dwFreq As LongPtr, ByVal dwDuration As LongPtr) As LongPtr
#Else    '  Office 2003-2007
    Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If
как правильно записать остальные функции - посмотрите здесь
http://www.jkp-ads.com/Articles/apideclarations.asp
EducatedFool вне форума Ответить с цитированием
Старый 07.05.2016, 22:36   #4
Shuma1974
 
Регистрация: 01.05.2016
Сообщений: 6
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
#If VBA7 Then    '  Office 2010-2013
    Declare PtrSafe Function Beep Lib "kernel32" (ByVal dwFreq As LongPtr, ByVal dwDuration As LongPtr) As LongPtr
#Else    '  Office 2003-2007
    Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If
как правильно записать остальные функции - посмотрите здесь
http://www.jkp-ads.com/Articles/apideclarations.asp
Цитата:
Public Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As LongPtr) As LongPtr
Private Declare PtrSafe Function getTickCount Lib "kernel32" () As LongPtr
Declare PtrSafe Function Beep Lib "kernel32" (ByVal dwFreq As LongPtr, ByVal dwDuration As LongPtr) As LongPtr
Вот это я пробовал. Писал по шаблону beep (именно этих функций по ссылке не нашел). Не работает для 2 функций. GetAsyncKeyState не ругается, но, судя по всему, возвращает ненулевые значения на ненажатую клавишу. А getTickCount ругается (то ей can't find entry to Kernel32 dll, то type mysmatch, то invalid argument в зависимости от записи LongPtr, Long или LongLong на выходе.
Shuma1974 вне форума Ответить с цитированием
Старый 13.05.2016, 08:51   #5
Shuma1974
 
Регистрация: 01.05.2016
Сообщений: 6
По умолчанию

Вопрос к сожалению все еще актуален.Как увязать вышеупомянутые функции API с 7 vba и 64-битной Виндой?
Shuma1974 вне форума Ответить с цитированием
Старый 13.05.2016, 08:59   #6
Shuma1974
 
Регистрация: 01.05.2016
Сообщений: 6
По умолчанию

Повторюсь: объявление не работает для 2 функций (GetAsyncKeyState и getTickCou nt - по ссылке я их не нашел, поэтому писал объявление по мотивам Beep согласно своему очень неполному на текущий момент разумению в этом вопросе). GetAsyncKeyState не ругается, но, судя по всему, возвращает ненулевые значения на ненажатую клавишу. А getTickCount ругается (то ей can't find entry to Kernel32 dll, то type mysmatch, то invalid argument в зависимости от записи LongPtr, Long или LongLong на выходе.

Последний раз редактировалось Shuma1974; 13.05.2016 в 09:02.
Shuma1974 вне форума Ответить с цитированием
Старый 13.05.2016, 14:53   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
getTickCount - по ссылке я их не нашел
а почему я нашёл? (по той же ссылке, - ввёл в поиск по странице getTickCount)

Код:
Private Declare Function getTickCount Lib "kernel32" Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long

Private Declare PtrSafe Function getTickCount Lib "kernel32" Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long
вторая функция - GetAsyncKeyState - легко гуглится запросом
Declare PtrSafe Function GetAsyncKeyState

и что мы находим?
Код:
#If VBA7 Then
    Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#Else
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#End If
тут добавляется только PtrSafe - т.к. функция LongPtr надо ставить только там, где идёт работа с 64-битными указателями
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Соглашение о вызове функций (выравнивание стека) Полный 30h Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 27 29.12.2014 20:07
проблема при вызове recv MegabyteS Работа с сетью в Delphi 2 07.08.2013 14:26
не хватает ОП при вызове imagecreatefromjpeg SkrudjMakdak PHP 5 10.08.2011 16:36
при получении из внешних данных segail Microsoft Office Excel 4 03.04.2010 16:03