powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Определить адрес функции...
17 сообщений из 17, страница 1 из 1
Определить адрес функции...
    #32611330
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, помогите, пожалуйста, кто знает! Хочу получить адрес функции.
Нашла функцию API :
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Если это верно, надо вначале найти handler модуля, Пытаюсь так

Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Dim rez As Long
rez = GetModuleHandle("basSearch")

Все время получаю 0!!! Что делаю не так?
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32611372
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetProcAddress - для получения адреса функции из дин. библиотеки Dll, а ты хочешь получить адрес на функцию из своего же проекта? это никак тогда не покатит.
Во первых, зачем это?
Во вторых, это для тебя они в проекте - функции, а в скомпиллированном файле, весь твой код все равно что винигред, никаких функций там уже нет (разве что ссылки на вызовы API функций). Твоих функций просто уже не существует, они остались только в твоем воображении.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
     'We're going to call an API-function, without declaring it!
 
    Dim lb As Long, pa As Long
     'map 'user32' into the address space of the calling process.
 
    lb = LoadLibrary("user32")
     'retrieve the address of 'SetWindowTextA'
 
    pa = GetProcAddress(lb, "SetWindowTextA")
     'Call the SetWindowTextA-function
 
    CallWindowProc pa, Me.hWnd, "Hello !", ByVal  0 &, ByVal  0 &
     'unmap the library's address
 
    FreeLibrary lb

...
Рейтинг: 0 / 0
Определить адрес функции...
    #32611380
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The GetModuleHandle function retrieves a module handle for the specified module if the file has been mapped into the address space of the calling process.

Используйте LoadLibrary/FreeLibrary
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32611405
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо! Написала, конечно, глупость. на самом деле я пытаюсь найти замену в акцессе оператору AddressOf. Я уже находила в форуме такой топик
------------------------------------------------------------------------------
Есть API функция (EnumFontFamiliesEx) которая использует функцию с обратным вызовом.
В A2002 можно использовать для передачи адреса функции с обратным вызовом AddressOf.
Как можно и можно ли это сделать в Access 97.
AddressOf у меня не работает.
23 янв 03, 15:55 [113456] Цитировать
Re: Вопрос по API функциям
IgorM
Member

Откуда: Тула - Москва, транзит
Сообщений: 463 http://www.trigeminal.com/lang/1049/codes.asp?ItemID=19#19
----------------------------------------------------------------------------

Я нашла пример в Excel но чуть по другому адресу
http://www.trigeminal.com/lang/1033/codes.asp?ItemID=19#19

И попробовала вызвать функцию AddrOf(). К сожалению, не заработало...
Уже функция
lngResult = GetFuncID( _
hProject, strFuncNameUnicode, strID)
Ничего не записала в strID
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32611502
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Tamara
Указанная Вами функция должна работать в 97.

Возможно проблема связана с тем, что в Акцесс 97 используется помодульная загрузка проекта. То есть перед запуском AddrOf("FuncName") желательно вызвать явно какую-нибудь функцию из модуля, в котором рпасположена FuncName, для того, чтобы гарантировать загруженность модуля.

Кроме того, функция AddrOf, вообще говоря, не предназначена для работы с функциями классов.
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32611517
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерчик из www.trigeminal.com работает в 97, щас проверил. и без предварительного вызова
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613145
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответы, но к сожалению, не получилось...
Вначале тоже пыталась сделать, как в примере www.trigeminal.com , потом нашла по адресу http://am.rusimport.ru/MsAccess/topic.aspx?ID=405
пример только для этой функции , по-моему, это то же самое:
'-----------------------------------------------------------------------------
Public Function AddrOf(strFuncName As String) As Long
Dim hProject As Long
Dim lngResult As Long
Dim strID As String
Dim lpfn As Long
Dim strFuncNameUnicode As String

Const NO_ERROR = 0

' The function name must be in Unicode, so convert it.
strFuncNameUnicode = StrConv(strFuncName, vbUnicode)

