Народ, помогите разобраться. С этим делом ещё не приходилось работать. Суть вот в чём:
Нужно передать параметры в функцию, в dll - переменная channel и 2 массива из трёх элементов Pos и vel. Проблема такая - указать Pos и vel нужно без индексов на элементы. А компиллер ругается, требует указывать индекс элементов, пишет про ByRef.
'объявление функции следующее:
Public Declare Function FSOUND_3D_SetAttributes Lib "fmod.dll" Alias "_FSOUND_3D_SetAttributes@12" (ByVal channel As Long, ByRef Pos As Single, ByRef vel As Single) As Byte
Dim Pos1(0 To 2) As Single Dim vel1(0 To 2) As Single
Да, прикольные вопросы сегодня. Один тип определяет внутри самого себя, другой массив передает как Single... Народ, сегодня что, магнитные бури что ли?
Определения все правильные. Если указывать Pos1(0) и vel1(0), то будут посланы первые по индексу значения, а мне надо впихать сразу все элементы массива. Вот как выглядит пример на делфи и си, тут всё просто. А как бы на бейсике?
function FSOUND_3D_SetAttributes(Channel: Integer; Pos: PFSoundVector; Vel: PFSoundVector): ByteBool; stdcall;
Почему то везде разные типы. Возможно, что const float это тот же Single, (в делфях - ни бум-бум), но почему используется и указатели и PFSoundVector - непонятно. Четыре разных типа передаваемого значения. Они что, все одно и тоже?
Надо было сразу С++ выкладывать декларацию я люблю С++ а он меня нет почему то ну ладно... +)))
ну возвращает функция signed char в басике кроме BYTE ничто не заменит
int channel - byval chanel as Long
const float *pos - узнай размер типа float .. и всё.. хотя люббой указатель это ДВОРД ... в басике Long соотсвено то бишь byval pos as long с последним тоже самое...
теперь просто узнай размер .. типа float и если этот тип равен по размеру типу single то
pos as single ну а функцию толкаешь....
VarPtr(pos)
и так если никто нчего не понял то дикларация выгледит так
Public Declare Function FSOUND_3D_SetAttributes Lib "fmod.dll" Alias "_FSOUND_3D_SetAttributes@12" (ByVal channel As Long, ByVal pos As Long, ByVal vel As Long) As Byte
оттуда так как функцию как я понимаю он написал на Си++ так? ну вот ... и выложил он её... соотсвенно она и есть верная и из ходя из неё надо написать определение под ВБ а не из всяких там Делфи шмелфи и тд...
так вот размер данных float равен четыре байта соотсвенно аналогом в ВБ будет Single который тоже занимает те же 4 байта... и они оба с прлавующей точкой значения... так вот .... как я писал до этого если судить по С++ декларации а именно она будет верной то
Public Declare Function FSOUND_3D_SetAttributes Lib "fmod.dll" Alias "_FSOUND_3D_SetAttributes@12" (ByVal channel As Long, ByVal pos As Long, ByVal vel As Long) As Byte
является правильной декларацие на ВБ...
теперь он хочет вызвыать эту функцию.. всё просто
Dim Pos1(0 To 2) As Single
Dim vel1(0 To 2) As Single
Dim set_3d As Byte
Pos1(0) = -1
Pos1(1) = -1
Pos1(2) = -1
vel1(0) = 0
vel1(1) = 0
vel1(2) = 0
set_3d = Dim set_3d As Byte(0, VarPtr(Pos1(0)), VarPtr(vel1(0)))
И это будет обсалютно грамотным вызовом функции соотсвенно для вторых элементов масива надо индекс сделать 1 и для последних 2.. ну и всё.. что непонятно?
Если ты хочешь передать все эелементы масива а сама функция их не "возьмёт" то ты их и не передашь а если она функция подорузомевает ссылку на масив из 3 элементов то как я сказал .. должно всё выполнятся прекрастно
Похоже, что чел пытается передать массив элементов пользовательского типа, при этом передавая его зачем-то как Single. В этом и проблема. И ему самому надо разобраться, то ли передавать Single, то ли передавать указатель на массив - т.е. Long.