В общем, VB вполне официально заявляет возможность поддерживать cdecl-функции.
Убедиться можно в этом хотя бы засунув в свой проект такую строчку:
Private Declare Sub Boombara CDecl Lib "foo.dll ()Если вы попытаетесь вызвать такую функцию из проекта, то получите скорее ошибку «Bad DLL calling convention». И если вы нажмёте на кнопку Help в окошечке с этой ошибкой, то в хелпе по этой ошибке можно найти вполне официальное заявление:
MSDN98 об ошибке 49 писал(а):Bad DLL calling convention (Error 49)Arguments passed to adynamic-link library (DLL) must exactly match those expected by the routine. Calling conventions deal with number, type, and order of arguments. This error has the following causes and solutions:
- Your program is calling a routine in a DLL that's being passed the wrong type of arguments.
Make sure all argument types agree with those specified in the declaration of the routine you are calling.
- Your program is calling a routine in a DLL that's being passed the wrong number of arguments.
Make sure you are passing the same number of arguments indicated in the declaration of the routine you are calling.
- Your program is calling a routine in a DLL, but isn't using the StdCall calling convention.
If the DLL routine expects argumentsby value, then make sure ByVal is specified for those arguments in the declaration for the routine.
- Your Declare statement for a Windows DLL includes CDecl.
For additional information, select the item in question and press F1.
Обратите внимание на последний пункт. В общем, об этом
на форуме писали ещё давно — в 2004 году. И для меня это тоже далеко не новость была. Как видно из того топика, поддержка вызова CDecl-функций открыта только для Macintosh-версий VB/VBA (главным образом для маковского Офиса).
И вот как раз сегодня упомянув в одном ICQ-шном разговоре эту фичу, меня вдруг осенило:
— А в TLB-то мы тоже можем указывать calling convention наших функций (и методов)Ну и был поставлен эксперимент.
Предположение было награждено удачным результатом!
Соглашение cdecl — поддерживается, и вызовы к нему совершенно правильно компилируются!Заодно я выяснил, не поддерживается ли в довесок ещё и fastcall: оказалось, что нет, не поддерживается, и VB IDE честно и открыто на fastcall-ные функции ругается:
---------------------------
Microsoft Visual Basic
---------------------------
Compile error:
Calling convention not supported by Visual Basic
---------------------------
ОК Справка
---------------------------
Но на stdcall и cdecl не ругается, и отлично компилирует в Native-код. А вот в P-код отлично не компилирует — падает. А поскольку когда проект работает в режиме отладки, он компилируется именно в P-код, то отлаживать проекты с вызовом cdecl-функций невозможно.
Невероятно грустно и досадно. Но я приложу все усилия, чтобы придумать либо как решить эту проблему, либо как обойти эту проблема чисто для режима отладки под IDE (потому что, напоминаю, компилируется в EXE файл всё замечательно).