Имеет ли право плагин загрузить для своих целей dll другого плагина не используя PluginsControl?
Цель: избежать загрузки плагина, и связанных с этим накладных расходов.
Запрета на это действие в Энциклопедии нет, но в результате можно получить падение.
PluginsControl
- zg
- zero-gravity
- Posts: 6015
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
PluginsControl
пруф?John Doe wrote:Запрета на это действие в Энциклопедии нет, но в результате можно получить падение.
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
PluginsControl
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)
- zg
- zero-gravity
- Posts: 6015
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
PluginsControl
как ваш код связан с вашим вопросом? вы тупо выгружаете плагин, загруженный фаром. так делать естественно нельзя.
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
PluginsControl
Я выгружаю dll загруженную мной, а не фаром.
Всё это можно повторить и без явного вызова ForcedLoadPlugin.
Если бы фар при загрузке использовал LoadLibrary, то мой вызов FreeLibrary не выгрузил бы dll, а только уменьшил счётчик.
- zg
- zero-gravity
- Posts: 6015
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
PluginsControl
код? и почему вы приводите более сложный код для воспроизведения проблемы, если есть более простой вариант?John Doe wrote:Всё это можно повторить и без явного вызова ForcedLoadPlugin.
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
PluginsControl
Вместо ForcedLoadPlugin можно вызвать плагин из меню, или посредством Plugin.Call
Вот код (и он не проще):
Вот код (и он не проще):
- John Doe
- Бюрократ
- Posts: 13801
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 72 times
- Been thanked: 425 times
- Contact:
PluginsControl
P.S.
Разумеется, что код искусственный, в реальности загрузка плагина фаром производится за пределами моего кода (пример).
В этом случае для воспроизведения падения достаточно чтобы в моём коде Load и Free были разнесены по времени:
Разумеется, что код искусственный, в реальности загрузка плагина фаром производится за пределами моего кода (пример).
В этом случае для воспроизведения падения достаточно чтобы в моём коде 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;
}
- CtrlF1 (загружаем dll).
- F11, и вызываем плагин из меню.
- CtrlF2 (выгружаем dll)
- F11 - плагин падает