1 (изменено: DD, 2011-11-28 00:22:44)

Тема: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

По нажатии F5 выводятся пути, командные, адресные строки — Проводника, Рабочего стола, CHM-Справки, IE, Firefox`a.
Почему после нажатий в окнах IE или CHM-Справки — любое последующее заканчивается ошибкой?

Задействована COM-библ-ка.

#SingleInstance Force

F5::
  WinGetActiveTitle, CurrentWin

  WinGetClass, CurrentWinClass, ahk_id %CurrentWinID%

  ControlGetText, WinEdit, Edit1, ahk_id %CurrentWinID%
  ;------------------------------------------------------

  PID_Target := WinExist( "A" ) ; получаем ID ОКНА
  If Not PID_Target ; если ОКНО не найдено...
  {
    MsgBox, Окно не найдено!
    Return ; конец скрипта
  }
  WinGet, PID_Target, PID, % "ahk_id " WinExist("A")
  Exe_Path := GetExecutablePath()
  If Not Exe_Path ; если что-то не так...
  {
    MsgBox, Процесс не существует, или к нему нет доступа
    Return ; конец скрипта
  }
  Com_Line := GetCommandLine() ; вызываем функцию получения ком. строки ОКНА
  If Not Com_Line ; если что-то не так...
  {
    MsgBox, Процесс не существует, или к нему нет доступа
    Return ; конец скрипта
  }
  StringReplace, File_Path, Com_Line, %Exe_Path% ; удаляем из строки путь к ОКНУ
  StringReplace, File_Path, File_Path, ",, All ; удаляем из строки все кавычки, если они есть


  If WinActive("ahk_class Progman") || WinActive("ahk_class CabinetWClass")
    File_Path := GetDesktopExplorerDialogPath()

  If WinActive("ahk_class MozillaUIWindowClass")
  || WinActive("ahk_class MozillaWindowClass")
  {
    sData:=FF_RetrievePageName()
    Loop,Parse,sData,CSV 
       { 
       If A_Index = 1 
          sURL := A_LoopField 
       Else If A_Index = 2 
          sTitle := A_LoopField 
       }

    StringReplace, sData, sData, `"`,`", `r`n, All
    StringTrimRight, sData, sData, 1
    StringTrimLeft, sData, sData, 1
    StringSplit, File_Path, sData,`n
    File_Path = %File_Path1%
  }

  If WinActive("ahk_class IEFrame") || WinActive("ahk_class HH Parent")
  {
    IfWinActive, ahk_class IEFrame
      ControlGet, hwnd, hwnd, , Internet Explorer_Server1, ahk_class IEFrame

    IfWinActive, ahk_class HH Parent
      ControlGet, hwnd, hwnd, , Internet Explorer_Server1, ahk_class HH Parent

    Gosub, Get_Chm_IE_Path
    File_Path = %pthValue%
  }

  File_Path = %File_Path% ; избавляемся от возможных пробелов в начале строки

  msgbox 1 %Exe_Path%`n2 %File_Path%

Return

Get_Chm_IE_Path:
  ;see COM.ahk Standard Library   by Sean   http://www.autohotkey.com/forum/topic22923.html
  ;from: Capture Text from Read Only List
  COM_AccInit()
  If   pacc :=   COM_AccessibleObjectFromWindow(hWnd)
  {
     Loop, %   COM_AccessibleChildren(pacc, COM_Invoke(pacc,"accChildCount"), varChildren)
     If   paccChild:=NumGet(varChildren,16*A_Index-8)
     ttlName :=COM_Invoke(paccChild,"accName",0)
     pthValue :=COM_Invoke(paccChild,"accValue",0)
        , COM_Release(paccChild)
     COM_Release(pacc)
  }
  ;;COM_AccTerm()  ;Error in AHK_L

  If WinActive("ahk_class OpusApp") ; Word
  {
    COM_Init()
    Word := COM_GetActiveObject("Word.Application")
    ActiveDocument := com_invoke(Word,"ActiveDocument")
    pthValue := COM_Invoke(ActiveDocument, "Path") . "\" . COM_Invoke(ActiveDocument, "Name")
  }
Return


;SEE:: Retrieve AddressBar of Firefox through DDE Message
FF_RetrievePageName() 
   { 
   DllCall("DdeInitializeW","UPtrP",idInst,"Uint",0,"Uint",0,"Uint",0) 

   ; CP_WINANSI = 1004   CP_WINUNICODE = 1200 
   hServer := DllCall("DdeCreateStringHandleW","UPtr",idInst,"Str","firefox","int",1200) 
   hTopic  := DllCall("DdeCreateStringHandleW","UPtr",idInst,"Str","WWW_GetWindowInfo","int",1200) 
   hItem   := DllCall("DdeCreateStringHandleW","UPtr",idInst,"Str","0xFFFFFFFF","int",1200) 

   hConv := DllCall("DdeConnect","UPtr",idInst,"UPtr",hServer,"UPtr",hTopic,"Uint",0) 
   ; CF_TEXT = 1      CF_UNICODETEXT = 13 
   hData := DllCall("DdeClientTransaction","Uint",0,"Uint",0,"UPtr",hConv,"UPtr",hItem,"UInt",1,"Uint",0x20B0,"Uint",10000,"UPtrP",nResult) 
   sData := DllCall("DdeAccessData","Uint",hData,"Uint",0,"str") 

   DllCall("DdeFreeStringHandle","UPtr",idInst,"UPtr",hServer) 
   DllCall("DdeFreeStringHandle","UPtr",idInst,"UPtr",hTopic) 
   DllCall("DdeFreeStringHandle","UPtr",idInst,"UPtr",hItem) 
   DllCall("DdeUnaccessData","UPtr",hData) 
   DllCall("DdeFreeDataHandle","UPtr",hData) 
   DllCall("DdeDisconnect","UPtr",hConv) 
   DllCall("DdeUninitialize","UPtr",idInst) 
   result:=StrGet(&sData,"cp0") 
   return result 
   }
Return


GetCommandLine() {
  WinGet, PID_Target, PID, % "ahk_id " WinExist("A")
  ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ProcessId = "
  . PID_Target)._NewEnum.next(x)
  GetCommandLine := % x.CommandLine
  Return %GetCommandLine%
}

GetExecutablePath() {
  WinGet, PID_Target, PID, % "ahk_id " WinExist("A")
  ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ProcessId = "
  . PID_Target)._NewEnum.next(x)
  GetExecutablePath := % x.ExecutablePath
  Return %GetExecutablePath%
}

; Определение пути Рабочего стола, окна Проводника, Диалога сохранения
GetDesktopExplorerDialogPath() {
  hWnd := WinExist("A")
  WinGetClass wClass, ahk_id %hWnd%
    currentDir := GetWindowsExplorerPath(hWnd)
  IfWinActive, ahk_class Progman
    currentDir := A_DESKTOP

  StringReplace, currentDir, currentDir,`%20,%A_Space%,All
  StringReplace, currentDir, currentDir,`/,\,All

  Return %currentDir%
}

GetWindowsExplorerPath(_hWnd)
{
   For explorerPath In ComObjCreate("Shell.Application").Windows
      If (explorerPath.hWnd=_hwnd)
         Return, LTrim(explorerPath.LocationURL, "file:///")
}




;------------------------------------------------------------------------------
; COM.ahk Standard Library
; by Sean
; http://www.autohotkey.com/forum/topic22923.html
;------------------------------------------------------------------------------

COM_Init(bUn = "")
{
    Static    h
    Return    (bUn&&!h:="")||h==""&&1==(h:=DllCall("ole32\OleInitialize","Uint",0))?DllCall("ole32\OleUninitialize"):0
}

COM_Term()
{
    COM_Init(1)
}

COM_VTable(ppv, idx)
{
    Return    NumGet(NumGet(1*ppv)+4*idx)
}

COM_QueryInterface(ppv, IID = "")
{
    If    DllCall(NumGet(NumGet(1*ppv:=COM_Unwrap(ppv))), "Uint", ppv+0, "Uint", COM_GUID4String(IID,IID ? IID:IID=0 ? "{00000000-0000-0000-C000-000000000046}":"{00020400-0000-0000-C000-000000000046}"), "UintP", ppv:=0)=0
    Return    ppv
}

COM_AddRef(ppv)
{
    Return    DllCall(NumGet(NumGet(1*ppv:=COM_Unwrap(ppv))+4), "Uint", ppv)
}

COM_Release(ppv)
{
    If Not    IsObject(ppv)
    Return    DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)
    Else
    {
    nRef:=    DllCall(NumGet(NumGet(COM_Unwrap(ppv))+8), "Uint", COM_Unwrap(ppv)), nRef==0 ? (ppv.prm_:=0):""
    Return    nRef
    }
}

COM_QueryService(ppv, SID, IID = "")
{
    If    DllCall(NumGet(NumGet(1*ppv:=COM_Unwrap(ppv))), "Uint", ppv, "Uint", COM_GUID4String(IID_IServiceProvider,"{6D5140C1-7436-11CE-8034-00AA006009FA}"), "UintP", psp)=0
    &&    DllCall(NumGet(NumGet(1*psp)+12), "Uint", psp, "Uint", COM_GUID4String(SID,SID), "Uint", IID ? COM_GUID4String(IID,IID):&SID, "UintP", ppv:=0)+DllCall(NumGet(NumGet(1*psp)+8), "Uint", psp)*0=0
    Return    COM_Enwrap(ppv)
}