' Get the current VBA project
' The results of GetCurrentVBAProject seemed inconsistent, in our tests,
' so now we just check the project handle when the function returns.
Call GetCurrentVbaProject(hProject)

' Make sure we got a project handle... we always should, but you never know!
If hProject <> 0 Then
' Get the VBA function ID (whatever that is!)
lngResult = GetFuncID( _
hProject, strFuncNameUnicode, strID)

' We have to check this because we GPF if we try to get a function pointer
' of a non-existent function.
If lngResult = NO_ERROR Then
' Get the function pointer.
lngResult = getAddr(hProject, strID, lpfn)

If lngResult = NO_ERROR Then
AddrOf = lpfn
End If
End If
End If
End Function
'---------------------------------------------------------------------
Я сделала отдельный модуль, в который просто скопировала целиком этот код и потом в отдельной форме сделала так:

Private Sub Command0_Click()

Dim rez As Long
rez = AddrOf("Func1")
End Sub

End Sub

Private Function Func1()
MsgBox "bbb"
End Function

Все равно же модуль с этой функцией успеет загрузиться?!
Что делаю не так???
Вообще-то я хочу написать потом свою WindowProc и затем подставить в
SetWindowLong
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613164
витек-ша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victosha2 Tamara
Указанная Вами функция должна работать в 97.

<тут покоцано>

Кроме того, функция AddrOf, вообще говоря, не предназначена для работы с функциями классов.

Вынесите свою функ в отдельный ОБЫЧНЫЙ модуль (не модуль класса/объекта акцесс), кроме того, квалификатор видимости private желательно снять.
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613259
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я и так сделала все в обычном модуле, а для проверки сделала обычную форму с кнопкой, на нажатие которой вызываю функцию AddrOf.
Как параметр передаю ей название функции, которую определила в этой же форме
'-----------------Kod v forme----------------
Private Sub Command0_Click()

Dim rez As Long
rez = AddrOf("Func1")
End Sub

End Sub

Private Function Func1()
MsgBox "bbb"
End Function
'---------------------------------------
На этапе вызова функции lngResult = GetFuncID( _
hProject, strFuncNameUnicode, strID) в strID ничего не заносится!
В результате получаю 0
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613326
Roma R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так
В модуль добавь функцию

Function GetAdrr(x As Long) As Long
GetAdrr = x
End Function

Затем получаеш адрес функции как
GetAdrr(AddressOf ИмяФункции)

Например
MsgBox GetAdrr(AddressOf ИмяФункции)
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613340
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, оператора AddressOf в акцессе97 нет! Я и пытаюсь с помощью функции AddrOf сделать то же самое!
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613379
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так....

Модуль TEST

Option Compare Database
Option Explicit
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lngParam As Long) As Long


Function CB(ByVal hwnd As Long, ByVal lngParam As Long) As Long
Debug.Print hwnd
CB = True
End Function

Sub CBTEST()
Call EnumWindows(AddrOf("CB"), 0)
End Sub

Модуль MOD_CALLBACK

Option Compare Database
Option Explicit

'-------------------------------------------------------------------------------------------------------------------
' Declarations
'
' These function names were puzzled out by using DUMPBIN /exports
' with VBA332.DLL and then puzzling out parameter names and types
' through a lot of trial and error and over 100 IPFs in MSACCESS.EXE
' and VBA332.DLL.
'
' These parameters may not be named properly but seem to be correct in
' light of the function names and what each parameter does.
'
' EbGetExecutingProj: Gives you a handle to the current VBA project
' TipGetFunctionId: Gives you a function ID given a function name
' TipGetLpfnOfFunctionId: Gives you a pointer a function given its function ID
'
'-------------------------------------------------------------------------------------------------------------------

Private Declare Function GetCurrentVbaProject Lib "vba332.dll" Alias "EbGetExecutingProj" (hProject As Long) As Long
Private Declare Function GetFuncID Lib "vba332.dll" Alias "TipGetFunctionId" (ByVal hProject As Long, ByVal strFunctionName As String, ByRef strFunctionId As String) As Long
Private Declare Function GetAddr Lib "vba332.dll" Alias "TipGetLpfnOfFunctionId" (ByVal hProject As Long, ByVal strFunctionId As String, ByRef lpfn As Long) As Long

