Что нового

Ошибка "function" not found in the DLL file

w3d

Новичок
Сообщения
84
Репутация
3
Выходит ошибка @error = 3 "function" not found in the DLL file

Код:
Код:
$dll = DllOpen(@ScriptDir & "\SerialGate.dll")

If @error Then
    MsgBox(4096,"Error", "Error = " & @error)
Else
    MsgBox(4096, "Result", "Result = " & $dll)
EndIf

$result = DllCall($dll, "none", "Close")

If @error Then
    MsgBox(4096,"Error", "Error = " & @error)
Else
    MsgBox(4096, "Result", "Result = " & $result)
EndIf

DllClose($dll)


Описание dll - ки:
http://www.pcports.ru/articles/com_4.php

Сама dll -ка:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
w3d [?]
а ты точно скрипт положил в папку с dll?
у меня при выполнении скрипта появилось два сообщения. одно result=1 а второе error=3
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Александр сказал(а):
w3d [?]
а ты точно скрипт положил в папку с dll?
у меня при выполнении скрипта появилось два сообщения. одно result=1 а второе error=3

error=3 - это и есть непонятная ошибка.
Длл-ка лежит рядом со скриптом.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в справке написано так
Возвращаемое значение
При ошибке:
@error = 1 - невозможно использовать DLL файл
@error = 2 - неизвестноый тип возвращаемого значения
@error = 3 - указанная функция DLL недоступна
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Так об этом и речь!
Почему функция не доступна, хотя она экспортируется из длл-ки?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В AutoIt нужно использовать оригинальные имена функций. Более того, DllOpen() не устанавливает @error флаг.

Код:
$Dll = DllOpen(@ScriptDir & "\SerialGate.dll")
If $Dll < 0 Then
	MsgBox(4096, "Error", "Error!")
EndIf
$result = DllCall($dll, "none", "?Close@SerialGate@@QAEXXZ")
If @error Then
	MsgBox(4096, "Error", "Error = " & @error)
EndIf
DllClose($Dll)
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Yashied сказал(а):
В AutoIt нужно использовать оригинальные имена функций.
Код:
$result = DllCall($dll, "none", "?Close@SerialGate@@QAEXXZ")

А откуда взять эти оригинальные имена?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Re: Ошибка \"function\" not found in the DLL file

Ок.


Добавлено:
Сообщение автоматически объединено:

Yashied

Не могу справиться со структурой :(
Код:
Global $str        = "int var1[255];ubyte var2;ubyte var3"
Global $a          = DllStructCreate($str)


$Dll = DllOpen(@ScriptDir & "\SerialGate.dll")
If $Dll < 0 Then
    MsgBox(4096, "Error", "Error = " & @error)
EndIf
$result = DllCall($dll, "ptr", "?GetPortsInfo@SerialGate@@QAEXPAUPortInfo@@@Z", "ptr", DllStructGetPtr($a))
If @error Then
    MsgBox(4096, "Error", "Error = " & @error)
Else
    MsgBox(4096, "Result", "Result = " & DllStructGetData($a,1))
    MsgBox(4096, "Result", "Result = " & $result[1])

EndIf

DllClose($Dll)

Тут пример что должно быть:
http://www.pcports.ru/articles/com_6.php

то ли типы не так передаю, то ли вообще все не так делаю... подскажи, плиз!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Какой-то :Censored: DLL ты нашел для работы с COM портами. Неужели нет ничего лучше (например здесь)? Я не нашел ни одного толкового описания для него. Вообщем, судя по исходникам, должно быть как-то так (к сожалению, у меня на компьютере нет СОМ портов, следовательно проверить не могу):

Код:
Global $tPortInfo = DllStructCreate('ushort Port[255];ushort Count')
Global $aState[2] = ['Inaccessible', 'Free']

$Dll = DllOpen(@ScriptDir & '\SerialGate.dll')
If $Dll < 0 Then
	MsgBox(16, 'SerialGate', 'DLL open error!')
Else
	DllCall($Dll, 'int', '?GetPortsInfo@SerialGate@@QAEXPAUPortInfo@@@Z', 'ptr', DllStructGetPtr($tPortInfo))
	If @error Then
		MsgBox(16, 'SerialGate', '(' & @error & ') - Internal error!')
	Else
		$Count = DllStructGetData($tPortInfo, 'Count')
		MsgBox(64, 'SerialGate', 'Count = ' & $Count)
		For $i = 1 To $Count
			$ID = BitAND(DllStructGetData($tPortInfo, 1, $i), 0xFF)
			$iState = BitShift(DllStructGetData($tPortInfo, 1, $i), 8)
			MsgBox(64, 'SerialGate', 'COM' & $ID & ' = ' & $aState[$iState])
		Next
	EndIf
EndIf
DllClose($Dll)
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Yashied сказал(а):
Какой-то :Censored: DLL ты нашел для работы с COM портами. Неужели нет ничего лучше (например здесь)?
Ее я не смог заставить выдавать все содержимое буфера - выдается только построчно.
Я не нашел ни одного толкового описания для него. Вообщем, судя по исходникам, должно быть как-то так
Ага, работает!
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
w3d сказал(а):
Какой-то :Censored: DLL ты нашел для работы с COM портами. Неужели нет ничего лучше (например здесь)?
Ее я не смог заставить выдавать все содержимое буфера - выдается только построчно.

Вот так все нормально заработало:
Код:
$NumBytes = _CommGetInputCount() 
	While $NumBytes > 0
		$ComIn = $ComIn & _CommReadChar()
		$NumBytes = _CommGetInputCount()
	WEnd
 
Верх