PluginsControl

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 12537
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 238 times

PluginsControl

Post by John Doe » Thu 05 Mar, 2015 09:45

Имеет ли право плагин загрузить для своих целей dll другого плагина не используя PluginsControl?
Цель: избежать загрузки плагина, и связанных с этим накладных расходов.

Запрета на это действие в Энциклопедии нет, но в результате можно получить падение.

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

PluginsControl

Post by zg » Thu 05 Mar, 2015 09:57

John Doe wrote:Запрета на это действие в Энциклопедии нет, но в результате можно получить падение.
пруф?

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

PluginsControl

Post by John Doe » Thu 05 Mar, 2015 10:03

Code: Select all

local ffi = require"ffi"
ffi.cdef[[
//https://msdn.microsoft.com/library/ms684175
HMODULE LoadLibraryW(LPCTSTR lpFileName);
//https://msdn.microsoft.com/library/ms683152
BOOL FreeLibrary(HMODULE hModule);
]]
local C = ffi.C

local plugin = far.GetPlugins()[2]
local name = far.GetPluginInformation(plugin).ModuleName
far.Show(name)

local nameW = win.Utf8ToUtf16(name.."\0")
local hmod = C.LoadLibraryW(ffi.cast("void*",nameW))
far.ForcedLoadPlugin("PLT_PATH",name)
C.FreeLibrary(hmod)
far.GetPluginInformation(plugin)
Как я понимаю фар слишком умный и если длл уже загружена, то не использует LoadLibrary (а значит не инкрементируется счётчик загрузок).

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

PluginsControl

Post by zg » Thu 05 Mar, 2015 10:09

как ваш код связан с вашим вопросом? вы тупо выгружаете плагин, загруженный фаром. так делать естественно нельзя.

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

PluginsControl

Post by John Doe » Thu 05 Mar, 2015 10:12

zg wrote: вы тупо выгружаете плагин, загруженный фаром
Я выгружаю dll загруженную мной, а не фаром.
Всё это можно повторить и без явного вызова ForcedLoadPlugin.

Если бы фар при загрузке использовал LoadLibrary, то мой вызов FreeLibrary не выгрузил бы dll, а только уменьшил счётчик.

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

PluginsControl

Post by zg » Thu 05 Mar, 2015 10:16

John Doe wrote:Всё это можно повторить и без явного вызова ForcedLoadPlugin.
код? и почему вы приводите более сложный код для воспроизведения проблемы, если есть более простой вариант?

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

PluginsControl

Post by John Doe » Thu 05 Mar, 2015 10:28

Вместо ForcedLoadPlugin можно вызвать плагин из меню, или посредством Plugin.Call
Вот код (и он не проще):

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

PluginsControl

Post by John Doe » Thu 05 Mar, 2015 10:40

P.S.
Разумеется, что код искусственный, в реальности загрузка плагина фаром производится за пределами моего кода (пример).
В этом случае для воспроизведения падения достаточно чтобы в моём коде Load и Free были разнесены по времени:

Code: Select all

local ffi = require"ffi"
ffi.cdef[[
//https://msdn.microsoft.com/library/ms683152
BOOL FreeLibrary(HMODULE hModule);
//https://msdn.microsoft.com/library/ms684175
HMODULE LoadLibraryW(LPCTSTR lpFileName);
]]
local C = ffi.C
local hmod

Macro {
  area="Common"; key="CtrlF1";
  action=function()
    local plugin = far.GetPlugins()[2]
    local name = far.GetPluginInformation(plugin).ModuleName
    far.Show(name)
    local nameW = win.Utf8ToUtf16(name.."\0")
    hmod = C.LoadLibraryW(ffi.cast("void*",nameW))
  end;
}

Macro {
  area="Common"; key="CtrlF2";
  action=function()
    if hmod~=nil then C.FreeLibrary(hmod) end
  end;
}
  1. CtrlF1 (загружаем dll).
  2. F11, и вызываем плагин из меню.
  3. CtrlF2 (выгружаем dll)
  4. F11 - плагин падает

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

PluginsControl

Post by zg » Thu 05 Mar, 2015 11:05

4290.

Post Reply

Return to “Разработка плагинов”