Scripts plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

KDJ, see the difference: "You spend a few days to write it yoursefl and you understand it" and "You got code written by Instructor or somebody else and spend a few days to understand it"?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FeyFre wrote:Оно тут всё так и просится в врапер :)
Maybe in this way:

Code: Select all

var oSys     = AkelPad.SystemFunction();
var hAtlLib  = oSys.Call("Kernel32::LoadLibraryW", "Atl.dll");
var hMainWnd = AkelPad.GetMainWnd();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var sTitle   = "WebBrowser control";
var sWBClass = "AtlAxWin";
var sWBTitle = "Shell.Explorer.2";
var IDWB     = 1000;
var hDlg;
var hWndWB;
var oWB;

oSys.Call("Atl::AtlAxWinInit");
AkelPad.WindowRegisterClass(sClass);

AkelPad.CreateDialog(0, sClass, sTitle, 0x90C80040 /*WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_SETFONT*/, 200, 100, 500, 300, hMainWnd, DlgCallback, 0x3 /*CDF_PIXELS|CDF_MODAL*/, 0, 0, "", 0, 0, "|",
                     0, sWBClass, sWBTitle, 0x50000000 /*WS_VISIBLE|WS_CHILD*/, 0, 0, 500, 300, IDWB, 0);

AkelPad.WindowUnregisterClass(sClass);
oSys.Call("Kernel32::FreeLibrary", hAtlLib);

function DlgCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    hDlg   = hWnd;
    hWndWB = oSys.Call("User32::GetDlgItem", hDlg, IDWB);
    oWB    = new WebBrowserObject(hWndWB, WebBrowserEvents);

    oWB.Navigate("http://akelpad.sourceforge.net");
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    if ((wParam & 0xFFFF) == 2 /*IDCANCEL*/)
    {
      oWB.Release();
      oSys.Call("user32::EndDialog", hDlg, 0);
    }
  }

  return 0;
}

function WebBrowserEvents(nEvent)
{
  if (nEvent == 259 /*DISPID_DOCUMENTCOMPLETE*/)
  {
    WScript.Echo("Document complete.");
  }
}

