Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > 49 (неверное соглашения о вызовах dll) Access97


Автор: zayac 12.3.2006, 15:52
Необходимо вставить в Access 97 dll, для работы с внешним устройством. Dll написана в Delphi, там одна функция и объявляется она так:
Код

function GetCard(Port: integer; var FCard: byte; var NCard: integer): boolean

Когда проверяешь dll через делфи то все работает.


Код в Access97:
Код

Option Explicit
 Private Declare Function GetCard Lib "cr12001.dll" (Port As Integer, FCard As Byte, NCard As Integer) As Boolean

Private Sub Кнопка0_Click()
 Dim id As Integer
 Dim fc As Byte
 Dim nc As Integer
 Dim op As Boolean
 id = 1
 op = GetCard(id, fc, nc)
  DoCmd.TransferDatabase acLink, "dBase IV", "C:\ZayaC\", acTable, "cr-obed.dbf", "CR_OBED", False
  id = DLookup("[ID]", "CR_OBED", "[FCard]=" & Str(fc) & " and [NCard]=" & Str(nc))
  MsgBox (Str(id))
  DoCmd.DeleteObject acTable, "CR_OBED"
End Sub


Выдает ошибку выполнения 49 "Неверные соглашения о вызовах dll"
Вопрос как заставить в Access(е) енто дело работать? Пробовал через ByVal некоторые значения передовать, все равно не хочет.

Автор: Akina 13.3.2006, 10:52
Если я не ошибаюсь, в Дельфовом коде функция должна быть объявлена ка вызываемая с Сишным интерфейсом - cdecl или как оно там в Дельфах... именно на это тебе указывает сообщение об ошибке.

Автор: zayac 13.3.2006, 20:53
Все равно нехочет даже если в Делфи объявить функцию как cdecl.
Игра с ByVal и ByRef результата не дает.

*********************************************************
Все вопрос снят, проблема решилась следующим образом:
Код

function GetCard(Port: integer; var FCard: integer; var NCard: integer): integer; stdcall; export;


в Access(e)
Код

Private Declare Function GetCard Lib "cr12001.dll" (ByVal Port As Integer, ByRef FCard As Long, ByRef NCard As Long) As Long

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)