Вопросы по использованию FFI

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

Re: Вопросы по использованию FFI

Post by gotar » Tue 06 May, 2014 10:16

Latest post of the previous page:

Помогите найти ошибку:
  1. local ffi = require("ffi")
  2.  
  3. ffi.load("kernel32")
  4.  
  5. ffi.cdef[[
  6.  
  7. DWORD  GetFullPathName(
  8.  
  9.     LPCTSTR lpFileName,
  10.  
  11.     DWORD nBufferLength,
  12.  
  13.     LPTSTR lpBuffer,
  14.  
  15.     LPTSTR *lpFilePart
  16.  
  17. );
  18.  
  19. ]]
  20.  
  21. local buf = ffi.new("char[4096]")
  22.  
  23. ffi.C.GetFullPathName(".", 4096,buf,0)
  24.  
  25. far.Show(ffi.string(buf))
Выдает:
12: cannot resolve symbol 'GetFullPathName': The specified
procedure could not be found.♪
Описание http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Last edited by HaRT on Tue 06 May, 2014 11:02, edited 1 time in total.
Reason: [codebox=lua file=untitled.lua]

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

Re: Вопросы по использованию FFI

Post by zg » Tue 06 May, 2014 10:30

gotar wrote:Выдает:
12: cannot resolve symbol 'GetFullPathName': The specified
procedure could not be found.♪
посмотрите внимательно на то, что экспортирует kernel32.dll. там нет GetFullPathName.

User avatar
DrKnS
Posts: 4530
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Re: Вопросы по использованию FFI

Post by DrKnS » Tue 06 May, 2014 11:12

Ошибка, прежде всего, в том, что использовать GetFullPathName(".") и другие функции из kernel32 для получения "текущего каталога" в контексте Far нельзя.

gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

Re: Вопросы по использованию FFI

Post by gotar » Tue 06 May, 2014 11:32

Если я открываю файл из lua( плагина и т.п) и в имени файла нет полного пути, в каком каталоге он будет искаться?

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

Re: Вопросы по использованию FFI

Post by John Doe » Tue 06 May, 2014 11:35

gotar wrote:Помогите найти ошибку:[...]
Если почитать статью MSDN внимательнее, и заметите что есть 2 разных функции:GetFullPathNameA и GetFullPathNameW

Ну и грузить Kernel32 нет нужды, она по умолчанию загружена.
А если уж грузите, то обращаться к её функциям следует иначе:

Code: Select all

local kernel32 = ffi.load("kernel32")
...
kernel32.GetFullPathNameW(".", 4096,buf,0)
P.S.
Как правильно сформировать буфер - обсуждалось в теме, начиная с первой страницы.

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

Вопросы по использованию FFI

Post by John Doe » Tue 06 May, 2014 11:45

gotar wrote:Если я открываю файл из lua( плагина и т.п) и в имени файла нет полного пути, в каком каталоге он будет искаться?
А погуглить?
http://msdn.microsoft.com/library/aa364934

P.S.
Вообще ffi это (по определению) сложно для неподготовленного пользователя.
Проще будет воспользоваться какой-нибудь lua-библиотекой, например lfs или ex.
Можно исхитриться и без внешних библиотек, обрабатывая вывод команд, запущенных по io.popen.

User avatar
DrKnS
Posts: 4530
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Re: Вопросы по использованию FFI

Post by DrKnS » Tue 06 May, 2014 12:54

gotar wrote:Если я открываю файл из lua( плагина и т.п) и в имени файла нет полного пути, в каком каталоге он будет искаться?
В текущем каталоге процесса, как вам уже ответили.
Но особенность в том, что он совершенно не обязательно совпадает с тем, что на панели и может указывать куда попало.
http://api.farmanager.com/ru/fsf/getcur ... ctory.html

Shmuel
Posts: 5038
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 132 times

Re: Вопросы по использованию FFI

Post by Shmuel » Tue 06 May, 2014 13:04

Если всё, что нужно узнать, это текущая папка, то можно обойтись без FFI. В зависимости от того, что вам надо, можно выбрать одну из 2-х ф-ций луафара:
1. far.GetCurrentDirectory
2. panel.GetPanelDirectory

gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

Re: Вопросы по использованию FFI

Post by gotar » Sun 11 May, 2014 22:32

А когда far.GetCurrentDirectory() отличается от panel.GetPanelDirectory(nil,1).Name для файловых панелей ?

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

Re: Вопросы по использованию FFI

Post by John Doe » Mon 12 May, 2014 09:21

В данной теме это оффтопик, не говоря уже о том, что быстрее проверить а не спрашивать.

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

Re: Вопросы по использованию FFI

Post by John Doe » Wed 18 Jun, 2014 09:28

TOKEN_PRIVILEGES structure wrote:
  1. typedef struct _TOKEN_PRIVILEGES {
  2.  
  3.   DWORD               PrivilegeCount;
  4.  
  5.   LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
  6.  
  7. } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
[...]

Important The constant ANYSIZE_ARRAY is defined as 1 in the public header Winnt.h. To create this array with more than one element, you must allocate sufficient memory for the structure to take into account additional elements.
Как лучше в ffi обработать эту ситуацию с ANYSIZE_ARRAY?
  • Если следовать буквально, то как я понимаю надо вычислить размер структуры с учётом реального размера массива, выделить под неё память, и привести к нужному типу:
    1. local size = n*ffi.sizeof("LUID_AND_ATTRIBUTES") + ffi.sizeof("DWORD")
    2.  
    3. local struct = ffi.new("char[?]",size)
    4.  
    5. struct = ffi.cast("TOKEN_PRIVILEGES *",struct)
  • С другой стороны, в ffi есть ведь специальные средства.
    1. ffi.cdef[[
    2.  
    3. typedef struct _TOKEN_PRIVILEGES {
    4.  
    5.   DWORD               PrivilegeCount;
    6.  
    7.   LUID_AND_ATTRIBUTES Privileges[?];
    8.  
    9. } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
    10.  
    11. ]]
    12.  
    13.  
    14.  
    15. local struct = ffi.new("TOKEN_PRIVILEGES",n)
Работают оба способа, но второй проще, и выглядит логичней.
Я ничего не упускаю?

2useven10
Posts: 2949
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 77 times

Re: Вопросы по использованию FFI

Post by 2useven10 » Wed 18 Jun, 2014 11:08

ffi.sizeof("TOKEN_PRIVILEGES") неизвестен, если конечно нет варианта ffi.sizeof("TOKEN_PRIVILEGES", n)

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

Re: Вопросы по использованию FFI

Post by John Doe » Wed 18 Jun, 2014 11:10

В первом случае размер известен (ANYSIZE_ARRAY==1)
Во втором ffi.sizeof не используется Да и вообще, ffi.sizeof("TOKEN_PRIVILEGES") не используется ни в одном из премеров выше

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

Re: Вопросы по использованию FFI

Post by zg » Wed 18 Jun, 2014 11:23

ffi.sizeof(struct)

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

Re: Вопросы по использованию FFI

Post by John Doe » Wed 18 Jun, 2014 11:49

Code: Select all

local struct = ffi.new("char[?]",size)
struct = ffi.cast("TOKEN_PRIVILEGES *",struct)
А тут похоже ошибка, выделенный ffi.new буфер может быть собран сборщиком мусора...

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

Re: Вопросы по использованию FFI

Post by John Doe » Thu 19 Jun, 2014 08:36

John Doe wrote:Как лучше в ffi обработать эту ситуацию с ANYSIZE_ARRAY?
Я не просто так предлагаю это обсудить.
Невозможно переопределить уже объявленный тип, ffi не даёт.
Если будет 2 скрипта с разными определениями, то один из них поломается.

Было бы неплохо договориться о совместимом способе.
Предлагаю в качестве ANYSIZE_ARRAY всегда использовать ?.

2useven10
Posts: 2949
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 77 times

Re: Вопросы по использованию FFI

Post by 2useven10 » Thu 19 Jun, 2014 08:54

При необходимости ничто не мешает изменить имя типа, не очень красиво, но сработает.
А так вариант "Type[?]" мне тоже кажется более логичным.

Post Reply

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

Who is online

Users browsing this forum: No registered users and 1 guest