//object constructor
function WebBrowserObject(hWndWB, EventsProc)
{
  var lppUnknown=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
  var lpUnknown=0;
  var lpUnknownVtbl;
  var lpUnknown_QueryInterface;
  var lpIID_WebBrowser2=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
  var lppWebBrowser2=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
  var lpWebBrowser2=0;
  var lpWebBrowser2Vtbl;
  var lpWebBrowser2_QueryInterface;
  var lpWebBrowser2_Navigate;
  var lpWebBrowser2_Release;
  var lpIID_ConnectionPointContainer=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
  var lppConnectionPointContainer=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
  var lpConnectionPointContainer=0;
  var lpConnectionPointContainerVtbl;
  var lpConnectionPointContainer_Release;
  var lpConnectionPointContainer_FindConnectionPoint;
  var lpDIID_DWebBrowserEvents2=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
  var lppConnectionPoint=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
  var lpConnectionPoint=0;
  var lpConnectionPointVtbl;
  var lpConnectionPoint_Release;
  var lpConnectionPoint_Advise;
  var lpConnectionPoint_Unadvise;
  var lpdwCookie=AkelPad.MemAlloc(4 /*sizeof(DWORD)*/);
  var dwCookie=0;
  var lpSinkVtbl;
  var lpSink=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown*)*/);
  var aSinkVtbl=[];
  var lpIID_IUnknown=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
  var lpIID_IDispatch=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
  var i;

  //Connect to COM events - init
  if (!oSys.Call("Atl::AtlAxGetControl", hWndWB, lppUnknown))
  {
    lpUnknown=AkelPad.MemRead(lppUnknown, 2 /*DT_QWORD*/);
    lpUnknownVtbl=AkelPad.MemRead(_PtrAdd(lpUnknown, 0) /*offsetof(IUnknown, lpVtbl)*/, 2 /*DT_QWORD*/);
    lpUnknown_QueryInterface=AkelPad.MemRead(_PtrAdd(lpUnknownVtbl, 0) /*offsetof(IUnknownVtbl, QueryInterface)*/, 2 /*DT_QWORD*/);

    oSys.Call("ole32::IIDFromString", "{D30C1661-CDAF-11d0-8A3E-00C04FC9E26E}", lpIID_WebBrowser2);
    if (!oSys.Call(lpUnknown_QueryInterface, lpUnknown, lpIID_WebBrowser2, lppWebBrowser2))
    {
      lpWebBrowser2=AkelPad.MemRead(lppWebBrowser2, 2 /*DT_QWORD*/);
      lpWebBrowser2Vtbl=AkelPad.MemRead(_PtrAdd(lpWebBrowser2, 0) /*offsetof(IWebBrowser2, lpVtbl)*/, 2 /*DT_QWORD*/);
      lpWebBrowser2_QueryInterface=AkelPad.MemRead(_PtrAdd(lpWebBrowser2Vtbl, 0) /*offsetof(IWebBrowser2Vtbl, QueryInterface)*/, 2 /*DT_QWORD*/);
      lpWebBrowser2_Release=AkelPad.MemRead(_PtrAdd(lpWebBrowser2Vtbl, _X64?16:8) /*offsetof(IWebBrowser2Vtbl, Release)*/, 2 /*DT_QWORD*/);
      lpWebBrowser2_Navigate=AkelPad.MemRead(_PtrAdd(lpWebBrowser2Vtbl, _X64?88:44) /*offsetof(IWebBrowser2Vtbl, Navigate)*/, 2 /*DT_QWORD*/);

      oSys.Call("ole32::IIDFromString", "{B196B284-BAB4-101A-B69C-00AA00341D07}", lpIID_ConnectionPointContainer);
      if (!oSys.Call(lpWebBrowser2_QueryInterface, lpWebBrowser2, lpIID_ConnectionPointContainer, lppConnectionPointContainer))
      {
        lpConnectionPointContainer=AkelPad.MemRead(lppConnectionPointContainer, 2 /*DT_QWORD*/);
        lpConnectionPointContainerVtbl=AkelPad.MemRead(_PtrAdd(lpConnectionPointContainer, 0) /*offsetof(IConnectionPointContainer, lpVtbl)*/, 2 /*DT_QWORD*/);
        lpConnectionPointContainer_Release=AkelPad.MemRead(_PtrAdd(lpConnectionPointContainerVtbl, _X64?16:8) /*offsetof(IConnectionPointContainerVtbl, Release)*/, 2 /*DT_QWORD*/);
        lpConnectionPointContainer_FindConnectionPoint=AkelPad.MemRead(_PtrAdd(lpConnectionPointContainerVtbl, _X64?32:16) /*offsetof(IConnectionPointContainerVtbl, FindConnectionPoint)*/, 2 /*DT_QWORD*/);

        oSys.Call("ole32::IIDFromString", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}", lpDIID_DWebBrowserEvents2);
        if (!oSys.Call(lpConnectionPointContainer_FindConnectionPoint, lpConnectionPointContainer, lpDIID_DWebBrowserEvents2, lppConnectionPoint))
        {
          lpConnectionPoint=AkelPad.MemRead(lppConnectionPoint, 2 /*DT_QWORD*/);
          lpConnectionPointVtbl=AkelPad.MemRead(_PtrAdd(lpConnectionPoint, 0) /*offsetof(IConnectionPoint, lpVtbl)*/, 2 /*DT_QWORD*/);
          lpConnectionPoint_Release=AkelPad.MemRead(_PtrAdd(lpConnectionPointVtbl, _X64?16:8) /*offsetof(IConnectionPointVtbl, Release)*/, 2 /*DT_QWORD*/);
          lpConnectionPoint_Advise=AkelPad.MemRead(_PtrAdd(lpConnectionPointVtbl, _X64?40:20) /*offsetof(IConnectionPointVtbl, Advise)*/, 2 /*DT_QWORD*/);
          lpConnectionPoint_Unadvise=AkelPad.MemRead(_PtrAdd(lpConnectionPointVtbl, _X64?48:24) /*offsetof(IConnectionPointVtbl, Unadvise)*/, 2 /*DT_QWORD*/);

          aSinkVtbl=[oSys.RegisterCallback(Sink_QueryInterface),
                     oSys.RegisterCallback(Sink_AddRef),
                     oSys.RegisterCallback(Sink_Release),
                     oSys.RegisterCallback(Sink_GetTypeInfoCount),
                     oSys.RegisterCallback(Sink_GetTypeInfo),
                     oSys.RegisterCallback(Sink_GetIDsOfNames),
                     oSys.RegisterCallback(Sink_Invoke)];

          lpSinkVtbl=AkelPad.MemAlloc((_X64?8:4 /*sizeof(PROC)*/) * aSinkVtbl.length);
          for (i=0; i < aSinkVtbl.length; ++i)
            AkelPad.MemCopy(_PtrAdd(lpSinkVtbl, i * (_X64?8:4 /*sizeof(PROC)*/)), aSinkVtbl[i], 2 /*DT_QWORD*/);

          AkelPad.MemCopy(_PtrAdd(lpSink, 0) /*lpSink->lpVtbl*/, lpSinkVtbl, 2 /*DT_QWORD*/);

          oSys.Call("ole32::IIDFromString", "{00000000-0000-0000-C000-000000000046}", lpIID_IUnknown);
          oSys.Call("ole32::IIDFromString", "{00020400-0000-0000-C000-000000000046}", lpIID_IDispatch);
          if (!oSys.Call(lpConnectionPoint_Advise, lpConnectionPoint, lpSink, lpdwCookie))
            dwCookie=AkelPad.MemRead(lpdwCookie, 3 /*DT_DWORD*/);
        }
      }
    }
  }

  //Connect to COM events - sink
  function Sink_QueryInterface(thisObj, vTableGuid, ppv)
  {
    if (oSys.Call("ole32::IsEqualGUID", vTableGuid, lpDIID_DWebBrowserEvents2) ||
        oSys.Call("ole32::IsEqualGUID", vTableGuid, lpIID_IUnknown) ||
        oSys.Call("ole32::IsEqualGUID", vTableGuid, lpIID_IDispatch))
    {
      AkelPad.MemCopy(ppv, thisObj, 2 /*DT_QWORD*/);
      return 0 /*S_OK*/;
    }
    AkelPad.MemCopy(ppv, 0, 2 /*DT_QWORD*/);
    return 0x80004002 /*E_NOINTERFACE*/;
  }

  function Sink_AddRef(thisObj)
  {
    return 0;
  }

  function Sink_Release(thisObj)
  {
    return 0;
  }

  function Sink_GetTypeInfoCount(thisObj, pCount)
  {
    AkelPad.MemCopy(pCount, 0, 3 /*DT_DWORD*/);
    return 0 /*S_OK*/;
  }

  function Sink_GetTypeInfo(thisObj, itinfo, lcid, pTypeInfo)
  {
    AkelPad.MemCopy(pTypeInfo, 0, 2 /*DT_QWORD*/);
    return 0 /*S_OK*/;
  }

  function Sink_GetIDsOfNames(thisObj, riid, rgszNames, cNames, lcid, rgdispid)
  {
    return 0 /*S_OK*/;
  }

  function Sink_Invoke(thisObj, dispid, riid, lcid, wFlags, params, result, pexcepinfo, puArgErr)
  {
    EventsProc(dispid);
    return 0 /*S_OK*/;
  }
  
  this.Navigate = function(url)
  {
    oSys.Call(lpWebBrowser2_Navigate, lpWebBrowser2, url, 0, 0, 0, 0);
  };

  this.Release = function()
  {
    //Connect to COM events - release
    if (dwCookie)
      oSys.Call(lpConnectionPoint_Unadvise, lpConnectionPoint, dwCookie);
    for (i=0; i < aSinkVtbl.length; ++i)
    {
      oSys.UnregisterCallback(aSinkVtbl[i]);
    }
    if (lpConnectionPoint) oSys.Call(lpConnectionPoint_Release, lpConnectionPoint);
    if (lpConnectionPointContainer) oSys.Call(lpConnectionPointContainer_Release, lpConnectionPointContainer);
    if (lpWebBrowser2) oSys.Call(lpWebBrowser2_Release, lpWebBrowser2);
    AkelPad.MemFree(lppUnknown);
    AkelPad.MemFree(lpIID_WebBrowser2);
    AkelPad.MemFree(lppWebBrowser2);
    AkelPad.MemFree(lpDIID_DWebBrowserEvents2);
    AkelPad.MemFree(lpdwCookie);
    AkelPad.MemFree(lpIID_ConnectionPointContainer);
    AkelPad.MemFree(lppConnectionPointContainer);
    AkelPad.MemFree(lppConnectionPoint);
    AkelPad.MemFree(lpSink);
    AkelPad.MemFree(lpIID_IUnknown);
    AkelPad.MemFree(lpIID_IDispatch);
  };
}


Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

