FAQ по Visual Basic

Содержание / Использование сторонних компонентов Поиск | Далее

§ 4.6. Как вызвать cdecl-функцию?

Для этого я написал на ассемблере маленькую библиотеку-переходник CallProc. Вот декларации для нее:

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)

Обратите внимание, что на самом деле здесь используется не количество аргументов как таковых, а размер в DWORD-ах занимаемой ими памяти. Т. о., если аргумент имеет тип Byte или Integer, то он все равно будет выровнен на 4 байта; а если он имеет тип Double, то в стеке он займет два двойных слова.

Можно упростить вызов функции, описание которой известно, следующим образом (спасибо за идею Антону Лобастову):

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, то к ее описанию после адреса добавляется еще один параметр — размер фрейма аргументов.

Следующий метод создает функцию-переходник cdecl — stdcall, которую можно будет использовать в качестве callback-а.

Declare Function CreateCallBackC Lib "callproc.dll" _
    (ByVal lpProc As Long, _
    ByVal nArgs As Long) As Long

Ей передается адрес вашей функции и количество ее аргументов. Возвращаемое значение — адрес сгенерированного callback-а.

Автор:
Master

Предыдущий раздел Следующий раздел

© 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу.