|
|
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Люди, помогите, пожалуйста, кто знает! Хочу получить адрес функции. Нашла функцию 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!!! Что делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 18:08:02 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
GetProcAddress - для получения адреса функции из дин. библиотеки Dll, а ты хочешь получить адрес на функцию из своего же проекта? это никак тогда не покатит. Во первых, зачем это? Во вторых, это для тебя они в проекте - функции, а в скомпиллированном файле, весь твой код все равно что винигред, никаких функций там уже нет (разве что ссылки на вызовы API функций). Твоих функций просто уже не существует, они остались только в твоем воображении. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 18:29:44 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 18:34:27 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Большое спасибо! Написала, конечно, глупость. на самом деле я пытаюсь найти замену в акцессе оператору 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 18:49:48 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
2 Tamara Указанная Вами функция должна работать в 97. Возможно проблема связана с тем, что в Акцесс 97 используется помодульная загрузка проекта. То есть перед запуском AddrOf("FuncName") желательно вызвать явно какую-нибудь функцию из модуля, в котором рпасположена FuncName, для того, чтобы гарантировать загруженность модуля. Кроме того, функция AddrOf, вообще говоря, не предназначена для работы с функциями классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 21:08:54 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
примерчик из www.trigeminal.com работает в 97, щас проверил. и без предварительного вызова ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 21:29:42 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за ответы, но к сожалению, не получилось... Вначале тоже пыталась сделать, как в примере 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:24:48 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Victosha2 Tamara Указанная Вами функция должна работать в 97. <тут покоцано> Кроме того, функция AddrOf, вообще говоря, не предназначена для работы с функциями классов. Вынесите свою функ в отдельный ОБЫЧНЫЙ модуль (не модуль класса/объекта акцесс), кроме того, квалификатор видимости private желательно снять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:32:56 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Я и так сделала все в обычном модуле, а для проверки сделала обычную форму с кнопкой, на нажатие которой вызываю функцию 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:58:41 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Попробуй так В модуль добавь функцию Function GetAdrr(x As Long) As Long GetAdrr = x End Function Затем получаеш адрес функции как GetAdrr(AddressOf ИмяФункции) Например MsgBox GetAdrr(AddressOf ИмяФункции) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 17:26:18 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
К сожалению, оператора AddressOf в акцессе97 нет! Я и пытаюсь с помощью функции AddrOf сделать то же самое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 17:32:36 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Так.... Модуль 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 17:50:58 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Пример для Access 95 (думаю будет работать в 97) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 18:00:19 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
TamaraЯ и так сделала все в обычном модуле, а для проверки сделала обычную форму с кнопкой, на нажатие которой вызываю функцию AddrOf. Как параметр передаю ей название функции, которую определила в этой же форме '-----------------Kod v forme---------------- <ТУТ ПОКОЦАНО...> Private Function Func1() MsgBox "bbb" End Function '--------------------------------------- На этапе вызова функции lngResult = GetFuncID( _ hProject, strFuncNameUnicode, strID) в strID ничего не заносится! В результате получаю 0 Func1 у Вас в модуле ФОРМЫ??? Перенесите в ОБЫЧНЫЙ модуль и снимите квалификатор видимости Private. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 19:01:54 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо. к сожалению, файл 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 можно передать только функцию с опред. параметрами??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 19:15:58 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Tamara <...> Что, в AddrOf можно передать только функцию с опред. параметрами??? НЕТ. В AddrOf можно передать функию с любыми параметрами. PS Tamara, AddrOf - функция очень ограниченного применения в 97 офисе. Разобраться и запустить - для тренировки - полезно. Увлекаться, пожалуй, не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 19:29:01 |
|
||
|
Определить адрес функции...
|
|||
|---|---|---|---|
|
#18+
Ладно... жалко, конечно.... хотелось просто сделать так: 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 все работает...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 19:39:19 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32613621&tid=1673064]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 296ms |

| 0 / 0 |
