правильный подбор типов для Dll

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Cобственно работаю с одной dll по ЕЦП
но есть подозрение что она не хочет со мной работать, так как я ей подсовываю не верный тип (от неё всегда один и тот же результат - не верный тип вх. параметров)
что требовалось:
Код:
Function nkiEnumDevices (no:integer; withcard:boolean; var name):byte
как это реализовалось на LS:
Код:
Declare Function nkiEnumDevices Lib "nkidll" (no As Integer, withcard As Boolean, sName As Variant) As Byte 

Dim i As Integer, j As Integer, s As String, w As Integer, v As Variant, mas(72) As String, no As Byte, withcard As Boolean 
Print		 "Existing readers:" 
i = 1 
no = 1 
Do 
v = mas 
withcard = False 
j = nkiEnumDevices(i, withcard, s) 
If j=0 Then 
Print s 
Else 
Exit Do 
End If 
i = i +1 
Loop While j<>0
если юзать аналогичные примера на С++ или Паскале то всё пашет
может я как-то не правильно задеклалировал функцию?
 
N

nvyush

В VBA при объявлении функций для строковых аргументов требовалось что-то типа ByVal sName As String
 
T

TIA

Не силён в Паскале. Какова размерность у типов integer, boolean? Каков тип у name?

Если integer - 2б
boolean - 2б
name - ASCII string
Тогда декларация такая
Declare Function nkiEnumDevices Lib "nkidll" (Byval no As Integer, Byval withcard As integer, ByVal sName As String) As integer
 
A

Akupaka

delphi - ls
integer - long
boolean - byte (?)
var name - byref name (вот тут уже не помню точно, но вроде это по ссылке)
 
T

TIA

delphi - ls
integer - long
boolean - byte (?)
var name - byref name (вот тут уже не помню точно, но вроде это по ссылке)

В Дельфи Паскалевский синтаксис.
long - это не размерность, а имя типа.
То, что это некий выходной параметр понятно. Не ясен его тип. Если строка - то это важно. Если указатель на другой тип то можно просто как Any декларировать.
 
A

Akupaka

В Дельфи Паскалевский синтаксис.
long - это не размерность, а имя типа.
То, что это некий выходной параметр понятно. Не ясен его тип. Если строка - то это важно. Если указатель на другой тип то можно просто как Any декларировать.
с некоторых пор, на сколько мне известно, паскаль в делфи стали называть делфи (язык).
про "long - это не размерность, а имя типа." не понял ниче, что ты хотел сказать? B)
я говорю, что переменную типа integer в делфи нельзя впихнуть в integer LS, только в Long.
не знаю чем отличается декларация as Any от as variant или от отсутствия типа :)
 
A

Akupaka

к стати, а формат вызова не может быть проблемой?
раньше паскаль генерил паскалевский, а не стандартный, а они вроде различны, не?..
 
T

TIA

про "long - это не размерность, а имя типа." не понял ниче, что ты хотел сказать?

Размер данных - это сколько байт памяти требуется для его хранения.
Например, сишный int в зависимости от платформы может иметь 2, 4 и более байт.

Variant от Any отличается тем, что размер переменной типа Variant - 16 байт, плюс размер содержащегося типа, а Any передаёт только указатель - 4 байта
 
A

Akupaka

Размер данных - это сколько байт памяти требуется для его хранения.
Например, сишный int в зависимости от платформы может иметь 2, 4 и более байт.
я понимаю, вот я по кол-ву байт и свожу :) и получается, что integer delphi = long ls
вроде как, эти от самой платформы не зависят
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!