Как правильно вызвать функцию из dll?

Здесь можете задавать любые вопросы и не бойтесь даже глупых вопросов!
Ответить
LeXx
начинающий
Сообщения: 3
Зарегистрирован: 10 дек 2014, 18:57

Как правильно вызвать функцию из dll?

Сообщение LeXx » 17 июн 2015, 17:31

Помогите пожалуйста переделать код получения TTH под 10.0.0.7600 версию :?
Рабочий код в 9-й версии:

Код: Выделить всё

	Const RHASH_CRC32 = &H01
	Const RHASH_MD5   = &H04
	Const RHASH_TTH   = &H20
	Const RHPR_BASE32 = &H3
	Const RHPR_UPPERCASE = &H8
	
Function GetTTH(filename)
	Dim LibFileName, hLibModule, res
	Dim digest(64), output(130), size, strTTH
	Sys.DynAPI.CallType = 1
	sys.dynapi.curbuf=0: sys.dynapi.setbuf(digest)
	sys.dynapi.curbuf=1: sys.dynapi.setbuf(output)
	LibFileName = sys.path & "librhash.dll"
	hLibModule = Sys.API.LoadLibrary(LibFileName)
	if hLibModule > 0 then
		Sys.DynAPI.CallFunction hLibModule, "rhash_library_init"
		if Sys.DynAPI.CallFunction(hLibModule, "rhash_file", RHASH_TTH, filename, sys.dynapi.ptrbuf(0)) < 0 then
			GetTTH = ""
		else
			size = Sys.DynAPI.CallFunction(hLibModule, "rhash_get_digest_size", RHASH_TTH)
			Sys.DynAPI.CallFunction hLibModule, "rhash_print_bytes", sys.dynapi.ptrbuf(1), sys.dynapi.ptrbuf(0), size, RHPR_BASE32 + RHPR_UPPERCASE
			Sys.DynAPI.GetBuf strTTH, 1
			Sys.API.FreeLibrary(hLibModule)
			GetTTH = Sys.Conv.Buf2Txt(strTTH)
		end if
	else
		GetTTH = ""
	end if
	End Function
	
Неудачная попытка переделки под 10.0.0.7600 версию:
Виснет после вызова rc = DllCall("", fn, RHASH_TTH, filename, digest.ptr), т.к. msgbox "проверка" - не выводится

Код: Выделить всё

	Const RHASH_CRC32 = &H01
	Const RHASH_MD5   = &H04
	Const RHASH_TTH   = &H20
	Const RHPR_BASE32 = &H3
	Const RHPR_UPPERCASE = &H8
	
Function GetTTH(filename)
	Dim LibFileName, hLibModule, res, fn, rc
	Dim digest, output, size, strTTH
	Set digest = sys.newbuf(array("size = 65"))
	Set output = sys.newbuf(array("size = 131"))
	LibFileName = sys.path & "librhash.dll"
	hLibModule = Sys.API.LoadLibrary(LibFileName)
	if hLibModule > 0 then
		fn = Sys.API.GetProcAddress(hLibModule, "rhash_library_init")
		rc = DllCall("", fn)
		fn = Sys.API.GetProcAddress(hLibModule, "rhash_file")
		rc = DllCall("", fn, RHASH_TTH, filename, digest.ptr)
		msgbox "проверка"
		if rc < 0 then
			GetTTH = ""
		else
			fn = Sys.API.GetProcAddress(hLibModule, "rhash_get_digest_size")
			size = DllCall("", fn, RHASH_TTH)
			fn = Sys.API.GetProcAddress(hLibModule, "rhash_print_bytes")
			rc = DllCall("", fn, output.ptr, digest.ptr, size, RHPR_BASE32 + RHPR_UPPERCASE)
			Sys.API.FreeLibrary(hLibModule)
			GetTTH = Sys.Conv.Ptr2Str(output.ptr)
		end if
	else
		GetTTH = ""
	end if
	End Function

Аватара пользователя
Atomix
Admin
Сообщения: 94
Зарегистрирован: 19 янв 2005, 17:00
Контактная информация:

Re: Как правильно вызвать функцию из dll?

Сообщение Atomix » 17 июн 2015, 18:42

Ваша библиотека использует CDecl соглашение и вы его не указали при вызове функций.
Поэтому надо так (в справке все расписано - Sys.SHD.DllCall) -> DllCall("*", fn)
Также должно быть вот так -> sys.newbuf( , ".size = 65")

LeXx
начинающий
Сообщения: 3
Зарегистрирован: 10 дек 2014, 18:57

Re: Как правильно вызвать функцию из dll?

Сообщение LeXx » 18 июн 2015, 12:21

Спасибо, все заработало :o "*" и "." всего то, спасибо :D

Как я понял можно упростить, конструкцию вот так -> size = DllCall("*librhash", "rhash_get_digest_size", RHASH_TTH)

только не знаю насколько это правильно, после Sys.API.LoadLibrary использовать сразу "*librhash", вместо получения адреса через Sys.API.GetProcAddress, но тоже работает

Аватара пользователя
Atomix
Admin
Сообщения: 94
Зарегистрирован: 19 янв 2005, 17:00
Контактная информация:

Re: Как правильно вызвать функцию из dll?

Сообщение Atomix » 18 июн 2015, 13:31

  • Можно вручную использовать Sys.Api.LoadLibrary
  • Можно полностью через DllCall
  • Можно через Declare
вот еще пример как упростить:
У вас нет необходимых прав для просмотра вложений в этом сообщении.

LeXx
начинающий
Сообщения: 3
Зарегистрирован: 10 дек 2014, 18:57

Re: Как правильно вызвать функцию из dll?

Сообщение LeXx » 18 июн 2015, 17:32

hash.mf вычисляет хеш MD5, а мне нужен хеш именно по Tiger Tree Hash алгоритму как в DC++ клиентах.

Код примера был написан на "C", я его переделал в .mf код, поэтому без дополнительных функций видимо не обойтись, но за помощь спасибо! :)

Для меня LangMF удобнее других языков, для повседневных задач :) Поэтому еще спасибо и за LangMF, он меня часто выручал!

Аватара пользователя
Atomix
Admin
Сообщения: 94
Зарегистрирован: 19 янв 2005, 17:00
Контактная информация:

Re: Как правильно вызвать функцию из dll?

Сообщение Atomix » 18 июн 2015, 21:15

Приятно слышать что он вам помогает в повседневной жизни.
Поэтому я в свое время его и создал для этих целей.
Он тоже у меня везде применяется.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость