Что нового

[Процессы] Ошибка при работе Dll файла unArc.dll

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Суть такая. Пытался подключить unarc.dll в autoit, для распаковки архивов.

Код:
$hArchiveProc = DllCallbackRegister('_ARCHIVERPROC', "int", "str;int;int;str")
DllCall('unarc.dll',"int","FreeArcExtract","ptr",DllCallbackGetPtr($hArchiveProc),"str","x","str","-o+","str","-dpC:\1","str","--","str","C:\1.arc","str","","str","","str","","str","","str","")

Func _ARCHIVERPROC($hWnd, $Msg, $nState, $ExInfo)
   ;события для обновления прогресса распаковки
EndFunc


Вроде бы все работает, но при завершении распаковки, высвечивается сообщение о системной ошибке приложения, в данном случае AutoIt3.exe и скрипт вылетает. Даже если скрипт скомпилировать, все то же самое происходит.

Подскажите в чем может быть проблема и как ее можно решить/обойти.
 

Yashied

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
IMStrelcov [?]
Подскажите в чем может быть проблема
Код:
Global Const $FREEARC_OK = 0

Global $i_TotalFiles = 0
Global $i_Origsize = 0
Global $i_Compsize = 0
Global $i_Quit = False

Local $sFilePath = @ScriptDir & "\test.arc"
Local $sTmpPath = @ScriptDir & "\unarc"
Local $sDesPath = @ScriptDir & "\unarc"

$pUnArcCallBack = DllCallbackRegister("_UnArc_CallBack", "bool", "str;int;int;str;")


_FreeArcExtract($pUnArcCallBack, "l", "--", $sFilePath, "", "", "", "", "", "", "")
MsgBox(0, "Archive listing", StringFormat("Total Files:%12s\r\nOriginal Size:%8s\r\nCompress Size:%3s\r\nDone:%18d\r\n", _
						    $i_TotalFiles, _
							$i_Origsize, _
							$i_Compsize, _
							$i_Quit), 3)

ProgressOn("FreeArcExtract", "Unpacking...", "0%")
_FreeArcExtract($pUnArcCallBack, "x", "-o+", "-dp" & $sDesPath, "-w" & $sTmpPath, "--", $sFilePath, "", "", "", "")
ProgressSet(100, "100%", "Success!")
Sleep(3000)
ProgressOff()

DllCallbackFree($pUnArcCallBack)


Func _FreeArcExtract($p_UnArcCallBack, $s_CMD1, $s_CMD2, $s_CMD3, $s_CMD4, $s_CMD5, $s_CMD6, $s_CMD7, $s_CMD8, $s_CMD9, $s_CMD10)

   $aRet = DllCall("unarc.dll", "int:cdecl", "FreeArcExtract", "ptr", DllCallbackGetPtr($p_UnArcCallBack), _
													    "str", $s_CMD1, "str", $s_CMD2, _
														"str", $s_CMD3, "str", $s_CMD4, _
														"str", $s_CMD5, "str", $s_CMD6, _
														"str", $s_CMD7, "str", $s_CMD8, _
														"str", $s_CMD9, "str", $s_CMD10)
   If $aRet[0] <> $FREEARC_OK Then
	  Return SetError(1, 0 , 0)
   EndIf

   Return SetError(0, 0 , 1)
EndFunc ;==>_FreeArcExtract

Func _UnArc_CallBack($s_What, $i_Number1, $i_Number2, $s_T2)

   Switch $s_What
	  Case "total_files"
		 $i_TotalFiles = $i_Number1
	  Case "origsize"
		 $i_Origsize = $i_Number1
	  Case "compsize"
		 $i_Compsize = $i_Number1
	  Case "write"
		 ProgressSet($i_Number1, $i_Number1 & "%")
	  Case "read"
	  Case "quit"
		 $i_Quit = True
   EndSwitch

   Return True
EndFunc ;==>_UnArc_CallBack
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Благодарю за быстрый и внятный ответ. Да ваш пример рабочий. Сравнив с свои тестовым примером понял где ошибка, был не верный тип возращаемого параметра DllCall.
Еще раз большое спасибо.


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

Yashied сказал(а):
IMStrelcov сказал(а):
Подскажите в чем может быть проблема и как ее можно решить/обойти.

DllCallbackFree()

До этой строчки кода дело не дойдет, так как после DllCall ошибка приложения. В примере выше проблему решили, за что благодарен, мне всего лишь требовалось заменить параметру "int" на "int:cdecl"
 
Верх