COM_FindConnectionPoint(pdp, DIID)
{
    DllCall(NumGet(NumGet(1*pdp)+ 0), "Uint", pdp, "Uint", COM_GUID4String(IID_IConnectionPointContainer, "{B196B284-BAB4-101A-B69C-00AA00341D07}"), "UintP", pcc)
    DllCall(NumGet(NumGet(1*pcc)+16), "Uint", pcc, "Uint", COM_GUID4String(DIID,DIID), "UintP", pcp)
    DllCall(NumGet(NumGet(1*pcc)+ 8), "Uint", pcc)
    Return    pcp
}

COM_GetConnectionInterface(pcp)
{
    VarSetCapacity(DIID,16,0)
    DllCall(NumGet(NumGet(1*pcp)+12), "Uint", pcp, "Uint", &DIID)
    Return    COM_String4GUID(&DIID)
}

COM_Advise(pcp, psink)
{
    DllCall(NumGet(NumGet(1*pcp)+20), "Uint", pcp, "Uint", psink, "UintP", nCookie)
    Return    nCookie
}

COM_Unadvise(pcp, nCookie)
{
    Return    DllCall(NumGet(NumGet(1*pcp)+24), "Uint", pcp, "Uint", nCookie)
}

COM_Enumerate(penum, ByRef Result, ByRef vt = "")
{
    VarSetCapacity(varResult,16,0)
    If (0 =    hr:=DllCall(NumGet(NumGet(1*penum:=COM_Unwrap(penum))+12), "Uint", penum, "Uint", 1, "Uint", &varResult, "UintP", 0))
    Result:=(vt:=NumGet(varResult,0,"Ushort"))=9||vt=13?COM_Enwrap(NumGet(varResult,8),vt):vt=8||vt<0x1000&&COM_VariantChangeType(&varResult,&varResult)=0?StrGet(NumGet(varResult,8)) . COM_VariantClear(&varResult):NumGet(varResult,8)
    Return    hr
}

COM_Invoke(pdsp,name="",prm0="vT_NoNe",prm1="vT_NoNe",prm2="vT_NoNe",prm3="vT_NoNe",prm4="vT_NoNe",prm5="vT_NoNe",prm6="vT_NoNe",prm7="vT_NoNe",prm8="vT_NoNe",prm9="vT_NoNe")
{
    pdsp :=    COM_Unwrap(pdsp)
    If    name=
    Return    DllCall(NumGet(NumGet(1*pdsp)+8),"Uint",pdsp)
    If    name contains .
    {
        SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . "."
    Loop,    Parse,    name, .
    {
    If    A_Index=1
    {
        name :=    A_LoopField
        Continue
    }
    Else If    name not contains [,(
        prmn :=    ""
    Else If    InStr("])",SubStr(name,0))
    Loop,    Parse,    name, [(,'")]
    If    A_Index=1
        name :=    A_LoopField
    Else    prmn :=    A_LoopField
    Else
    {
        name .=    "." . A_LoopField
        Continue
    }
    If    A_LoopField!=
        pdsp:=    COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe"),name:=A_LoopField
    Else    Return    prmn!=""?COM_Invoke(pdsp,name,prmn,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8):COM_Invoke(pdsp,name,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8,prm9)
    }
    }
    Static    varg,namg,iidn,varResult,sParams
    VarSetCapacity(varResult,64,0),sParams?"":(sParams:="0123456789",VarSetCapacity(varg,160,0),VarSetCapacity(namg,88,0),VarSetCapacity(iidn,16,0)),mParams:=0,nParams:=10,nvk:=3
    Loop,     Parse,    sParams
    If    (prm%A_LoopField%=="vT_NoNe")
    {
         nParams:=A_Index-1
        Break
    }
    Else If    prm%A_LoopField% is integer
        NumPut(SubStr(prm%A_LoopField%,1,1)="+"?9:prm%A_LoopField%=="-0"?(prm%A_LoopField%:=0x80020004)*0+10:3,NumPut(prm%A_LoopField%,varg,168-16*A_Index),-12)
    Else If    IsObject(prm%A_LoopField%)
        typ:=prm%A_LoopField%["typ_"],prm:=prm%A_LoopField%["prm_"],typ+0==""?(NumPut(&_nam_%A_LoopField%:=typ,namg,84-4*mParams++),typ:=prm%A_LoopField%["nam_"]+0==""?prm+0==""||InStr(prm,".")?8:3:prm%A_LoopField%["nam_"]):"",NumPut(typ==8?COM_SysString(prm%A_LoopField%,prm):prm,NumPut(typ,varg,160-16*A_Index),4)
    Else    NumPut(COM_SysString(prm%A_LoopField%,prm%A_LoopField%),NumPut(8,varg,160-16*A_Index),4)
    If    nParams
        SubStr(name,0)="="?(name:=SubStr(name,1,-1),nvk:=12,NumPut(-3,namg,4)):"",NumPut(nvk==12?1:mParams,NumPut(nParams,NumPut(&namg+4,NumPut(&varg+160-16*nParams,varResult,16))))
    Global    COM_HR, COM_LR:=""
    If    (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&iidn,"Uint",NumPut(&name,namg,84-4*mParams)-4,"Uint",1+mParams,"Uint",1024,"Uint",&namg,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",NumGet(namg),"Uint",&iidn,"Uint",1024,"Ushort",nvk,"Uint",&varResult+16,"Uint",&varResult,"Uint",&varResult+32,"Uint",0,"Uint"))!=0&&nParams&&nvk<4&&NumPut(-3,namg,4)&&(COM_LR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",NumGet(namg),"Uint",&iidn,"Uint",1024,"Ushort",12,"Uint",NumPut(1,varResult,28)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0
        COM_HR:=0
    Global    COM_VT:=NumGet(varResult,0,"Ushort")
    Return    COM_HR=0?COM_VT>1?COM_VT=9||COM_VT=13?COM_Enwrap(NumGet(varResult,8),COM_VT):COM_VT=8||COM_VT<0x1000&&COM_VariantChangeType(&varResult,&varResult)=0?StrGet(NumGet(varResult,8)) . COM_VariantClear(&varResult):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&varResult+32,name)
}

COM_InvokeSet(pdsp,name,prm0,prm1="vT_NoNe",prm2="vT_NoNe",prm3="vT_NoNe",prm4="vT_NoNe",prm5="vT_NoNe",prm6="vT_NoNe",prm7="vT_NoNe",prm8="vT_NoNe",prm9="vT_NoNe")
{
    Return    COM_Invoke(pdsp,name "=",prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8,prm9)
}

COM_DispInterface(this, prm1="", prm2="", prm3="", prm4="", prm5="", prm6="", prm7="", prm8="")
{
    Critical
    If    A_EventInfo = 6
        hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+28),"Uint",p,"Uint",prm1,"UintP",pname,"Uint",1,"UintP",0),hr==0?(sfn:=StrGet(this+40) . StrGet(pname),COM_SysFreeString(pname),%sfn%(prm5,this,prm6)):""
    Else If    A_EventInfo = 5
        hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+40),"Uint",p,"Uint",prm2,"Uint",prm3,"Uint",prm5)
    Else If    A_EventInfo = 4
        NumPut(0*hr:=0x80004001,prm3+0)
    Else If    A_EventInfo = 3
        NumPut(0,prm1+0)
    Else If    A_EventInfo = 2
        NumPut(hr:=NumGet(this+4)-1,this+4)
    Else If    A_EventInfo = 1
        NumPut(hr:=NumGet(this+4)+1,this+4)
    Else If    A_EventInfo = 0
        COM_IsEqualGUID(this+24,prm1)||InStr("{00020400-0000-0000-C000-000000000046}{00000000-0000-0000-C000-000000000046}",COM_String4GUID(prm1)) ? NumPut(NumPut(NumGet(this+4)+1,this+4)-8,prm2+0):NumPut(0*hr:=0x80004002,prm2+0)
    Return    hr
}

COM_DispGetParam(pDispParams, Position = 0, vt = 8)
{
    VarSetCapacity(varResult,16,0)
    DllCall("oleaut32\DispGetParam", "Uint", pDispParams, "Uint", Position, "Ushort", vt, "Uint", &varResult, "UintP", nArgErr)
    Return    (vt:=NumGet(varResult,0,"Ushort"))=8?StrGet(NumGet(varResult,8)) . COM_VariantClear(&varResult):vt=9||vt=13?COM_Enwrap(NumGet(varResult,8),vt):NumGet(varResult,8)
}

COM_DispSetParam(val, pDispParams, Position = 0, vt = 8)
{
    Return    NumPut(vt=8?COM_SysAllocString(val):vt=9||vt=13?COM_Unwrap(val):val,NumGet(NumGet(pDispParams+0)+(NumGet(pDispParams+8)-Position)*16-8),0,vt=11||vt=2 ? "short":"int")
}

