Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
IgorZ
Posts: 647
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 11 times
Been thanked: 48 times

Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by IgorZ » Fri 03 Oct, 2014 08:41

Собственно, хотелось бы получать список плагинов, заменяющих файловую панель Far на свою. Может, как-то можно получить список экспортируемых функций плагина, и сориентироваться по ним? Что-то я не нашёл в документации ничего подходящего, но вдруг не там смотрел?

User avatar
John Doe
Бюрократ
Posts: 12538
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 240 times

Re: Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by John Doe » Fri 03 Oct, 2014 09:07

Через апи не предусмотрено.

User avatar
zg
zero-gravity
Posts: 5668
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 116 times
Contact:

Re: Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by zg » Fri 03 Oct, 2014 09:37

а разве такая информация есть в принципе?

Shmuel
Posts: 5932
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 24 times
Been thanked: 239 times

Re: Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by Shmuel » Fri 03 Oct, 2014 09:40

Список плагинов можно получить через Far API, список экспортируемых любым из них Far API функций через FFI.

IgorZ
Posts: 647
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 11 times
Been thanked: 48 times

Re: Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by IgorZ » Fri 03 Oct, 2014 13:15

Всем спасибо.
Shmuel wrote:список экспортируемых любым из них Far API функций через FFI.
А можно поподробнее? С FFI не работал раньше.

Shmuel
Posts: 5932
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 24 times
Been thanked: 239 times

Re: Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by Shmuel » Fri 03 Oct, 2014 13:26

Нужны функции LoadLibrary, GetProcAddress, FreeLibrary.
Как пользоваться FFI описано в документации LuaJIT, и есть ряд примеров на форуме.

User avatar
John Doe
Бюрократ
Posts: 12538
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 240 times

Можно ли из макроса определить, работает ли конкретный плагин с панелью?

Post by John Doe » Fri 03 Oct, 2014 15:36

Вот тут советуют LoadLibraryEx+DONT_RESOLVE_DLL_REFERENCES или SymEnumerateSymbols.

Edit
Shmuel wrote: Нужны функции LoadLibrary, GetProcAddress, FreeLibrary.

Code: Select all

local F = far.Flags
local ffi = require"ffi"
ffi.cdef[[
//https://msdn.microsoft.com/library/ms683152
BOOL FreeLibrary(HMODULE hModule);
//https://msdn.microsoft.com/library/ms684179
HMODULE LoadLibraryExW(
  LPCTSTR lpFileName,
  HANDLE hFile,
  DWORD dwFlags
);
//https://msdn.microsoft.com/library/ms683212
int GetProcAddress(HMODULE hModule,LPCSTR lpProcName);
]]
local C = ffi.C
local DONT_RESOLVE_DLL_REFERENCES = 0x00000001

local function isPanelPlugin(Info)
  if band(Info.PInfo.Flags,F.PF_DISABLEPANELS)==0 then
    local ModuleName = win.Utf8ToUtf16(Info.ModuleName.."\0")
    local hmod = C.LoadLibraryExW(ffi.cast("void*",ModuleName),nil,DONT_RESOLVE_DLL_REFERENCES)
    if hmod~=nil then
      local ProcAddress = C.GetProcAddress(hmod,"ProcessPanelInputW")
      C.FreeLibrary(hmod)
      return ProcAddress~=0
    end
  end
end
Использовать так:

P.S.
Вот тут автор использовал для загрузки функцию ffi.load, но обнаружилось, что это чревато: http://forum.farmanager.com/viewtopic.p ... 58#p128458

Post Reply

Return to “Нужна помощь”