| FAQ по Visual Basic |
| Содержание / Использование сторонних компонентов |
|
|
§ 4.6. Как вызвать cdecl-функцию?
Для этого я написал на ассемблере маленькую
Declare Function CallByPtrL Lib "callproc.dll" _
(ByVal lpProc As Long, _
lpList As Any, _
ByVal nArgs As Long) As Long
Declare Function CallByPtrLC Lib "callproc.dll" _
(ByVal lpProc As Long, _
lpList As Any, _
ByVal nArgs As Long) As Long
Эти два метода вызывают функцию (stdcall и cdecl соответственно), используя готовый фрейм аргументов. Например, в этом коде вызываемая функция принимает два аргумента: Dim Args(1 To 2) As Long, Res As Long Args(1) = 10 Args(2) = 20 Res = CallByPtrL(pMyProc, Args(1), 2)
Обратите внимание, что на самом деле здесь используется
не количество аргументов как таковых, а размер
в Можно упростить вызов функции, описание которой известно, следующим образом (спасибо за идею Антону Лобастову):
Declare Function MyProc Lib "callproc.dll" _
Alias "CallByPtr" _
(ByVal lpProc As Long, _
ByVal Arg1 As Long, _
ByVal Arg2 As Long) As Long
Declare Function MyProc_С Lib "callproc.dll" _
Alias "CallByPtrС" _
(ByVal lpProc As Long, _
ByVal Args As Long, _
ByVal Arg1 As Long, _
ByVal Arg2 As Long) As Long
...
Res = MyProc(pFunction, 10, 20)
Res = MyProc_C(pFunction_CDecl, 2, 20, 30)
Первым аргументом должен быть адрес функции; после этого идет реальный список ее аргументов. Если функция использует соглашение cdecl, то к ее описанию после адреса добавляется еще один параметр — размер фрейма аргументов.
Следующий метод создает
Declare Function CreateCallBackC Lib "callproc.dll" _
(ByVal lpProc As Long, _
ByVal nArgs As Long) As Long
Ей передается адрес вашей функции и количество ее аргументов.
Возвращаемое значение — адрес сгенерированного
Автор: |
||
| Предыдущий раздел | Следующий раздел |
| © 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу. |