Что нового

Ошибка скрипта после закрытия браузера

Ksaan

Знающий
Сообщения
207
Репутация
15
Когда то у кого то я свистнул интересную функцию, и теперь решил ее приобщить к делу. :blum:
Функция показывает адрес вкладки браузера.
Код:
#include <Array.au3>

HotKeySet("{ESC}", "_Exit")

Active()
Func Active()

 While 1
 $Win1 = WinExists("[Class:OperaWindowClass]")
 $Win3 = WinExists( "[Class:IEFrame]")

 If $Win1 = 1 Then
 Dim $Ret = OpenGetURL("", -1, 1, "Opera")
MsgBox(0,"", "Opera")
 _ArrayDisplay($Ret, "Opera")
EndIf

 If $Win3 = 1 Then
 Dim $Ret = OpenGetURL("", -1, 1, "IExplore")
MsgBox(0,"", "IExplore")
 _ArrayDisplay($Ret, "IExplore")
EndIf

 WEnd
EndFunc

Func OpenGetURL($sURL = "", $hWin = -1, $RetType = 0, $Server="IExplore", $iWait = 10000)
 Local $ret, $err, $uIdInst = DllStructCreate("int")
 Local $hServer[1], $hTopic[1], $hItem[1], $hConv[1], $hData[1], $sData[1]
 Local $sTopic = "WWW_OpenURL", $sItem = $sURL 
 If $sURL = '' Then
 $sTopic = "WWW_GetWindowInfo"
 $sItem = "0x" 
EndIf
 Local $hDll = DllOpen("user32.dll")
 If $hDll=-1 Then Return SetError(1, 0, "")
 $ret = DllCall("user32.dll", "int", "DdeInitialize", "ptr", DllStructGetPtr($uIdInst), "ptr", 0, "int", 0, "int", 0)
 If $ret[0] Then Return SetError(2, $ret[0], "")
 $hServer = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $Server, "int", 1004)
 If $hServer[0] Then
 $hTopic = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $sTopic, "int", 1004)
 If $hTopic[0] Then
 $hItem = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $sItem, "int", 1004)
 If $hItem[0] Then
 $hConv = DllCall($hDll, "int", "DdeConnect", "int", _
DllStructGetData($uIdInst,1), "int", $hServer[0], "int", $hTopic[0], "int", 0)
 If $hConv[0] Then
 $hData = DllCall($hDll, "int", "DdeClientTransaction", "ptr", 0, "int", 0, _
 "int", $hConv[0], "int", $hItem[0], "int", 1, "int", 0x20B0, "int", $iWait, "ptr", 0)
 If $hData[0] Then $sData = DllCall($hDll, "str", "DdeAccessData", "int", $hData[0], "ptr", 0)
EndIf
EndIf
EndIf
EndIf
 $iErr = DllCall($hDll, "int", "DdeGetLastError", "int", DllStructGetData($uIdInst, 1))
 If $hData[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hData[0])
 If $hConv[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hConv[0])
 If $hItem[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hItem[0])
 If $hTopic[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hTopic[0])
 If $hServer[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hServer[0])
 If $iErr[0] Then Return SetError(3, $iErr[0], "") ; Othe DDE Errors
DllCall($hDll, "int", "DdeUninitialize", "int", DllStructGetData($uIdInst, 1))
DllClose($hDll)
 $sData[0] = StringRegExpReplace($sData[0], ',""$', '')
 If $sURL = '' Then $sURL = StringRegExpReplace($sData[0], '^"([^"]*)",.*', '\1')
 Local $iRetTitle = StringRegExpReplace($sData[0], '^.*","([^"]*)"$', '\1')
 Local $RetURL[3] = [$sData[0], $sURL, $iRetTitle]
 If $RetType = 1 Then Return $RetURL
 Return $sData[0]
EndFunc

Func _Exit()
 Exit
EndFunc
Дописав программу заметил одну ошибку... если я закрою браузер во время работы скрипта, вылазит системная ошибка а сам скрипт завершает работу. Как обойти эту проблему?
 

ahjkcfout7

Знающий
Сообщения
26
Репутация
6
У меня скрипт нечего не делает, открываю или закрываю оперу...по коду могу сказать что наверное дело в установленом SetError
 

SlavaS

Знающий
Сообщения
35
Репутация
5
Ksaan сказал(а):
Дописав программу заметил одну ошибку... если я закрою браузер во время работы скрипта, вылазит системная ошибка а сам скрипт завершает работу. Как обойти эту проблему?
ИспользуЙ функцию _DDEMLClient_RequestString из DDEML.au3 и DDEMLClient.au3
взять можно здесь
 
Автор
Ksaan

Ksaan

Знающий
Сообщения
207
Репутация
15
SlavaS сказал(а):
ИспользуЙ функцию _DDEMLClient_RequestString
И что это за функция? Я не нашол пояснений что за параметры $szService, $szTopic, $szItem, $wFmt = 0
ahjkcfout7 сказал(а):
У меня скрипт нечего не делает, открываю или закрываю оперу...по коду могу сказать что наверное дело в установленом SetError
Он ничего и не должен делать только показывать MsgBox для примера в Opere и IE. Но я проверил на двух системах с WIN7 результат тотже.
 
Автор
Ksaan

Ksaan

Знающий
Сообщения
207
Репутация
15
Все теперь понял. спс
 
Верх