No, I mean general purpose method to hide low-level details of interface implementation. Like that:

Code: Select all

function ImplementComInterface(
methods // [arrays of methods - imeplementations of interface]
) {
   var psize = _X64?8:4;
   var vtable = AkelPad.MemAlloc( methods.length*psize );
   for(var idx: methods) {
          var ptr = oSys.RegisterCallback(methods[i]);
          AkelPad.MemCopy(_PtrAdd(vtablem idx*psize), ptr, 2);
   }
   return vtable;
}
function FreeVTable(vt, size) {
     for(var i=0;i<size;i++) {
         // unregister eachcallback
     }
     AkelPad.MemFree(vt);
}
var My_IntDef = [
  My_QueryInterface,
  My_AddRef,
  My_Release,
  My_ThisMethod,
  My_ThatMethod,
  My_OtherMethod,
  My_YetAnotherMethod
];
var vt = ImplementComInterface(My_IntDef);
//! use it
FreeVTable(vt, My_IntDef.length);
And it should be improved to use(automatic cleanup).

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

KDJ
With Scripts v17.8:

Code: Select all

// descriptions:
// https://support.microsoft.com/en-us/kb/192560
// https://msdn.microsoft.com/en-us/library/aa768397%28v=vs.85%29.aspx
// https://msdn.microsoft.com/en-US/library/sxafe2b7%28v=vs.80%29.aspx

