![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос по dll [D6, Win95/98]
ol © (2002-05-15 00:16:00)Привет
Не могли бы вы подсказать
есть 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-ка рабочая т.к. прилагаемая тестовая программа работает
Подскажите мож я че не так делаю
Олег
ol (2002-06-03 17:07:00) [1]порылся тут и понял что скорей всего dll - 16 разрядная,
исходя из этого просто так ее не вызовеш :-((
Севостьянов Игорь (2002-05-25 23:13:00) [2]Не знаю - может я не прав, но по-моему в 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 примером)
Andykor (2002-05-18 09:26:00) [3]Или так
function OPEN_ASYCOM port:integer;baud:integer;bits:integer;slaves:integer):integer;
stdcall;
Попробуй. B еще, если получиться, не передавай значения типа string, используй PСhar.
kig (2002-05-17 21:00:00) [4]Раз у Вас пашет VB с этой dll, то скорее всего дело в модификаторе вызова
function OPEN_ASYCOM(port:integer;baud:integer;bits:integer;slaves:integer):integer;
cdecl;
ol (2002-05-17 16:24:00) [5]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
Andykor (2002-05-17 13:00:00) [6]А примерчик на VB покажи.
ol (2002-05-17 01:56:00) [7]неа, и это не помогло
Krok (2002-05-16 12:35:00) [8]А не пробовал так:
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-15 21:17:00) [9]да нет это ф-ции или процедуры
там с этой dll есть скудненький пример на визуал бейсике
где видно что объявляется эти функции а потом используются
попытался аналогично наворотить на делфи, результат смотри выше
:-((
BAHO (2002-05-15 05:07:00) [10]А может это не функции и процедуры
а сообщения...
или неправильно указал параметры...