Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
SergeyA
18 / 0 / 0
Регистрация: 03.07.2011
Сообщений: 64
1

Вызов функции по указателю с параметрами

28.07.2012, 10:42. Просмотров 1385. Ответов 2
Метки нет (Все метки)

Здравствуйте, видел пример как это можно сделать, но примеры не рабочие, либо я не так что - то делаю, как передать параметры и выполнить функцию?

ActiveX Dll на VB6

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Integer)
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Function GlobalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
 
Public Function DllOpen(ByVal DllName As String) As Long
    DllOpen = LoadLibrary(DllName)
End Function
 
Public Function DllClose(ByVal hModule As Long) As Long
    DllClose = FreeLibrary(hModule)
End Function
 
Public Function DllCall(ByVal hModule As Long, ByVal lpProcName As String, ParamArray Param()) As Long
    Dim lpPoint As Long
    Dim hGlobal As Long
    Dim hGlobalOffset As Long
    Dim Ret As Long
    Dim i As Integer
    
    lpPoint = GetProcAddress(hModule, lpProcName)
    hGlobal = GlobalAlloc(&H0, 5 * UBound(Param))
    hGlobalOffset = hGlobal
    For i = LBound(Param) To UBound(Param)
        PutMem2 hGlobalOffset, &H68
        hGlobalOffset = hGlobalOffset + 1
        PutMem4 hGlobalOffset, CLng(Param(i))
        hGlobalOffset = hGlobalOffset + 4
    Next
    
    PutMem2 hGlobalOffset, &HE8
    hGlobalOffset = hGlobalOffset + 1
    PutMem4 hGlobalOffset, lpPoint - hGlobalOffset - 4
    hGlobalOffset = hGlobalOffset + 4
    PutMem4 hGlobalOffset, &H10C2&
    
    Ret = CallWindowProc(hGlobal, 0&, 0&, 0&, 0&)
    
    GlobalFree (hGlobal)
    DllCall = Ret
End Function
Для примера и тестирования взял обычный VBScript

Visual Basic
1
2
3
4
5
6
Dim hModule
Dim lpFunc
Set WinAPI = CreateObject("WinAPI.Wrapper")
hModule = WinAPI.DllOpen("user32.dll")
lpFunc = WinAPI.DllCall(hModule, "MessageBoxA", 0, 0, 0, 0)
WinAPI.DllClose(hModule)
При вызове MessageBoxA да и любой другой - вываливается ошибка, то память не может быть Written, либо просто процесс wscript.exe завершается, в чём проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2012, 10:42
Ответы с готовыми решениями:

Вызов функций по указателю
Введение Как известно, прямой работы с указателями в VB нет. Однако есть...

Вызов любых функций по указателю
Пока не работал форум, ковырялся в рантайме VB :). Иследуя функции VBA6...

Вызов функции из COM+ приложения
В базе хранится (к примеру) BA_BIZLG.clsLogic.CountRests, где BA_BIZLG - имя...

Вызов API-шной функции.
'--------------------------------------------------- ' Вот декларации: '...

Вызов функции из значения поля таблицы БД
Добрый день. Нужна помощь экспертов. У меня в модуле (V_KONH_VKS) есть...

2
SoftIce
comment ca va
10452 / 3964 / 1013
Регистрация: 27.07.2011
Сообщений: 9,619
Завершенные тесты: 1
29.07.2012, 22:41 2
Да вроде всё правильно работает.
Вот скриншот программы, использующей твою Dll (Только я на скорую руку не переименовал Dll,поэтому она у меня называется project1):
Вызов функции по указателю с параметрами

Может ты криво Dll написал, скомпилировал или не подключил?
0
SergeyA
18 / 0 / 0
Регистрация: 03.07.2011
Сообщений: 64
29.07.2012, 22:46  [ТС] 3
Так дело в том что я тестировал в AutoIt - работает без ошибок, а в VBScript вылетает сразу... и ещё, как передать параметры - уже сделал, но при этом нужно вызывать не MessageBoxA а MessageBoxW так как напрямую строку не получится передать, для этого используем StrPtr() но она работает с юникодом... это первая практика на VB6
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 22:46

Обратный вызов из API-функции waveInOpe.
Люди помогите разобраться с обратным вызовом из API-функции waveInOpe. А...

Вызов функции в момент myForm.Enabled = True
У меня в проекте есть главная форма, из которой вызываются много других форм. В...

Как организовать вызов пользовательской функции из текстового файла??
Добрый день! Суть проблемы: в коде программы есть рад самописных функций. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru