Удалённые Рабочие Столы и Локальные диски.

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
Post Reply
User avatar
cmd.exe
Posts: 340
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 173 times
Been thanked: 5 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by cmd.exe » Fri 04 Mar, 2016 11:16

Давно встретился с тем,что Фар не умеет работать с Локальными дисками при работе через RDP.
Если есть какие-то идеи у сообщество буду рад услушить. Про \\tsclient\... знаем, но хотим что-бы из коробки.
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by DrKnS » Fri 04 Mar, 2016 12:53

\\tsclient и есть изкоробки, изкоробочнее не бывает.

User avatar
cmd.exe
Posts: 340
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 173 times
Been thanked: 5 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by cmd.exe » Fri 04 Mar, 2016 13:35

DrKnS wrote:\\tsclient и есть изкоробки, изкоробочнее не бывает.
Имеется ввиду по Alt+F1 и Alt+F2
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates

User avatar
Freeman
Posts: 28
Joined: Thu 20 Nov, 2014 20:10
Location: Санкт-Петербург
Has thanked: 5 times
Been thanked: 1 time
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by Freeman » Thu 16 Jun, 2016 02:58

Таки да, было бы удобно видеть их как в Проводнике.
Разработчик языка программирования Кантор

Smitis
Posts: 1492
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 14 times
Been thanked: 24 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by Smitis » Wed 22 Jun, 2016 22:31

Добавление пункта выбора \\tsclient-дисков в меню выбора дисков
  1. local TsClientId = "4B787BF1-4846-4FC9-9D63-A1D5E2D60FF8"
  2. local F = far.Flags
  3. MenuItem {
  4.     description = "TSCLIENT";
  5.     menu = "Disks";
  6.     guid = TsClientId;
  7.     text = "TSCLIENT";
  8.     action = function(openfrom,item)
  9.         local h = io.popen(win.GetEnv("SystemRoot").."\\system32\\net.exe use")
  10.         local s = h:read()
  11.         local tsdisks = {}
  12.         while s do
  13.             s = win.OemToUtf8(s):match("\\\\TSCLIENT\\%S+")
  14.             if s then
  15.                 tsdisks[#tsdisks+1] = {disk=s,text=s:gsub("(\\\\TSCLIENT\\)(.)","%1&%2")}
  16.             end
  17.             s = h:read()
  18.         end
  19.         h:close()
  20.         if #tsdisks > 0 then
  21.             local res,pos = far.Menu(
  22.                 {
  23.                     X = openfrom==F.OPEN_LEFTDISKMENU and 10 or (APanel.Left and APanel.Width+10 or PPanel.Width+10),
  24.                     Title="TS Disks", Bottom="", Id=win.Uuid(TsClientId),
  25.                     MaxHeight=Far.Height-10,
  26.                 },
  27.                 tsdisks
  28.             )
  29.             if pos then
  30.                 local ap = (openfrom==F.OPEN_LEFTDISKMENU and APanel.Left or openfrom==F.OPEN_RIGHTDISKMENU and not APanel.Left) and 1 or 0
  31.                 panel.SetPanelDirectory(nil,ap,tsdisks[pos].disk)
  32.             end
  33.         end
  34.     end;
  35. }
Разум когда-нибудь победит.

Smitis
Posts: 1492
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 14 times
Been thanked: 24 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by Smitis » Sat 25 Jun, 2016 16:13

Задался вопросом, а как получить список дисков не через net use. Весь поиск приводит к WNetOpenEnum, WNetEnumResource
Но вот такое приводит к ошибке 487 "Попытка обращения к неверному адресу".
  1. local function ShowErr(err)
  2.     if err==0 then return "" end
  3.     far.Message( tostring(err), "ERROR", nil, "we" )
  4. end
  5.  
  6. local ffi = require "ffi"
  7. local C = ffi.C
  8. local function safe_cdef(def) pcall(ffi.cdef,def) end
  9. local mpr = ffi.load("mpr.dll")
  10.  
  11. -- winnetwk.h
  12. local RESOURCE_CONNECTED = 0x00000001
  13. local RESOURCE_GLOBALNET = 0x00000002
  14. local RESOURCETYPE_ANY = 0
  15. local RESOURCETYPE_DISK = 0x00000001
  16. local ERROR_NO_MORE_ITEMS = 259
  17. local RESOURCEUSAGE_CONNECTABLE = 0x00000001
  18. local RESOURCEUSAGE_CONTAINER = 0x00000002
  19. local RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004
  20. local TSCLIENT = "\\\\TSCLIENT\0"
  21.  
  22. safe_cdef [=[
  23.     typedef struct _NETRESOURCE {
  24.         DWORD  dwScope;
  25.         DWORD  dwType;
  26.         DWORD  dwDisplayType;
  27.         DWORD  dwUsage;
  28.         LPTSTR lpLocalName;
  29.         LPTSTR lpRemoteName;
  30.         LPTSTR lpComment;
  31.         LPTSTR lpProvider;
  32.     } NETRESOURCE, *LPNETRESOURCE;
  33. ]=]
  34. ffi.cdef [=[
  35.     DWORD WNetOpenEnumW( // https://msdn.microsoft.com/en-us/library/windows/desktop/aa385478.aspx
  36.         DWORD         dwScope,       // _In_
  37.         DWORD         dwType,        // _In_
  38.         DWORD         dwUsage,       // _In_
  39.         LPNETRESOURCE lpNetResource, // _In_
  40.         LPHANDLE      lphEnum        // _Out_
  41.     );
  42.     DWORD WNetEnumResource( // https://msdn.microsoft.com/en-us/library/windows/desktop/aa385449.aspx
  43.         HANDLE  hEnum,       // _In_
  44.         LPDWORD lpcCount,    // _Inout_
  45.         LPVOID  lpBuffer,    // _Out_
  46.         LPDWORD lpBufferSize // _Inout_
  47.     );
  48.     DWORD WNetCloseEnum( HANDLE hEnum );
  49. ]=]
  50.  
  51. local NetResource = ffi.new("NETRESOURCE")
  52. local lpNetResource = ffi.cast("void*",NetResource)
  53.  
  54. local hEnum = ffi.new("HANDLE")
  55. local lphEnum = ffi.cast("void*",hEnum)
  56. --ShowErr( mpr.WNetOpenEnumW(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,lpNetResource,lphEnum) )
  57. ShowErr( mpr.WNetOpenEnumW(RESOURCE_CONNECTED,RESOURCETYPE_DISK,0,ffi.NULL,lphEnum) )
  58.  
  59. -- тут мы будем вызывать WNetEnumResourceW
  60.  
  61. mpr.WNetCloseEnum(hEnum)
В чём может быть затык?
Разум когда-нибудь победит.

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by DrKnS » Sat 25 Jun, 2016 17:29

local lphEnum = ffi.cast("void*",hEnum) - это каст (причём бесполезный), а не получение адреса.

Должно быть что-то типа:

Code: Select all

local hEnum = ffi.new("HANDLE[1]")
mpr.WNetOpenEnumW(RESOURCE_CONNECTED, RESOURCETYPE_DISK, 0, ffi.NULL, hEnum)
// use hEnum[0]

Post Reply

Return to “Предложения и идеи”