Шаг 17 - Win32 API и VBA

На данный момент использование Win32 API является стандартом для любой среды или языка программирования, это и понятно, как иначе писать программы для Windows ? Вместе с тем пользоваться этим же API надо осторожно, реализации в версиях Windows отличаются вплоть до присутсвия некоторых функций. Для того, чтобы использовать функции Win 32 API их необходимо объявить, используя Declare.

В общей области (в описании) надо объявить функцию. Сделать это можно поднявшись на самую верхнюю строчку окна редактирования макроса и ввести описание.

Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal buffer As String, ByVal nSize As Long) As Long

Вот тут-то Вы и должны быть поражены. Говорят VBA это для ...... Так вот. Использовать подобную функцию на VC++ намного проще. Во-первых, Вам наверно всё равно, где она находится :-))) в kernel, user или gdi, и вам вообще-то и не надо знать её имя в виде GetWindowsDirectoryA, а если вы пользуетесь каркасной библиотекой типа MFC, то часто получаете упрощеный вид функции типа AfxMessageBox. Вот и думай теперь чего проще :-))

Давайте на Declare посмотрим повнимательнее. У него два синтаксиса для функции или процедуры.

REM то что в скобках необязательно
[Public или Private] Declare Sub имя_процедуры lib "имя_динамической_библиотеки" [Alias "псевдоним"] [(параметры)]
[Public или Private] Declare Function имя_процедуры lib "имя_динамической_библиотеки" [Alias "псевдоним"] [(параметры)] [as тип возврата]

Вот так надо знать где находится и псевдоним, если нужно и все параметры. Вот он язык для домохозяек :-)

А теперь применение. Вот тут все стало опять просто.

Sub Test()
	Dim buffer As String
	Dim lens As Long
	buffer = String(256, 0)
	lens = GetWindowsDirectory(buffer, Len(buffer))
	buffer = Left(buffer, lens)
	MsgBox (buffer)
End Sub

Объявляю переменные, buffer = String(256, 0) - заполняю строку нулями имитируя строку символов char. Зачем ? Ну есть подозрение, что Windows написан на C или ASM, даже без ++ и поэтому другого он не понимает :-), не на бейсике точно. Вызываем функцию, передавая параметры. Полученную строку обрезаем функцией Left.

Наверно лучше создавать описания в отдельном модуле и просто его экспортировать в проект, дабы не мучаться. И, наверно, есть уже готовые модули. Но этот метод позволяет Вам подключить любую динамическую библиотеку. Посмотрите в разделе MFC шаг за шагом : "Шаг 46 - Dll для Excel".


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.