Форум: "Система";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Внизвопрос по dll Найти похожие ветки
← →
ol (2002-05-15 00:16) [0]Привет
Не могли бы вы подсказать
есть dll-ка asycom.dll - драйвер для работы с электронными весами
вот кусок текста полученного с помощью программы tdump
Non-Resident Name Table offset: 0109h
Module Description: "ASYCOM.DLL"
Name: WRITE_SLAVE Entry: 6
Name: CLOSE_ASYCOM Entry: 4
Name: WATCHDOG_ASYCOM Entry: 5
Name: OPEN_SLAVE Entry: 8
Name: RETRY_ASYCOM Entry: 2
Name: OPEN_ASYCOM Entry: 3
Name: CLOSE_SLAVE Entry: 9
Name: READ_SLAVE Entry: 7
я так понимаю что это функции(или процедуры?)
Объявляю в проекте эту dll так
implementation
function OPEN_ASYCOM(port:integer;baud:integer;bits:integer;slaves:integer):integer;
stdcall;
external "asycom.dll";
{$R *.dfm}
компилирую, запускаю все нормально
пробую на кнопку повесить открытие open_asycom
procedure TForm1.Button1Click(Sender: TObject);
begin
open_asycom(1,2400,8,1);
end;
компилирую все нормально
при попытке запустить выдает ошибку что "по-видимому asycom.dll поврежден" и вторая "присоединенное к системе устройство не работает"
хотя я точно знаю что dll-ка рабочая т.к. прилагаемая тестовая программа работает
Подскажите мож я че не так делаю
Олег
← →
BAHO (2002-05-15 05:07) [1]А может это не функции и процедуры
а сообщения...
или неправильно указал параметры...
← →
ol (2002-05-15 21:17) [2]да нет это ф-ции или процедуры
там с этой dll есть скудненький пример на визуал бейсике
где видно что объявляется эти функции а потом используются
попытался аналогично наворотить на делфи, результат смотри выше
:-((
← →
Krok (2002-05-16 12:35) [3]А не пробовал так:
Interface
function OPEN_ASYCOM(port:integer;baud:integer;bits:integer;slaves:integer):integer;
{$EXTERNALSYM OPEN_ASYCOM}
implementation
function OPEN_ASYCOM(port:integer;baud:integer;bits:integer;slaves:integer):integer;
external "asycom.dll" name "OPEN_ASYCOM";
← →
ol (2002-05-17 01:56) [4]неа, и это не помогло
← →
Andykor (2002-05-17 13:00) [5]А примерчик на VB покажи.
← →
ol (2002-05-17 16:24) [6]Option Compare Database "Verwenden der Datenbank-Sortierreihenfolge beim Vergleich von Zeichenfolgen.
Private Declare Function OPEN_ASYCOM Lib "asycom.dll" (ByVal port As Integer, ByVal Baud As Integer, ByVal bits As Integer, ByVal SLAVES As Integer) As Integer
Private Declare Function CLOSE_ASYCOM Lib "asycom.dll" () As Integer
Private Declare Function OPEN_SLAVE Lib "asycom.dll" (ByVal Slave As Integer, ByVal Adr As Integer) As Integer
Private Declare Function CLOSE_SLAVE Lib "asycom.dll" (ByVal Slave As Integer) As Integer
Private Declare Function Write_Slave Lib "asycom.dll" (ByVal Slave As Integer, ByVal Length As Integer, ByVal writedata$) As Integer
Private Declare Function READ_SLAVE Lib "asycom.dll" (ByVal Slave As Integer, Length As Integer, ByVal readdata$) As Integer
Dim Com_Status As Integer
Dim Com_Timeout As Integer
Dim Com_TelgrTimeout As Integer
Dim Ab As Workspace
Dim Dn As Recordset
Dim Dbase As Database
Private Sub BTN_Send_Click()
Dim I As Integer
TXT_Send.SetFocus
If TXT_Send.Text <> "" Then
I = Write_Slave(1, Len(TXT_Send.Text), TXT_Send.Text)
TXT_Send.Text = ""
End If
End Sub
Private Sub BTN_WriteDbase_Click()
On Error Resume Next
Dn.AddNew
Dn![Rx] = Text14.Caption
Dn.Update
End Sub
Private Sub Form_Load()
Dim I As Integer
On Error Resume Next
Set Ab = DBEngine.Workspaces(0)
Set Dbase = Ab.OpenDatabase("C:\ACCESS.MDB")
Set Dn = Dbase.OpenRecordset("RX")
I = OPEN_ASYCOM(2, 4800, 7, 1)
I = OPEN_SLAVE(1, 65)
End Sub
Private Sub Form_Timer()
Dim Telgr As String * 256
Dim TelgrLen As Integer
Dim Rx As String
Dim Tx As String
Dim I As Integer
Dim J As Integer
Dim TimeOut As Integer
Dim Slave As Integer
Dim Buff As String
On Error Resume Next
"**********************************************************
"
"
" Den nдchsten Slave auswдhlen, Timeouts ьberprьfen und
" prьfen ob Slave ok ist und Telegramm vorliegt
"
"**********************************************************
" If Com_Enabled = True Then
TimeOut = Com_TelgrTimeout
If TimeOut > 0 And Com_Status = True Then
TimeOut = TimeOut - 1
If TimeOut = 1 Then " Timeout abgelaufen
TimeOut = 0 " Telegrammwiederholung vorberteiten
End If
Com_TelgrTimeout = TimeOut
End If
TelgrLen = 0
If READ_SLAVE(1, TelgrLen, Telgr) = -5 Then
If Com_Status = True Then
Com_Status = False
Text15.Caption = "Communication Off"
End If
Else
If Com_Status = False Then
Com_Status = True
Text15.Caption = "Communication On"
End If
"***********************************************************
" Empfangenes Telegramm interpretieren
"***********************************************************
If TelgrLen > 0 Then
Text14.Caption = Left$(Telgr, TelgrLen)
Com_TelgrTimeout = 0
End If
End If
" End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim I As Integer
On Error Resume Next
I = CLOSE_SLAVE(1)
I = CLOSE_ASYCOM()
Dn.Close
Dbase.Close
End Sub
← →
kig (2002-05-17 21:00) [7]Раз у Вас пашет VB с этой dll, то скорее всего дело в модификаторе вызова
function OPEN_ASYCOM(port:integer;baud:integer;bits:integer;slaves:integer):integer;
cdecl;
← →
Andykor (2002-05-18 09:26) [8]Или так
function OPEN_ASYCOM port:integer;baud:integer;bits:integer;slaves:integer):integer;
stdcall;
Попробуй. B еще, если получиться, не передавай значения типа string, используй PСhar.
← →
Севостьянов Игорь (2002-05-25 23:13) [9]Не знаю - может я не прав, но по-моему в Delphi функции из DLL объявляются так:
function OPEN_ASYCOM(Port, Baud, Bits, Slaves: Integer): Integer;
stdcall; external "asycom.dll" name "OPEN_ASYCOM";
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
i := open_asycom(1,2400,8,1);
end;
Попробуй так...
Можно конечно попробовать похимичить, но у меня нет ни DLL ни устройства (c VB примером)
← →
ol (2002-06-03 17:07) [10]порылся тут и понял что скорей всего dll - 16 разрядная,
исходя из этого просто так ее не вызовеш :-((
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c