COM_Error(hr = "", lr = "", pei = "", name = "")
{
    Static    bDebug:=1
    If Not    pei
    {
    bDebug:=hr
    Global    COM_HR, COM_LR
    Return    COM_HR&&COM_LR ? COM_LR<<32|COM_HR:COM_HR
    }
    Else If    !bDebug
    Return
    hr ? (VarSetCapacity(sError,1022),VarSetCapacity(nError,62),DllCall("kernel32\FormatMessage","Uint",0x1200,"Uint",0,"Uint",hr<>0x80020009?hr:(bExcep:=1)*(hr:=NumGet(pei+28))?hr:hr:=NumGet(pei+0,0,"Ushort")+0x80040200,"Uint",0,"str",sError,"Uint",512,"Uint",0),DllCall("kernel32\FormatMessage","Uint",0x2400,"str","0x%1!p!","Uint",0,"Uint",0,"str",nError,"Uint",32,"UintP",hr)):sError:="No COM Dispatch Object!`n",lr?(VarSetCapacity(sError2,1022),VarSetCapacity(nError2,62),DllCall("kernel32\FormatMessage","Uint",0x1200,"Uint",0,"Uint",lr,"Uint",0,"str",sError2,"Uint",512,"Uint",0),DllCall("kernel32\FormatMessage","Uint",0x2400,"str","0x%1!p!","Uint",0,"Uint",0,"str",nError2,"Uint",32,"UintP",lr)):""
    MsgBox, 260, COM Error Notification, % "Function Name:`t""" . name . """`nERROR:`t" . sError . "`t(" . nError . ")" . (bExcep ? SubStr(NumGet(pei+24) ? DllCall(NumGet(pei+24),"Uint",pei) : "",1,0) . "`nPROG:`t" . StrGet(NumGet(pei+4)) . COM_SysFreeString(NumGet(pei+4)) . "`nDESC:`t" . StrGet(NumGet(pei+8)) . COM_SysFreeString(NumGet(pei+8)) . "`nHELP:`t" . StrGet(NumGet(pei+12)) . COM_SysFreeString(NumGet(pei+12)) . "," . NumGet(pei+16) : "") . (lr ? "`n`nERROR2:`t" . sError2 . "`t(" . nError2 . ")" : "") . "`n`nWill Continue?"
    IfMsgBox, No, Exit
}

COM_CreateIDispatch()
{
    Static    IDispatch
    If Not    VarSetCapacity(IDispatch)
    {
        VarSetCapacity(IDispatch,28,0),   nParams=3112469
        Loop,   Parse,   nParams
        NumPut(RegisterCallback("COM_DispInterface","",A_LoopField,A_Index-1),IDispatch,4*(A_Index-1))
    }
    Return &IDispatch
}

COM_GetDefaultInterface(pdisp)
{
    DllCall(NumGet(NumGet(1*pdisp) +12), "Uint", pdisp , "UintP", ctinf)
    If    ctinf
    {
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
    DllCall(NumGet(NumGet(1*pdisp)+ 0), "Uint", pdisp, "Uint" , pattr, "UintP", ppv)
    DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
    If    ppv
    DllCall(NumGet(NumGet(1*pdisp)+ 8), "Uint", pdisp),    pdisp := ppv
    }
    Return    pdisp
}

COM_GetDefaultEvents(pdisp)
{
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
    VarSetCapacity(IID,16),DllCall("kernel32\RtlMoveMemory","Uint",&IID,"Uint",pattr,"Uint",16)
    DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
    DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
    Loop, %    DllCall(NumGet(NumGet(1*ptlib)+12), "Uint", ptlib)
    {
        DllCall(NumGet(NumGet(1*ptlib)+20), "Uint", ptlib, "Uint", A_Index-1, "UintP", TKind)
        If    TKind <> 5
            Continue
        DllCall(NumGet(NumGet(1*ptlib)+16), "Uint", ptlib, "Uint", A_Index-1, "UintP", ptinf)
        DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
        nCount:=NumGet(pattr+48,0,"Ushort")
        DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
        Loop, %    nCount
        {
            DllCall(NumGet(NumGet(1*ptinf)+36), "Uint", ptinf, "Uint", A_Index-1, "UintP", nFlags)
            If    !(nFlags & 1)
                Continue
            DllCall(NumGet(NumGet(1*ptinf)+32), "Uint", ptinf, "Uint", A_Index-1, "UintP", hRefType)
            DllCall(NumGet(NumGet(1*ptinf)+56), "Uint", ptinf, "Uint", hRefType , "UintP", prinf)
            DllCall(NumGet(NumGet(1*prinf)+12), "Uint", prinf, "UintP", pattr)
            nFlags & 2 ? DIID:=COM_String4GUID(pattr) : bFind:=COM_IsEqualGUID(pattr,&IID)
            DllCall(NumGet(NumGet(1*prinf)+76), "Uint", prinf, "Uint" , pattr)
            DllCall(NumGet(NumGet(1*prinf)+ 8), "Uint", prinf)
        }
        DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
        If    bFind
            Break
    }
    DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
    Return    bFind ? DIID : "{00000000-0000-0000-0000-000000000000}"
}

COM_GetGuidOfName(pdisp, Name)
{
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf:=0
    DllCall(NumGet(NumGet(1*ptlib)+44), "Uint", ptlib, "Uint", &Name, "Uint", 0, "UintP", ptinf, "UintP", memID, "UshortP", 1)
    DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
    DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
    GUID := COM_String4GUID(pattr)
    DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
    Return    GUID
}

COM_GetTypeInfoOfGuid(pdisp, GUID)
{
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf := 0
    DllCall(NumGet(NumGet(1*ptlib)+24), "Uint", ptlib, "Uint", COM_GUID4String(GUID,GUID), "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
    Return    ptinf
}

COM_ConnectObject(pdisp, prefix = "", DIID = "")
{
    pdisp:=    COM_Unwrap(pdisp)
    If Not    DIID
        0+(pconn:=COM_FindConnectionPoint(pdisp,"{00020400-0000-0000-C000-000000000046}")) ? (DIID:=COM_GetConnectionInterface(pconn))="{00020400-0000-0000-C000-000000000046}" ? DIID:=COM_GetDefaultEvents(pdisp):"":pconn:=COM_FindConnectionPoint(pdisp,DIID:=COM_GetDefaultEvents(pdisp))
    Else    pconn:=COM_FindConnectionPoint(pdisp,SubStr(DIID,1,1)="{" ? DIID:DIID:=COM_GetGuidOfName(pdisp,DIID))
    If    !pconn||!ptinf:=COM_GetTypeInfoOfGuid(pdisp,DIID)
    {
        MsgBox, No Event Interface Exists!
        Return
    }
    NumPut(pdisp,NumPut(ptinf,NumPut(1,NumPut(COM_CreateIDispatch(),0+psink:=COM_CoTaskMemAlloc(40+nSize:=StrLen(prefix)*2+2)))))
    DllCall("kernel32\RtlMoveMemory","Uint",psink+24,"Uint",COM_GUID4String(DIID,DIID),"Uint",16)
    DllCall("kernel32\RtlMoveMemory","Uint",psink+40,"Uint",&prefix,"Uint",nSize)
    NumPut(COM_Advise(pconn,psink),NumPut(pconn,psink+16))
    Return    psink
}

COM_DisconnectObject(psink)
{
    Return    COM_Unadvise(NumGet(psink+16),NumGet(psink+20))=0 ? (0,COM_Release(NumGet(psink+16)),COM_Release(NumGet(psink+8)),COM_CoTaskMemFree(psink)):1
}

COM_CreateObject(CLSID, IID = "", CLSCTX = 21)
{
    ppv :=    COM_CreateInstance(CLSID,IID,CLSCTX)
    Return    IID=="" ? COM_Enwrap(ppv):ppv
}

COM_GetObject(Name)
{
    COM_Init()
    If    DllCall("ole32\CoGetObject", "Uint", &Name, "Uint", 0, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)=0
    Return    COM_Enwrap(pdisp)
}

COM_GetActiveObject(CLSID)
{
    COM_Init()
    If    DllCall("oleaut32\GetActiveObject", "Uint", COM_GUID4String(CLSID,CLSID), "Uint", 0, "UintP", punk)=0
    &&    DllCall(NumGet(NumGet(1*punk)), "Uint", punk, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)+DllCall(NumGet(NumGet(1*punk)+8), "Uint", punk)*0=0
    Return    COM_Enwrap(pdisp)
}

COM_CreateInstance(CLSID, IID = "", CLSCTX = 21)
{
    COM_Init()
    If    DllCall("ole32\CoCreateInstance", "Uint", COM_GUID4String(CLSID,CLSID), "Uint", 0, "Uint", CLSCTX, "Uint", COM_GUID4String(IID,IID ? IID:IID=0 ? "{00000000-0000-0000-C000-000000000046}":"{00020400-0000-0000-C000-000000000046}"), "UintP", ppv)=0
    Return    ppv
}

COM_CLSID4ProgID(ByRef CLSID, ProgID)
{
    VarSetCapacity(CLSID,16,0)
    DllCall("ole32\CLSIDFromProgID", "Uint", &ProgID, "Uint", &CLSID)
    Return    &CLSID
}

COM_ProgID4CLSID(pCLSID)
{
    DllCall("ole32\ProgIDFromCLSID", "Uint", pCLSID, "UintP", pProgID)
    Return    StrGet(pProgID) . COM_CoTaskMemFree(pProgID)
}

COM_GUID4String(ByRef CLSID, String)
{
    VarSetCapacity(CLSID,16,0)
    DllCall("ole32\CLSIDFromString", "Uint", &String, "Uint", &CLSID)
    Return    &CLSID
}

COM_String4GUID(pGUID)
{
    VarSetCapacity(String,38*2)
    DllCall("ole32\StringFromGUID2", "Uint", pGUID, "str", String, "int", 39)
    Return    String
}

COM_IsEqualGUID(pGUID1, pGUID2)
{
    Return    DllCall("ole32\IsEqualGUID", "Uint", pGUID1, "Uint", pGUID2)
}

COM_CoCreateGuid()
{
    VarSetCapacity(GUID,16,0)
    DllCall("ole32\CoCreateGuid", "Uint", &GUID)
    Return    COM_String4GUID(&GUID)
}

COM_CoInitialize()
{
    Return    DllCall("ole32\CoInitialize", "Uint", 0)
}

COM_CoUninitialize()
{
        DllCall("ole32\CoUninitialize")
}

COM_CoTaskMemAlloc(cb)
{
    Return    DllCall("ole32\CoTaskMemAlloc", "Uint", cb)
}

COM_CoTaskMemFree(pv)
{
        DllCall("ole32\CoTaskMemFree", "Uint", pv)
}

COM_SysAllocString(str)
{
    Return    DllCall("oleaut32\SysAllocString", "Uint", &str)
}

COM_SysFreeString(pstr)
{
        DllCall("oleaut32\SysFreeString", "Uint", pstr)
}

COM_SafeArrayDestroy(psar)
{
    Return    DllCall("oleaut32\SafeArrayDestroy", "Uint", psar)
}

COM_VariantClear(pvar)
{
        DllCall("oleaut32\VariantClear", "Uint", pvar)
}

COM_VariantChangeType(pvarDst, pvarSrc, vt = 8)
{
    Return    DllCall("oleaut32\VariantChangeTypeEx", "Uint", pvarDst, "Uint", pvarSrc, "Uint", 1024, "Ushort", 0, "Ushort", vt)
}

COM_SysString(ByRef wString, sString)
{
    VarSetCapacity(wString,4+nLen:=2*StrLen(sString))
    Return    DllCall("kernel32\lstrcpyW","Uint",NumPut(nLen,wString),"Uint",&sString)
}

COM_AccInit()
{
    Static    h
    If Not    h
    COM_Init(), h:=DllCall("kernel32\LoadLibrary","str","oleacc")
}

COM_AccTerm()
{
    COM_Term()
}

COM_AccessibleChildren(pacc, cChildren, ByRef varChildren)
{
    VarSetCapacity(varChildren,cChildren*16,0)
    If    DllCall("oleacc\AccessibleChildren", "Uint", COM_Unwrap(pacc), "Uint", 0, "Uint", cChildren+0, "Uint", &varChildren, "UintP", cChildren:=0)=0
    Return    cChildren
}

COM_AccessibleObjectFromEvent(hWnd, idObject, idChild, ByRef _idChild_="")
{
    COM_AccInit(), VarSetCapacity(varChild,16,0)
    If    DllCall("oleacc\AccessibleObjectFromEvent", "Uint", hWnd, "Uint", idObject, "Uint", idChild, "UintP", pacc, "Uint", &varChild)=0
    Return    COM_Enwrap(pacc), _idChild_:=NumGet(varChild,8)
}

COM_AccessibleObjectFromPoint(x, y, ByRef _idChild_="")
{
    COM_AccInit(), VarSetCapacity(varChild,16,0)
    If    DllCall("oleacc\AccessibleObjectFromPoint", "int", x, "int", y, "UintP", pacc, "Uint", &varChild)=0
    Return    COM_Enwrap(pacc), _idChild_:=NumGet(varChild,8)
}

COM_AccessibleObjectFromWindow(hWnd, idObject=-4, IID = "")
{
    COM_AccInit()
    If    DllCall("oleacc\AccessibleObjectFromWindow", "Uint", hWnd, "Uint", idObject, "Uint", COM_GUID4String(IID, IID ? IID : idObject&0xFFFFFFFF==0xFFFFFFF0 ? "{00020400-0000-0000-C000-000000000046}":"{618736E0-3C3D-11CF-810C-00AA00389B71}"), "UintP", pacc)=0
    Return    COM_Enwrap(pacc)
}

COM_WindowFromAccessibleObject(pacc)
{
    If    DllCall("oleacc\WindowFromAccessibleObject", "Uint", COM_Unwrap(pacc), "UintP", hWnd)=0
    Return    hWnd
}

COM_GetRoleText(nRole)
{
    nLen:=    DllCall("oleacc\GetRoleTextW", "Uint", nRole, "Uint", 0, "Uint", 0)
    VarSetCapacity(sRole,nLen*2)
    If    DllCall("oleacc\GetRoleTextW", "Uint", nRole, "str", sRole, "Uint", nLen+1)
    Return    sRole
}

COM_GetStateText(nState)
{
    nLen:=    DllCall("oleacc\GetStateTextW", "Uint", nState, "Uint", 0, "Uint", 0)
    VarSetCapacity(sState,nLen*2)
    If    DllCall("oleacc\GetStateTextW", "Uint", nState, "str", sState, "Uint", nLen+1)
    Return    sState
}

COM_AtlAxWinInit(Version = "")
{
    Static    h
    If Not    h
    COM_Init(), h:=DllCall("kernel32\LoadLibrary","str","atl" . Version), DllCall("atl" . Version . "\AtlAxWinInit")
}

COM_AtlAxWinTerm(Version = "")
{
    COM_Term()
}

COM_AtlAxGetHost(hWnd, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxGetHost", "Uint", hWnd, "UintP", punk)=0
    Return    COM_Enwrap(COM_QueryInterface(punk)+COM_Release(punk)*0)
}

COM_AtlAxGetControl(hWnd, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxGetControl", "Uint", hWnd, "UintP", punk)=0
    Return    COM_Enwrap(COM_QueryInterface(punk)+COM_Release(punk)*0)
}

COM_AtlAxAttachControl(pdsp, hWnd, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxAttachControl", "Uint", punk:=COM_QueryInterface(pdsp,0), "Uint", hWnd, "Uint", COM_AtlAxWinInit(Version))+COM_Release(punk)*0=0
    Return    COM_Enwrap(pdsp)
}

COM_AtlAxCreateControl(hWnd, Name, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxCreateControl", "Uint", &Name, "Uint", hWnd, "Uint", 0, "Uint", COM_AtlAxWinInit(Version))=0
    Return    COM_AtlAxGetControl(hWnd,Version)
}

COM_AtlAxCreateContainer(hWnd, l, t, w, h, Name = "", Version = "")
{
    Return    DllCall("user32\CreateWindowEx", "Uint",0x200, "str", "AtlAxWin" . Version, "Uint", Name?&Name:0, "Uint", 0x54000000, "int", l, "int", t, "int", w, "int", h, "Uint", hWnd, "Uint", 0, "Uint", 0, "Uint", COM_AtlAxWinInit(Version))
}

COM_AtlAxGetContainer(pdsp, bCtrl = "")
{
    DllCall(NumGet(NumGet(1*pdsp:=COM_Unwrap(pdsp))), "Uint", pdsp, "Uint", COM_GUID4String(IID_IOleWindow,"{00000114-0000-0000-C000-000000000046}"), "UintP", pwin)
    DllCall(NumGet(NumGet(1*pwin)+12), "Uint", pwin, "UintP", hCtrl)
    DllCall(NumGet(NumGet(1*pwin)+ 8), "Uint", pwin)
    Return    bCtrl?hCtrl:DllCall("user32\GetParent", "Uint", hCtrl)
}

COM_ScriptControl(sCode, sEval = "", sName = "", Obj = "", bGlobal = "")
{
    oSC:=COM_CreateObject("ScriptControl"), oSC.Language(sEval+0==""?"VBScript":"JScript"), sName&&Obj?oSC.AddObject(sName,Obj,bGlobal):""
    Return    sEval?oSC.Eval(sEval+0?sCode:sEval oSC.AddCode(sCode)):oSC.ExecuteStatement(sCode)
}

COM_Parameter(typ, prm = "", nam = "")
{
    Return    IsObject(prm)?prm:Object("typ_",typ,"prm_",prm,"nam_",nam)
}

COM_Enwrap(obj, vt = 9)
{
    Static    base
    Return    IsObject(obj)?obj:Object("prm_",obj,"typ_",vt,"base",base?base:base:=Object("__Delete","COM_Invoke","__Call","COM_Invoke","__Get","COM_Invoke","__Set","COM_InvokeSet","base",Object("__Delete","COM_Term")))
}

COM_Unwrap(obj)
{
    Return    IsObject(obj)?obj.prm_:obj
}
;------------------------------------------------------------------------------
; END  COM.ahk Standard Library
;------------------------------------------------------------------------------

2

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

DD пишет:

По нажатии F5 выводятся пути, командные, адресные строки — Проводника, Рабочего стола, CHM-Справки, IE, Firefox`a.
Почему после нажатий в окнах IE или CHM-Справки — любое последующее заканчивается ошибкой?

У меня всё нормально(win7 SP1).

3 (изменено: DD, 2011-11-26 15:23:45)

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

http://s2.ipicture.ru/uploads/20111126/pkjxPq4Z.jpg
xp SP2

4

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

А может есть вариант получения не через ComObjGet — как-то иначе?
Или некую переменную очищать на каком-то этапе?

5

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

DD пишет:

А может есть вариант получения не через ComObjGet — как-то иначе?

пост 16, таким образом можно почти любую информацию достать, конкретно расположение файла хранится в RTL_USER_PROCESS_PARAMETERS по смещению  56. Кстати, я там забыл хендл процесса закрыть.

DD пишет:

Или некую переменную очищать на каком-то этапе?

Нужно разбить эту строку на минимальные фрагменты и найти точное место ошибки. Переменную с pid'ом тоже нужно проверить. Может это вообще из-за перевода строки .

6

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

Код по ссылке работает!

;
#SingleInstance Force

;константы
ProcessBasicInformation   := 0
PROCESS_QUERY_INFORMATION := 0x0400
PROCESS_VM_READ           := 0x0010
;функции
;открытие процесса
OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)
{
   return DllCall("OpenProcess", "uint", dwDesiredAccess, "int", bInheritHandle, "uint", dwProcessId, "uint")
}
;получение информации о процессе
ZwQueryInformationProcess(ProcessHandle, ProcessInformationClass, ProcessInformation, ProcessInformationLength, ReturnLength)
{
   return DllCall("ntdll.dll\ZwQueryInformationProcess","uint", ProcessHandle, "uint", ProcessInformationClass, "uint", ProcessInformation, "uint", ProcessInformationLength, "uint", ReturnLength, "uint")
}
;чтение данных из процесса
ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
{
   return DllCall("ReadProcessMemory", "uint", hProcess, "uint", lpBaseAddress, "uint", lpBuffer, "uint", nSize, "uint", lpNumberOfBytesRead)
}


F5::
  WinGet, PID_Target, PID, % "ahk_id " WinExist("A")
  Exe_Path := % GetProcCurrentDirectory(PID_Target) ;%

  If WinActive("ahk_class IEFrame") || WinActive("ahk_class HH Parent")
  {
    IfWinActive, ahk_class IEFrame
      ControlGet, hwnd, hwnd, , Internet Explorer_Server1, ahk_class IEFrame

    IfWinActive, ahk_class HH Parent
      ControlGet, hwnd, hwnd, , Internet Explorer_Server1, ahk_class HH Parent

    Gosub, Get_Chm_IE_Path
    File_Path = %pthValue%
  }

  File_Path = %File_Path% ; избавляемся от возможных пробелов в начале строки

  msgbox 1 %Exe_Path%`n2 %File_Path%
Return

Get_Chm_IE_Path:
  ;see COM.ahk Standard Library   by Sean   http://www.autohotkey.com/forum/topic22923.html
  ;from: Capture Text from Read Only List
  COM_AccInit()
  If   pacc :=   COM_AccessibleObjectFromWindow(hWnd)
  {
     Loop, %   COM_AccessibleChildren(pacc, COM_Invoke(pacc,"accChildCount"), varChildren)
     If   paccChild:=NumGet(varChildren,16*A_Index-8)
     ttlName :=COM_Invoke(paccChild,"accName",0)
     pthValue :=COM_Invoke(paccChild,"accValue",0)
        , COM_Release(paccChild)
     COM_Release(pacc)
  }
  COM_AccTerm()

  If WinActive("ahk_class OpusApp") ; Word
  {
    COM_Init()
    Word := COM_GetActiveObject("Word.Application")
    ActiveDocument := com_invoke(Word,"ActiveDocument")
    pthValue := COM_Invoke(ActiveDocument, "Path") . "\" . COM_Invoke(ActiveDocument, "Name")
  }
Return


;получает текущую директорию процесса по его PID'у
GetProcCurrentDirectory(pid)
{
   global ProcessBasicInformation, PROCESS_QUERY_INFORMATION, PROCESS_VM_READ
   hProc := OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pid)
   if (hProc=0)
   {
      return Error
   }
   VarSetCapacity(ProcessInformation, 0x18) ; под PROCESS_BASIC_INFORMATION
   VarSetCapacity(Buffer, 8)
   VarSetCapacity(ReturnLength, 4) ; формальность
   ZwQueryInformationProcess(hProc, ProcessBasicInformation, &ProcessInformation, 0x18, &ReturnLength)
   ;по смещению 4 располагается адрес PEB
   ReadProcessMemory(hProc, NumGet(&ProcessInformation, 4)+16, &Buffer, 4, &ReturnLength)
   ;по смещению 16 в PEB находится адрес структуры RTL_USER_PROCESS_PARAMETERS
   ReadProcessMemory(hProc, NumGet(&Buffer)+56, &Buffer, 8, &ReturnLength)
   ; слово по смещению 0 содержит длину строки в байтах
   ; двойное слово по смещению 4 содержит адрес строки
   ; строка НЕ заканчивается нулём
   x:=NumGet(&Buffer, 0, "ushort")
   VarSetCapacity(str, x) ; выделяем необходимое место
   ReadProcessMemory(hProc, NumGet(&Buffer, 4), &str, x, &ReturnLength)
   x:=StrGet(&str, x/2, "UTF-16")
 
   VarSetCapacity(ProcessInformation, 0) ; освобождаем память
   VarSetCapacity(str, 0)
   VarSetCapacity(Buffer, 0)
   VarSetCapacity(ReturnLength, 0)
   return x
}


;------------------------------------------------------------------------------
; COM.ahk Standard Library
; by Sean
; http://www.autohotkey.com/forum/topic22923.html
;------------------------------------------------------------------------------

COM_Init(bUn = "")
{
    Static    h
    Return    (bUn&&!h:="")||h==""&&1==(h:=DllCall("ole32\OleInitialize","Uint",0))?DllCall("ole32\OleUninitialize"):0
}

COM_Term()
{
    COM_Init(1)
}

COM_VTable(ppv, idx)
{
    Return    NumGet(NumGet(1*ppv)+4*idx)
}

COM_QueryInterface(ppv, IID = "")
{
    If    DllCall(NumGet(NumGet(1*ppv:=COM_Unwrap(ppv))), "Uint", ppv+0, "Uint", COM_GUID4String(IID,IID ? IID:IID=0 ? "{00000000-0000-0000-C000-000000000046}":"{00020400-0000-0000-C000-000000000046}"), "UintP", ppv:=0)=0
    Return    ppv
}

COM_AddRef(ppv)
{
    Return    DllCall(NumGet(NumGet(1*ppv:=COM_Unwrap(ppv))+4), "Uint", ppv)
}

COM_Release(ppv)
{
    If Not    IsObject(ppv)
    Return    DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)
    Else
    {
    nRef:=    DllCall(NumGet(NumGet(COM_Unwrap(ppv))+8), "Uint", COM_Unwrap(ppv)), nRef==0 ? (ppv.prm_:=0):""
    Return    nRef
    }
}

COM_QueryService(ppv, SID, IID = "")
{
    If    DllCall(NumGet(NumGet(1*ppv:=COM_Unwrap(ppv))), "Uint", ppv, "Uint", COM_GUID4String(IID_IServiceProvider,"{6D5140C1-7436-11CE-8034-00AA006009FA}"), "UintP", psp)=0
    &&    DllCall(NumGet(NumGet(1*psp)+12), "Uint", psp, "Uint", COM_GUID4String(SID,SID), "Uint", IID ? COM_GUID4String(IID,IID):&SID, "UintP", ppv:=0)+DllCall(NumGet(NumGet(1*psp)+8), "Uint", psp)*0=0
    Return    COM_Enwrap(ppv)
}

COM_FindConnectionPoint(pdp, DIID)
{
    DllCall(NumGet(NumGet(1*pdp)+ 0), "Uint", pdp, "Uint", COM_GUID4String(IID_IConnectionPointContainer, "{B196B284-BAB4-101A-B69C-00AA00341D07}"), "UintP", pcc)
    DllCall(NumGet(NumGet(1*pcc)+16), "Uint", pcc, "Uint", COM_GUID4String(DIID,DIID), "UintP", pcp)
    DllCall(NumGet(NumGet(1*pcc)+ 8), "Uint", pcc)
    Return    pcp
}

COM_GetConnectionInterface(pcp)
{
    VarSetCapacity(DIID,16,0)
    DllCall(NumGet(NumGet(1*pcp)+12), "Uint", pcp, "Uint", &DIID)
    Return    COM_String4GUID(&DIID)
}

COM_Advise(pcp, psink)
{
    DllCall(NumGet(NumGet(1*pcp)+20), "Uint", pcp, "Uint", psink, "UintP", nCookie)
    Return    nCookie
}

COM_Unadvise(pcp, nCookie)
{
    Return    DllCall(NumGet(NumGet(1*pcp)+24), "Uint", pcp, "Uint", nCookie)
}

COM_Enumerate(penum, ByRef Result, ByRef vt = "")
{
    VarSetCapacity(varResult,16,0)
    If (0 =    hr:=DllCall(NumGet(NumGet(1*penum:=COM_Unwrap(penum))+12), "Uint", penum, "Uint", 1, "Uint", &varResult, "UintP", 0))
    Result:=(vt:=NumGet(varResult,0,"Ushort"))=9||vt=13?COM_Enwrap(NumGet(varResult,8),vt):vt=8||vt<0x1000&&COM_VariantChangeType(&varResult,&varResult)=0?StrGet(NumGet(varResult,8)) . COM_VariantClear(&varResult):NumGet(varResult,8)
    Return    hr
}

COM_Invoke(pdsp,name="",prm0="vT_NoNe",prm1="vT_NoNe",prm2="vT_NoNe",prm3="vT_NoNe",prm4="vT_NoNe",prm5="vT_NoNe",prm6="vT_NoNe",prm7="vT_NoNe",prm8="vT_NoNe",prm9="vT_NoNe")
{
    pdsp :=    COM_Unwrap(pdsp)
    If    name=
    Return    DllCall(NumGet(NumGet(1*pdsp)+8),"Uint",pdsp)
    If    name contains .
    {
        SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . "."
    Loop,    Parse,    name, .
    {
    If    A_Index=1
    {
        name :=    A_LoopField
        Continue
    }
    Else If    name not contains [,(
        prmn :=    ""
    Else If    InStr("])",SubStr(name,0))
    Loop,    Parse,    name, [(,'")]
    If    A_Index=1
        name :=    A_LoopField
    Else    prmn :=    A_LoopField
    Else
    {
        name .=    "." . A_LoopField
        Continue
    }
    If    A_LoopField!=
        pdsp:=    COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe"),name:=A_LoopField
    Else    Return    prmn!=""?COM_Invoke(pdsp,name,prmn,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8):COM_Invoke(pdsp,name,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8,prm9)
    }
    }
    Static    varg,namg,iidn,varResult,sParams
    VarSetCapacity(varResult,64,0),sParams?"":(sParams:="0123456789",VarSetCapacity(varg,160,0),VarSetCapacity(namg,88,0),VarSetCapacity(iidn,16,0)),mParams:=0,nParams:=10,nvk:=3
    Loop,     Parse,    sParams
    If    (prm%A_LoopField%=="vT_NoNe")
    {
         nParams:=A_Index-1
        Break
    }
    Else If    prm%A_LoopField% is integer
        NumPut(SubStr(prm%A_LoopField%,1,1)="+"?9:prm%A_LoopField%=="-0"?(prm%A_LoopField%:=0x80020004)*0+10:3,NumPut(prm%A_LoopField%,varg,168-16*A_Index),-12)
    Else If    IsObject(prm%A_LoopField%)
        typ:=prm%A_LoopField%["typ_"],prm:=prm%A_LoopField%["prm_"],typ+0==""?(NumPut(&_nam_%A_LoopField%:=typ,namg,84-4*mParams++),typ:=prm%A_LoopField%["nam_"]+0==""?prm+0==""||InStr(prm,".")?8:3:prm%A_LoopField%["nam_"]):"",NumPut(typ==8?COM_SysString(prm%A_LoopField%,prm):prm,NumPut(typ,varg,160-16*A_Index),4)
    Else    NumPut(COM_SysString(prm%A_LoopField%,prm%A_LoopField%),NumPut(8,varg,160-16*A_Index),4)
    If    nParams
        SubStr(name,0)="="?(name:=SubStr(name,1,-1),nvk:=12,NumPut(-3,namg,4)):"",NumPut(nvk==12?1:mParams,NumPut(nParams,NumPut(&namg+4,NumPut(&varg+160-16*nParams,varResult,16))))
    Global    COM_HR, COM_LR:=""
    If    (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&iidn,"Uint",NumPut(&name,namg,84-4*mParams)-4,"Uint",1+mParams,"Uint",1024,"Uint",&namg,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",NumGet(namg),"Uint",&iidn,"Uint",1024,"Ushort",nvk,"Uint",&varResult+16,"Uint",&varResult,"Uint",&varResult+32,"Uint",0,"Uint"))!=0&&nParams&&nvk<4&&NumPut(-3,namg,4)&&(COM_LR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",NumGet(namg),"Uint",&iidn,"Uint",1024,"Ushort",12,"Uint",NumPut(1,varResult,28)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0
        COM_HR:=0
    Global    COM_VT:=NumGet(varResult,0,"Ushort")
    Return    COM_HR=0?COM_VT>1?COM_VT=9||COM_VT=13?COM_Enwrap(NumGet(varResult,8),COM_VT):COM_VT=8||COM_VT<0x1000&&COM_VariantChangeType(&varResult,&varResult)=0?StrGet(NumGet(varResult,8)) . COM_VariantClear(&varResult):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&varResult+32,name)
}

COM_InvokeSet(pdsp,name,prm0,prm1="vT_NoNe",prm2="vT_NoNe",prm3="vT_NoNe",prm4="vT_NoNe",prm5="vT_NoNe",prm6="vT_NoNe",prm7="vT_NoNe",prm8="vT_NoNe",prm9="vT_NoNe")
{
    Return    COM_Invoke(pdsp,name "=",prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8,prm9)
}

COM_DispInterface(this, prm1="", prm2="", prm3="", prm4="", prm5="", prm6="", prm7="", prm8="")
{
    Critical
    If    A_EventInfo = 6
        hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+28),"Uint",p,"Uint",prm1,"UintP",pname,"Uint",1,"UintP",0),hr==0?(sfn:=StrGet(this+40) . StrGet(pname),COM_SysFreeString(pname),%sfn%(prm5,this,prm6)):""
    Else If    A_EventInfo = 5
        hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+40),"Uint",p,"Uint",prm2,"Uint",prm3,"Uint",prm5)
    Else If    A_EventInfo = 4
        NumPut(0*hr:=0x80004001,prm3+0)
    Else If    A_EventInfo = 3
        NumPut(0,prm1+0)
    Else If    A_EventInfo = 2
        NumPut(hr:=NumGet(this+4)-1,this+4)
    Else If    A_EventInfo = 1
        NumPut(hr:=NumGet(this+4)+1,this+4)
    Else If    A_EventInfo = 0
        COM_IsEqualGUID(this+24,prm1)||InStr("{00020400-0000-0000-C000-000000000046}{00000000-0000-0000-C000-000000000046}",COM_String4GUID(prm1)) ? NumPut(NumPut(NumGet(this+4)+1,this+4)-8,prm2+0):NumPut(0*hr:=0x80004002,prm2+0)
    Return    hr
}

COM_DispGetParam(pDispParams, Position = 0, vt = 8)
{
    VarSetCapacity(varResult,16,0)
    DllCall("oleaut32\DispGetParam", "Uint", pDispParams, "Uint", Position, "Ushort", vt, "Uint", &varResult, "UintP", nArgErr)
    Return    (vt:=NumGet(varResult,0,"Ushort"))=8?StrGet(NumGet(varResult,8)) . COM_VariantClear(&varResult):vt=9||vt=13?COM_Enwrap(NumGet(varResult,8),vt):NumGet(varResult,8)
}

COM_DispSetParam(val, pDispParams, Position = 0, vt = 8)
{
    Return    NumPut(vt=8?COM_SysAllocString(val):vt=9||vt=13?COM_Unwrap(val):val,NumGet(NumGet(pDispParams+0)+(NumGet(pDispParams+8)-Position)*16-8),0,vt=11||vt=2 ? "short":"int")
}

COM_Error(hr = "", lr = "", pei = "", name = "")
{
    Static    bDebug:=1
    If Not    pei
    {
    bDebug:=hr
    Global    COM_HR, COM_LR
    Return    COM_HR&&COM_LR ? COM_LR<<32|COM_HR:COM_HR
    }
    Else If    !bDebug
    Return
    hr ? (VarSetCapacity(sError,1022),VarSetCapacity(nError,62),DllCall("kernel32\FormatMessage","Uint",0x1200,"Uint",0,"Uint",hr<>0x80020009?hr:(bExcep:=1)*(hr:=NumGet(pei+28))?hr:hr:=NumGet(pei+0,0,"Ushort")+0x80040200,"Uint",0,"str",sError,"Uint",512,"Uint",0),DllCall("kernel32\FormatMessage","Uint",0x2400,"str","0x%1!p!","Uint",0,"Uint",0,"str",nError,"Uint",32,"UintP",hr)):sError:="No COM Dispatch Object!`n",lr?(VarSetCapacity(sError2,1022),VarSetCapacity(nError2,62),DllCall("kernel32\FormatMessage","Uint",0x1200,"Uint",0,"Uint",lr,"Uint",0,"str",sError2,"Uint",512,"Uint",0),DllCall("kernel32\FormatMessage","Uint",0x2400,"str","0x%1!p!","Uint",0,"Uint",0,"str",nError2,"Uint",32,"UintP",lr)):""
    MsgBox, 260, COM Error Notification, % "Function Name:`t""" . name . """`nERROR:`t" . sError . "`t(" . nError . ")" . (bExcep ? SubStr(NumGet(pei+24) ? DllCall(NumGet(pei+24),"Uint",pei) : "",1,0) . "`nPROG:`t" . StrGet(NumGet(pei+4)) . COM_SysFreeString(NumGet(pei+4)) . "`nDESC:`t" . StrGet(NumGet(pei+8)) . COM_SysFreeString(NumGet(pei+8)) . "`nHELP:`t" . StrGet(NumGet(pei+12)) . COM_SysFreeString(NumGet(pei+12)) . "," . NumGet(pei+16) : "") . (lr ? "`n`nERROR2:`t" . sError2 . "`t(" . nError2 . ")" : "") . "`n`nWill Continue?"
    IfMsgBox, No, Exit
}

COM_CreateIDispatch()
{
    Static    IDispatch
    If Not    VarSetCapacity(IDispatch)
    {
        VarSetCapacity(IDispatch,28,0),   nParams=3112469
        Loop,   Parse,   nParams
        NumPut(RegisterCallback("COM_DispInterface","",A_LoopField,A_Index-1),IDispatch,4*(A_Index-1))
    }
    Return &IDispatch
}

COM_GetDefaultInterface(pdisp)
{
    DllCall(NumGet(NumGet(1*pdisp) +12), "Uint", pdisp , "UintP", ctinf)
    If    ctinf
    {
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
    DllCall(NumGet(NumGet(1*pdisp)+ 0), "Uint", pdisp, "Uint" , pattr, "UintP", ppv)
    DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
    If    ppv
    DllCall(NumGet(NumGet(1*pdisp)+ 8), "Uint", pdisp),    pdisp := ppv
    }
    Return    pdisp
}

COM_GetDefaultEvents(pdisp)
{
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
    VarSetCapacity(IID,16),DllCall("kernel32\RtlMoveMemory","Uint",&IID,"Uint",pattr,"Uint",16)
    DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
    DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
    Loop, %    DllCall(NumGet(NumGet(1*ptlib)+12), "Uint", ptlib)
    {
        DllCall(NumGet(NumGet(1*ptlib)+20), "Uint", ptlib, "Uint", A_Index-1, "UintP", TKind)
        If    TKind <> 5
            Continue
        DllCall(NumGet(NumGet(1*ptlib)+16), "Uint", ptlib, "Uint", A_Index-1, "UintP", ptinf)
        DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
        nCount:=NumGet(pattr+48,0,"Ushort")
        DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
        Loop, %    nCount
        {
            DllCall(NumGet(NumGet(1*ptinf)+36), "Uint", ptinf, "Uint", A_Index-1, "UintP", nFlags)
            If    !(nFlags & 1)
                Continue
            DllCall(NumGet(NumGet(1*ptinf)+32), "Uint", ptinf, "Uint", A_Index-1, "UintP", hRefType)
            DllCall(NumGet(NumGet(1*ptinf)+56), "Uint", ptinf, "Uint", hRefType , "UintP", prinf)
            DllCall(NumGet(NumGet(1*prinf)+12), "Uint", prinf, "UintP", pattr)
            nFlags & 2 ? DIID:=COM_String4GUID(pattr) : bFind:=COM_IsEqualGUID(pattr,&IID)
            DllCall(NumGet(NumGet(1*prinf)+76), "Uint", prinf, "Uint" , pattr)
            DllCall(NumGet(NumGet(1*prinf)+ 8), "Uint", prinf)
        }
        DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
        If    bFind
            Break
    }
    DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
    Return    bFind ? DIID : "{00000000-0000-0000-0000-000000000000}"
}

COM_GetGuidOfName(pdisp, Name)
{
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf:=0
    DllCall(NumGet(NumGet(1*ptlib)+44), "Uint", ptlib, "Uint", &Name, "Uint", 0, "UintP", ptinf, "UintP", memID, "UshortP", 1)
    DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
    DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
    GUID := COM_String4GUID(pattr)
    DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
    Return    GUID
}

COM_GetTypeInfoOfGuid(pdisp, GUID)
{
    DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", 1024, "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
    DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf := 0
    DllCall(NumGet(NumGet(1*ptlib)+24), "Uint", ptlib, "Uint", COM_GUID4String(GUID,GUID), "UintP", ptinf)
    DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
    Return    ptinf
}

COM_ConnectObject(pdisp, prefix = "", DIID = "")
{
    pdisp:=    COM_Unwrap(pdisp)
    If Not    DIID
        0+(pconn:=COM_FindConnectionPoint(pdisp,"{00020400-0000-0000-C000-000000000046}")) ? (DIID:=COM_GetConnectionInterface(pconn))="{00020400-0000-0000-C000-000000000046}" ? DIID:=COM_GetDefaultEvents(pdisp):"":pconn:=COM_FindConnectionPoint(pdisp,DIID:=COM_GetDefaultEvents(pdisp))
    Else    pconn:=COM_FindConnectionPoint(pdisp,SubStr(DIID,1,1)="{" ? DIID:DIID:=COM_GetGuidOfName(pdisp,DIID))
    If    !pconn||!ptinf:=COM_GetTypeInfoOfGuid(pdisp,DIID)
    {
        MsgBox, No Event Interface Exists!
        Return
    }
    NumPut(pdisp,NumPut(ptinf,NumPut(1,NumPut(COM_CreateIDispatch(),0+psink:=COM_CoTaskMemAlloc(40+nSize:=StrLen(prefix)*2+2)))))
    DllCall("kernel32\RtlMoveMemory","Uint",psink+24,"Uint",COM_GUID4String(DIID,DIID),"Uint",16)
    DllCall("kernel32\RtlMoveMemory","Uint",psink+40,"Uint",&prefix,"Uint",nSize)
    NumPut(COM_Advise(pconn,psink),NumPut(pconn,psink+16))
    Return    psink
}

COM_DisconnectObject(psink)
{
    Return    COM_Unadvise(NumGet(psink+16),NumGet(psink+20))=0 ? (0,COM_Release(NumGet(psink+16)),COM_Release(NumGet(psink+8)),COM_CoTaskMemFree(psink)):1
}

COM_CreateObject(CLSID, IID = "", CLSCTX = 21)
{
    ppv :=    COM_CreateInstance(CLSID,IID,CLSCTX)
    Return    IID=="" ? COM_Enwrap(ppv):ppv
}

COM_GetObject(Name)
{
    COM_Init()
    If    DllCall("ole32\CoGetObject", "Uint", &Name, "Uint", 0, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)=0
    Return    COM_Enwrap(pdisp)
}

COM_GetActiveObject(CLSID)
{
    COM_Init()
    If    DllCall("oleaut32\GetActiveObject", "Uint", COM_GUID4String(CLSID,CLSID), "Uint", 0, "UintP", punk)=0
    &&    DllCall(NumGet(NumGet(1*punk)), "Uint", punk, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)+DllCall(NumGet(NumGet(1*punk)+8), "Uint", punk)*0=0
    Return    COM_Enwrap(pdisp)
}

COM_CreateInstance(CLSID, IID = "", CLSCTX = 21)
{
    COM_Init()
    If    DllCall("ole32\CoCreateInstance", "Uint", COM_GUID4String(CLSID,CLSID), "Uint", 0, "Uint", CLSCTX, "Uint", COM_GUID4String(IID,IID ? IID:IID=0 ? "{00000000-0000-0000-C000-000000000046}":"{00020400-0000-0000-C000-000000000046}"), "UintP", ppv)=0
    Return    ppv
}

COM_CLSID4ProgID(ByRef CLSID, ProgID)
{
    VarSetCapacity(CLSID,16,0)
    DllCall("ole32\CLSIDFromProgID", "Uint", &ProgID, "Uint", &CLSID)
    Return    &CLSID
}

COM_ProgID4CLSID(pCLSID)
{
    DllCall("ole32\ProgIDFromCLSID", "Uint", pCLSID, "UintP", pProgID)
    Return    StrGet(pProgID) . COM_CoTaskMemFree(pProgID)
}

COM_GUID4String(ByRef CLSID, String)
{
    VarSetCapacity(CLSID,16,0)
    DllCall("ole32\CLSIDFromString", "Uint", &String, "Uint", &CLSID)
    Return    &CLSID
}

COM_String4GUID(pGUID)
{
    VarSetCapacity(String,38*2)
    DllCall("ole32\StringFromGUID2", "Uint", pGUID, "str", String, "int", 39)
    Return    String
}

COM_IsEqualGUID(pGUID1, pGUID2)
{
    Return    DllCall("ole32\IsEqualGUID", "Uint", pGUID1, "Uint", pGUID2)
}

COM_CoCreateGuid()
{
    VarSetCapacity(GUID,16,0)
    DllCall("ole32\CoCreateGuid", "Uint", &GUID)
    Return    COM_String4GUID(&GUID)
}

COM_CoInitialize()
{
    Return    DllCall("ole32\CoInitialize", "Uint", 0)
}

COM_CoUninitialize()
{
        DllCall("ole32\CoUninitialize")
}

COM_CoTaskMemAlloc(cb)
{
    Return    DllCall("ole32\CoTaskMemAlloc", "Uint", cb)
}

COM_CoTaskMemFree(pv)
{
        DllCall("ole32\CoTaskMemFree", "Uint", pv)
}

COM_SysAllocString(str)
{
    Return    DllCall("oleaut32\SysAllocString", "Uint", &str)
}

COM_SysFreeString(pstr)
{
        DllCall("oleaut32\SysFreeString", "Uint", pstr)
}

COM_SafeArrayDestroy(psar)
{
    Return    DllCall("oleaut32\SafeArrayDestroy", "Uint", psar)
}

COM_VariantClear(pvar)
{
        DllCall("oleaut32\VariantClear", "Uint", pvar)
}

COM_VariantChangeType(pvarDst, pvarSrc, vt = 8)
{
    Return    DllCall("oleaut32\VariantChangeTypeEx", "Uint", pvarDst, "Uint", pvarSrc, "Uint", 1024, "Ushort", 0, "Ushort", vt)
}

COM_SysString(ByRef wString, sString)
{
    VarSetCapacity(wString,4+nLen:=2*StrLen(sString))
    Return    DllCall("kernel32\lstrcpyW","Uint",NumPut(nLen,wString),"Uint",&sString)
}

COM_AccInit()
{
    Static    h
    If Not    h
    COM_Init(), h:=DllCall("kernel32\LoadLibrary","str","oleacc")
}

COM_AccTerm()
{
    COM_Term()
}

COM_AccessibleChildren(pacc, cChildren, ByRef varChildren)
{
    VarSetCapacity(varChildren,cChildren*16,0)
    If    DllCall("oleacc\AccessibleChildren", "Uint", COM_Unwrap(pacc), "Uint", 0, "Uint", cChildren+0, "Uint", &varChildren, "UintP", cChildren:=0)=0
    Return    cChildren
}

COM_AccessibleObjectFromEvent(hWnd, idObject, idChild, ByRef _idChild_="")
{
    COM_AccInit(), VarSetCapacity(varChild,16,0)
    If    DllCall("oleacc\AccessibleObjectFromEvent", "Uint", hWnd, "Uint", idObject, "Uint", idChild, "UintP", pacc, "Uint", &varChild)=0
    Return    COM_Enwrap(pacc), _idChild_:=NumGet(varChild,8)
}

COM_AccessibleObjectFromPoint(x, y, ByRef _idChild_="")
{
    COM_AccInit(), VarSetCapacity(varChild,16,0)
    If    DllCall("oleacc\AccessibleObjectFromPoint", "int", x, "int", y, "UintP", pacc, "Uint", &varChild)=0
    Return    COM_Enwrap(pacc), _idChild_:=NumGet(varChild,8)
}

COM_AccessibleObjectFromWindow(hWnd, idObject=-4, IID = "")
{
    COM_AccInit()
    If    DllCall("oleacc\AccessibleObjectFromWindow", "Uint", hWnd, "Uint", idObject, "Uint", COM_GUID4String(IID, IID ? IID : idObject&0xFFFFFFFF==0xFFFFFFF0 ? "{00020400-0000-0000-C000-000000000046}":"{618736E0-3C3D-11CF-810C-00AA00389B71}"), "UintP", pacc)=0
    Return    COM_Enwrap(pacc)
}

COM_WindowFromAccessibleObject(pacc)
{
    If    DllCall("oleacc\WindowFromAccessibleObject", "Uint", COM_Unwrap(pacc), "UintP", hWnd)=0
    Return    hWnd
}

COM_GetRoleText(nRole)
{
    nLen:=    DllCall("oleacc\GetRoleTextW", "Uint", nRole, "Uint", 0, "Uint", 0)
    VarSetCapacity(sRole,nLen*2)
    If    DllCall("oleacc\GetRoleTextW", "Uint", nRole, "str", sRole, "Uint", nLen+1)
    Return    sRole
}

COM_GetStateText(nState)
{
    nLen:=    DllCall("oleacc\GetStateTextW", "Uint", nState, "Uint", 0, "Uint", 0)
    VarSetCapacity(sState,nLen*2)
    If    DllCall("oleacc\GetStateTextW", "Uint", nState, "str", sState, "Uint", nLen+1)
    Return    sState
}

COM_AtlAxWinInit(Version = "")
{
    Static    h
    If Not    h
    COM_Init(), h:=DllCall("kernel32\LoadLibrary","str","atl" . Version), DllCall("atl" . Version . "\AtlAxWinInit")
}

COM_AtlAxWinTerm(Version = "")
{
    COM_Term()
}

COM_AtlAxGetHost(hWnd, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxGetHost", "Uint", hWnd, "UintP", punk)=0
    Return    COM_Enwrap(COM_QueryInterface(punk)+COM_Release(punk)*0)
}

COM_AtlAxGetControl(hWnd, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxGetControl", "Uint", hWnd, "UintP", punk)=0
    Return    COM_Enwrap(COM_QueryInterface(punk)+COM_Release(punk)*0)
}

COM_AtlAxAttachControl(pdsp, hWnd, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxAttachControl", "Uint", punk:=COM_QueryInterface(pdsp,0), "Uint", hWnd, "Uint", COM_AtlAxWinInit(Version))+COM_Release(punk)*0=0
    Return    COM_Enwrap(pdsp)
}

COM_AtlAxCreateControl(hWnd, Name, Version = "")
{
    If    DllCall("atl" . Version . "\AtlAxCreateControl", "Uint", &Name, "Uint", hWnd, "Uint", 0, "Uint", COM_AtlAxWinInit(Version))=0
    Return    COM_AtlAxGetControl(hWnd,Version)
}

COM_AtlAxCreateContainer(hWnd, l, t, w, h, Name = "", Version = "")
{
    Return    DllCall("user32\CreateWindowEx", "Uint",0x200, "str", "AtlAxWin" . Version, "Uint", Name?&Name:0, "Uint", 0x54000000, "int", l, "int", t, "int", w, "int", h, "Uint", hWnd, "Uint", 0, "Uint", 0, "Uint", COM_AtlAxWinInit(Version))
}

COM_AtlAxGetContainer(pdsp, bCtrl = "")
{
    DllCall(NumGet(NumGet(1*pdsp:=COM_Unwrap(pdsp))), "Uint", pdsp, "Uint", COM_GUID4String(IID_IOleWindow,"{00000114-0000-0000-C000-000000000046}"), "UintP", pwin)
    DllCall(NumGet(NumGet(1*pwin)+12), "Uint", pwin, "UintP", hCtrl)
    DllCall(NumGet(NumGet(1*pwin)+ 8), "Uint", pwin)
    Return    bCtrl?hCtrl:DllCall("user32\GetParent", "Uint", hCtrl)
}

COM_ScriptControl(sCode, sEval = "", sName = "", Obj = "", bGlobal = "")
{
    oSC:=COM_CreateObject("ScriptControl"), oSC.Language(sEval+0==""?"VBScript":"JScript"), sName&&Obj?oSC.AddObject(sName,Obj,bGlobal):""
    Return    sEval?oSC.Eval(sEval+0?sCode:sEval oSC.AddCode(sCode)):oSC.ExecuteStatement(sCode)
}

COM_Parameter(typ, prm = "", nam = "")
{
    Return    IsObject(prm)?prm:Object("typ_",typ,"prm_",prm,"nam_",nam)
}

COM_Enwrap(obj, vt = 9)
{
    Static    base
    Return    IsObject(obj)?obj:Object("prm_",obj,"typ_",vt,"base",base?base:base:=Object("__Delete","COM_Invoke","__Call","COM_Invoke","__Get","COM_Invoke","__Set","COM_InvokeSet","base",Object("__Delete","COM_Term")))
}

COM_Unwrap(obj)
{
    Return    IsObject(obj)?obj.prm_:obj
}
;------------------------------------------------------------------------------
; END  COM.ahk Standard Library
;------------------------------------------------------------------------------

Но, странно: получаемая адресная строка IE не обновляется при последующих нажатиях...
И, Александр_, — по командной строке циферки где бы выведать?

7

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

DD пишет:

И, Александр_, — по командной строке циферки где бы выведать?

там же- смещение 64. Тут полное описание структуры, смещения считать очень просто- ULONG, PVOID и HANDLE занимают по 4 байта, а UNICODE_STRING 8 байт(всё верно для x86). смещение первого элемента равно нулю, смещение второго равно смещению первого плюс размер первого, смещение n-го равно смещению (n-1)-го плюс размер (n-1)-го.

8

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

Стоило мне закомментировать (благодаря какому-то внезапно-случайному наитию) ссылку на функцию

COM_AccTerm()

— судя по всему и вызывавшую ошибку, — все заработало.
Проверьте у себя, Александр_, — работает ли?

Обновил первый пост.

9

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

DD пишет:

Проверьте у себя, Александр_, — работает ли?

Работает.

10

Re: AHK_L: Ошибка при повторной попытке вывода инфы из некоторых окон

Спасибо!