var oSys     = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var sTitle   = "WebBrowser control";

var sWBClass = "AtlAxWin";
var sWBTitle = "Shell.Explorer.2";
//var sWBTitle = "http://akelpad.sourceforge.net";
//var sWBTitle = AkelPad.GetAkelDir(2 /*ADTYPE_DOCS*/) + "\\AkelHelp-Eng.htm";
//var sWBTitle = "mshtml:<H1>Hello World</H1>";
//var sWBTitle = "AcroPDF.PDF.1";

var IDWB = 1000;
var hDlg;
var hWndWB;
var oWB;
var oDoc;


  //Connect to COM events - variables
  var lppUnknown=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
  var lpUnknown;
  var oWebBrowser=0;


var hAtlLib = oSys.Call("Kernel32::LoadLibraryW", "Atl.dll");
oSys.Call("Atl::AtlAxWinInit");

AkelPad.WindowRegisterClass(sClass);

AkelPad.CreateDialog(0, sClass, sTitle, 0x90C80040 /*WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_SETFONT*/, 200, 100, 500, 300, hMainWnd, DlgCallback, 0x3 /*CDF_PIXELS|CDF_MODAL*/, 0, 0, "", 0, 0, "|",
                     0, sWBClass, sWBTitle, 0x50300000 /*WS_VISIBLE|WS_CHILD|WS_HSCROLL|WS_VSCROLL*/, 0, 0, 500, 300, IDWB, 0);

AkelPad.WindowUnregisterClass(sClass);
oSys.Call("Kernel32::FreeLibrary", hAtlLib);

function DlgCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    hDlg   = hWnd;
    hWndWB = oSys.Call("User32::GetDlgItem", hDlg, IDWB);

    //Connect to COM events - init
    if (!oSys.Call("Atl::AtlAxGetControl", hWndWB, lppUnknown))
    {
      lpUnknown=AkelPad.MemRead(lppUnknown, 2 /*DT_QWORD*/);
      oWebBrowser=AkelPad.VarDispatch(lpUnknown);
      WScript.ConnectObject(oWebBrowser, "IE_", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" /*DIID_DWebBrowserEvents2*/);
      oWebBrowser.Navigate("http://akelpad.sourceforge.net/");
    }

    //oWB = ... //how to get ActiveX object, WebBrowser object (use AtlAxGetControl()) ???
    //oWB.Navigate("http://akelpad.sourceforge.net");
    //oDoc = oWB.Document;
  }

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    if ((wParam & 0xFFFF) == 2 /*IDCANCEL*/)
    {
      //Connect to COM events - release
      {
        WScript.DisconnectObject(oWebBrowser);
      }
      oSys.Call("user32::EndDialog", hDlg, 0);
    }
  }

  return 0;
}

//Connect to COM events - sink
function IE_DocumentComplete(pDisp, URL)
{
  WScript.Echo(URL);
}

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Добавлено: метод WScript.ConnectObject - подсоединиться к событиям объекта.
Добавлено: метод WScript.DisconnectObject - отсоединиться от событий объекта.
Добавлено: метод AkelPad.VarDispatch - получить IDispatch объект по указателю.

Added: WScript.ConnectObject method - connects to the object's events.
Added: WScript.DisconnectObject method - disconnects from the object's events.
Added: AkelPad.VarDispatch method - get IDispatch object of a pointer.


Scripts plugin v17.8

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Instructor
Now in Scripts I could write new internet browser - AkelBrowser. :D
Big thanks.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »


KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Instructor
WScript.ConnectObject(oWB, "IE_", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" /*DIID_DWebBrowserEvents2*/) does not work as ActiveX (runtime error: 800A01C2).
WScript.ScriptBaseName returns undefined value.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

According to MSDN WScript.ScriptBaseName is property of WScript object, so it must not work in any other environment other than AP Scripts.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

FeyFre
Probably you mix it with WScript.ScriptFullName. WScript.ScriptBaseName not standard property that's why it is documented in Scripts-Rus.txt/Scripts-Eng.txt.

KDJ
In Scripts 17.9 you can address to AkelPad's WScript via AkelPad.WScript.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Добавлено: возможность получить WScript объект AkelPad'а через AkelPad.WScript, когда скрипт запущен как ActiveX.

Added: possibility to get AkelPad's WScript object when script running as ActiveX via AkelPad.WScript.


Scripts plugin v17.9

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Instructor
As ActiveX still something wrong it works.

Code: Select all

AkelPad.WScript.ScriptBaseName //-> "" (empty string)
AkelPad.WScript.ScriptFullName //-> "" (empty string)
AkelPad.WScript.ScriptName     //-> "" (empty string)
AkelPad.WScript.FullName       //-> "\.dll"
AkelPad.WScript.Quit()         //WScript.exe hangs
AkelPad.WScript.ConnectObject(oWB, "WB_", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" /*DIID_DWebBrowserEvents2*/) //WScript.exe hangs

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Instructor
Почему-то такой код в скрипте не группирует действия в одно:

Code: Select all

AkelPad.SendMessage(hWndEdit, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
AkelPad.SetSel(0, 15);
AkelPad.ReplaceSel("x");
AkelPad.ReplaceSel("y");
AkelPad.ReplaceSel("z");
AkelPad.SendMessage(hWndEdit, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);
После отработки скрипта выделение не снимается, сколько ctrl + z не нажимай, как будто SetSel сам по себе. Фича, баг?

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

Instructor
Всё таки я решился озвучить одну идею (хотелку), прошу строго не судить.
Поскольку уже появились

PDFtk-G.js
RunCommand.js
WindowsList.js
FindReplaceFiles.js ещё мог бы таким стать.

и плагин всё больше предоставляет для этого средства, то, пмсм, не хватает портабельности Scripts.dll (имеется в виду возможность регистрировать плагин в системе временно и/или с недостаточными правами пользователя). Для пользователей Total Commander (а таких, думаю, немало), хорошим решением могло бы стать добавление в Scripts.dll функционала wdx-плагина для TC (там, если я правильно понял, речь

ContentGetSupportedField
ContentGetValue
Справка для писателей wdx здесь. Страница её здесь.

): TC такие "wdx" может загружать при старте (и при любых правах) и их функции становятся доступны всем дочерним процессам TC. Примеры реализации:

Цитата из ReadMe.txt:
4. Загрузка при запуске ТК

Есть минимум 2 способа загрузки модуля при запуске ТК. Первый способ заключается в регистрации TCFS2Tools.dll в качестве WDX-модуля ТК с последующим определением специального шаблона цвета для типов файлов (Конфигурация, Цвета, для типов файлов, Добавить, Шаблон, вкладка Плагины, "TCFSTools.Autorun > 0", сохранить с любым именем, выбрать любой цвет, применить все изменения), заставляющего ТК загружать модуль автоматически.

Вы также можете использовать контентный модуль автозапуска Autorun.wdx, тогда достаточно прописать в его Autorun.cfg следующую строку:

LoadLibrary "X:\Path\To\TCFS2Tools.dll"
Обсуждение здесь.
и

Обсуждение здесь.
.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

KDJ wrote:As ActiveX still something wrong it works.
See Scripts 18.0.
Cuprum wrote:Почему-то такой код в скрипте не группирует действия в одно...
Группируются только изменения текста.
yozhic wrote:(имеется в виду возможность регистрировать плагин в системе временно и/или с недостаточными правами пользователя)

Code: Select all

reg QUERY "HKLM\SOFTWARE\Classes\CLSID\{DB045777-BAFF-416B-AA8E-A154E6A64A88}\ProgID" /ve
set ActiveXError=%ERRORLEVEL%
if %ActiveXError% == 1 regsvr32 /s Scripts.dll
wscript "Scripts\Translator.js"
if %ActiveXError% == 1 regsvr32 /u /s Scripts.dll
Для пользователей Total Commander (а таких, думаю, немало), хорошим решением могло бы стать добавление в Scripts.dll функционала wdx-плагина для TC ...
От меня ускользает практическая польза от этого.
Post Reply