'-------------------------------------------------------------------------------------------------------------------
' AddrOf
'
' Returns a function pointer of a VBA public function given its name. This function
' gives similar functionality to VBA as VB5 has with the AddressOf param type.
'
' NOTE: This function only seems to work if the proc you are trying to get a pointer
' to is in the current project. This makes sense, since we are using a function
' named EbGetExecutingProj.
'-------------------------------------------------------------------------------------------------------------------
Public Function AddrOf(strFuncName As String) As Long
Dim hProject As Long
Dim lngResult As Long
Dim strID As String
Dim lpfn As Long
Dim strFuncNameUnicode As String

Const NO_ERROR = 0

' The function name must be in Unicode, so convert it.
strFuncNameUnicode = StrConv(strFuncName, vbUnicode)

' Get the current VBA project
' The results of GetCurrentVBAProject seemed inconsistent, in our tests,
' so now we just check the project handle when the function returns.
Call GetCurrentVbaProject(hProject)

' Make sure we got a project handle... we always should, but you never know!
If hProject <> 0 Then
' Get the VBA function ID (whatever that is!)
lngResult = GetFuncID( _
hProject, strFuncNameUnicode, strID)

' We have to check this because we GPF if we try to get a function pointer
' of a non-existent function.
If lngResult = NO_ERROR Then
' Get the function pointer.
lngResult = GetAddr(hProject, strID, lpfn)

If lngResult = NO_ERROR Then
AddrOf = lpfn
End If
End If
End If
End Function
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613406
Roma R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример для Access 95 (думаю будет работать в 97)
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613567
витёк-ша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TamaraЯ и так сделала все в обычном модуле, а для проверки сделала обычную форму с кнопкой, на нажатие которой вызываю функцию AddrOf.
Как параметр передаю ей название функции, которую определила в этой же форме
'-----------------Kod v forme----------------
<ТУТ ПОКОЦАНО...>
Private Function Func1()
MsgBox "bbb"
End Function
'---------------------------------------
На этапе вызова функции lngResult = GetFuncID( _
hProject, strFuncNameUnicode, strID) в strID ничего не заносится!
В результате получаю 0

Func1 у Вас в модуле ФОРМЫ???
Перенесите в ОБЫЧНЫЙ модуль и снимите квалификатор видимости Private.
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613588
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо. к сожалению, файл db1 у меня не запустился... Пример, который прислал Alexey Sh действительно работает - это тот же код , что и был раньше, просто для функции Function CB(ByVal hwnd As Long, ByVal lngParam As Long) As Long можно определить AddrOf, даже без передачи в EnumWindows, - просто получить возвращаемое значение функции - число.
А я надеялась , что можно передать любую функцию, с любыми параметрами или вообще без параметров - и тоже получить результат!!!

В конце концов хотела передать свою Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Что, в AddrOf можно передать только функцию с опред. параметрами???
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613607
витёк-ша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tamara
<...>
Что, в AddrOf можно передать только функцию с опред. параметрами???

НЕТ. В AddrOf можно передать функию с любыми параметрами.

PS
Tamara, AddrOf - функция очень ограниченного применения в 97 офисе.
Разобраться и запустить - для тренировки - полезно.
Увлекаться, пожалуй, не стоит.
...
Рейтинг: 0 / 0
Определить адрес функции...
    #32613621
Tamara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно... жалко, конечно.... хотелось просто сделать так:

Public Function WindowProc(ByVal hwnd As Long, _
Select Case uMsg
Case WM_MouseWheel
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
End Function

Public Sub SubClassHookForm()
lpPrevWndProc = SetWindowLong(Forms!frm_catalog.Form.hwnd, GWL_WNDPROC, AddrOf("WindowProc"))
End Sub

Хотелось просто прибить мышку... ( А в акцесс2000 с оператором AddressOf все работает...)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Определить адрес функции...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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