использование WinAPI(kernel32.dll) для работы с файлами,pipe

Работа с файлами и базами данных

использование WinAPI(kernel32.dll) для работы с файлами,pipe

Postby lexa86 on 23 Mar 2012, 07:47

Проблема с использованием инструментария Windows API для работы с файлами.
Изначально стояла задача использовать механизм PIPE (Именованный канал, труба - по сути файл с путем \\.\pipe\<имя_канала>) для быстрого межзадачного обмена в LabView,
так как стандартные кубики LabView по работе с файлами не умеют работать с путями типа "\\.\pipe\<имя_канала>" было решено использовать WinAPI, а точнее библиотеку kernel32.dll, для работы с такими файлами (вообще с именованными каналами работают простые функции типа CreateFile, WriteFile, ReadFile, CloseHandle а так же спец.функции типа CreateNamedPipe и т.д.).
Но работа встала на этапе попыток использования WinAPI для ПРОСТЫХ файлов (d:\123.txt), файл создается (createfile), но в него ничего не могу записать(writefile)/считать(readfile) - ошибка 1097 использования dll.
Описание использования CreateFile:
MSDN_createfile
Описание CreateFile на русском
MSDN_writefile
Описание WriteFile на русском
подробные настройки входов/выходов dll смотрите в probe2.vi
думаю, что ошибка в настройке входов у writefile - lpbuffer, по описанию функции имеет тип LPCVOID (Указатель на буфер, содержащий данные, которые будут записаны в файл.)
я настроил как array, u8, 1, array data pointer также перепробовал всевозможные варианты настройки этого и других параметров.
Основной вопрос в использовании функции WriteFile библиотеки kernel32.dll инструментария Windows API, кто пользовался, кто сталкивался?
Attachments
bd.JPG
блок-диаграмма
fp.JPG
лицевая
kernel32.JPG
исп-е kernel32.dll
kernel32_write1.JPG
настройка вх/вых параметров
probe2.vi
PROBE2.VI
(12.17 KiB) Downloaded 152 times
lexa86
interested
interested
 
Posts: 3
Joined: 22 Mar 2012, 13:30
LabVIEW Version: 2011
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby lexa86 on 23 Mar 2012, 07:49

Дополнение: версия LabView 8.6.1f1, такая же проблема и на LabView 2011
lexa86
interested
interested
 
Posts: 3
Joined: 22 Mar 2012, 13:30
LabVIEW Version: 2011
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby mzu2006 on 01 Apr 2012, 04:17

Читайте внимательно описание функции WriteFile. Вы забыли 2 параметра. Вот так работает:
Attachments
probe2_corrected.vi
(15.05 KiB) Downloaded 182 times
User avatar
mzu2006
doctor
doctor
 
Posts: 2456
Joined: 16 Aug 2008, 02:12
Location: St-Petersburg (RU), Phila, Boston, Washington DC
Medals: 3
Professionalism (1) Tutorials (1) Black (1)
LabVIEW Version: 7.1 10 11 12
Karma: 279
CLAD CLD I/O PDA VIP vision bloggers teachers

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby Chupakabra on 02 Apr 2012, 05:57

для быстрого межзадачного обмена в LabView


И что, будет работать быстрее чем существующие механизмы обмена?
User avatar
Chupakabra
professional
professional
 
Posts: 332
Joined: 21 Jan 2009, 10:50
Location: Москва
Medals: 1
Tutorials (1)
LabVIEW Version: 2012
Karma: 86
VIP bloggers

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby mzu2006 on 02 Apr 2012, 08:51

В моей практике win32 pipes самый низколатентный спсоб обмена информацией между :labview: и .net приложениями
User avatar
mzu2006
doctor
doctor
 
Posts: 2456
Joined: 16 Aug 2008, 02:12
Location: St-Petersburg (RU), Phila, Boston, Washington DC
Medals: 3
Professionalism (1) Tutorials (1) Black (1)
LabVIEW Version: 7.1 10 11 12
Karma: 279
CLAD CLD I/O PDA VIP vision bloggers teachers

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby lexa86 on 09 Apr 2012, 06:43

mzu2006 wrote:Читайте внимательно описание функции WriteFile. Вы забыли 2 параметра. Вот так работает:

Спасибо, помогло! только с pipe всё тоже самое не работает (путем замены пути на \\.\pipe\name) - ошибок нет, но и не пишет в канал..
для межзадачного обмена пока пользуюсь файлами на RAM диске, работает с циклом 1 мс. Стандартные механизмы типа shared variable более тормозные, а других и не знаю
(при условии, что нужен доступ не только из Labview-программ)
lexa86
interested
interested
 
Posts: 3
Joined: 22 Mar 2012, 13:30
LabVIEW Version: 2011
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby mzu2006 on 10 Apr 2012, 21:50

Проверьте handle на равенство INVALID_HANDLE + Соответствующий GetLastError. Кроме того, а pipe предварительно создана через CreateNamedPipe?
User avatar
mzu2006
doctor
doctor
 
Posts: 2456
Joined: 16 Aug 2008, 02:12
Location: St-Petersburg (RU), Phila, Boston, Washington DC
Medals: 3
Professionalism (1) Tutorials (1) Black (1)
LabVIEW Version: 7.1 10 11 12
Karma: 279
CLAD CLD I/O PDA VIP vision bloggers teachers

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby Igor_G on 02 Mar 2016, 23:09

Доброго времени суток,

kernel32.dll не работает больше на win 10-64bit с LabVIEW-2015 32/64bit. Тот же код работает на др. машине с win 8.1-64bit с LabVIEW-2015 32/64bit.

Сталкивался уже кто нибудь с этой проблемой? Есть у кого идеи решения?

Большая просьба попробовать на др. версиях LabVIEW под win 10-64bit.

SubVI сохранил для LabVIEW 11.
Attachments
Create_SetPoint_Read_Close_kernel32dll.vi
(9.1 KiB) Downloaded 103 times
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby ladik on 03 Mar 2016, 06:09

Всё работает. Только пути в CLFN поменял.
Attachments
Безымянный.png
FrontPanel
Дорогу осилит идущий.
User avatar
ladik
advanced
advanced
 
Posts: 195
Joined: 18 Nov 2014, 11:45
Location: Астана
Medals: 1
Silver (1)
LabVIEW Version: 2011, 2015
Karma: 69
hardware I/O VIP

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby dadreamer on 03 Mar 2016, 10:32

Igor_G,
dadreamer wrote:если используются стандартые системные библиотеки (kernel32, user32 и т.д.), то в CLFN нужно указывать не путь к ним, а только имя! Это обеспечит совместимость с любой версией ОС, где будет использоваться программа.
Attachments
2016-03-03_12-29-40.jpg
User avatar
dadreamer
professor
professor
 
Posts: 3149
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 800
I/O VIP vision internet

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby Igor_G on 03 Mar 2016, 18:59

Спасибо за тест и советы,
с путём к dll был мой эксперимент. Извиняюсь что в этом виде отправил VI.

Похоже что проблема заключается все таки в другом.

Права доступа к файлу под Win 10 на др. рartition. (см. screenshot).
Folder read-only.PNG

Read-only на папку поставил Win10 Pro сам (возможно как default).
Первый вопрос: Какая разница? Это должно быть по идее все равно, или нет? Я ведь только читать файл хочу. Права на чтение имеют все, даже стандартный пользователь...

Хотелось бы сразу исключить дискуссии на тему кто виноват. Важно, что если это случилось у меня, то может случиться и у клиентов.
- Я работаю как администратор (см. screenshot права доступа) и несмотря на это LabVIEW-2015 через kernel32 не могла ПРОЧИТАТь файл!?
2.png
1.PNG

- Точнее говоря, dll отрабатывают, как будто нормально (не выдавая ни какой ошибки), но в результате выдаёт фальшивый результат! Как такую ошибку у клиентов найти?

"Решение проблемы" - ручками разрешил авторизованному пользователю полный доступ к папке. После этого все заработало нормально.
Второй вопрос: Почему? Система и администратор имеют права полного доступа. Я работаю, как админ.
3.png

Как понятно это на самом деле не решение проблемы. Ждать пока Microsoft или NI решат это проблему тоже не выход. Третий вопрос: Что делать?

(1) Идеальное решение было бы - (а) проверка файла/папки на read-only. (б) снять read-only с файла/папки на время доступа LabVIEW и/или программы написанной на LabVIEW. (в) вернуть установки на файл/папку после завершения доступа или закрытия программы.
(2) - (а) проверка файла/папки на read-only. (б) выдача сообщения пользователю о активном read-only.
P.S.: К сожалению пользователь работает обычно без прав админа. Поэтому он не сможет изменить доступ к файлу/папке. Т.е. будет знать почему не работает и не больше. :о(

Есть идеи?
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby Igor_G on 03 Mar 2016, 21:21

Нашел в нете, что ,то что я только на win-10 встретил было у других и на win-8.1.

Так можно сбросить read-only с помощью "get Permissions" l;о)
schreibschutz.png
schreibschutz.png (16.69 KiB) Viewed 7249 times


Тут источник и объяснение (на нем.).
http://www.labviewforum.de/Thread-Schreibschutz-auf-Datei-aufheben
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby Igor_G on 03 Mar 2016, 22:00

SubVI сохранил для LabVIEW 11.
Attachments
Create_SetPoint_Read_Close_kernel32dll_Read-only_free.vi
(11.15 KiB) Downloaded 99 times
Igor_G
assistant
assistant
 
Posts: 122
Joined: 06 Nov 2011, 14:10
LabVIEW Version: 2012-2015
Karma: 0

Re: использование WinAPI(kernel32.dll) для работы с файлами,

Postby dadreamer on 05 Mar 2016, 13:10

Igor_G wrote:Первый вопрос: Какая разница? Это должно быть по идее все равно, или нет? Я ведь только читать файл хочу. Права на чтение имеют все, даже стандартный пользователь...

Без разницы. Если собираетесь только читать файл, то можете хоть какой атрибут ставить. Если не задано специальных политик для ограничения доступа к файлу, то юзер из-под ограниченной учётки спокойно сможет прочитать файл, хоть где, хоть даже в системном каталоге Windows.
Igor_G wrote:- Я работаю как администратор (см. screenshot права доступа) и несмотря на это LabVIEW-2015 через kernel32 не могла ПРОЧИТАТь файл!?

А вы внимательно посмотрите на свой код и сверьте его с тем, что опубликован в статьях по работе с CreateFile / Read/WriteFile / CloseHandle. Во-первых, вы выставили параметр dwDesiredAccess в GENERIC_ALL (0x10000000L), то есть на чтение и на запись одновременно. А файл у вас только для чтения. После вызова CreateFile как всякая порядочная функция сообщает вам об ошибке INVALID_HANDLE_VALUE (0xFFFFFFFF = -1d). Далее, по-хорошему, нужно было бы проверить результат и при возникновении ошибки выполнить GetLastError и проанализировать ошибку. У вас же хэндл файла без всякого анализа отправляется дальше на прочие функции, даже если он -1. Потому и ReadFile, например, ничего не сможет прочитать по такому хэндлу.
Вот, даже в этом топике mzu2006 написал:
mzu2006 wrote:Проверьте handle на равенство INVALID_HANDLE + Соответствующий GetLastError.

Igor_G wrote:"Решение проблемы" - ручками разрешил авторизованному пользователю полный доступ к папке. После этого все заработало нормально.
Второй вопрос: Почему? Система и администратор имеют права полного доступа. Я работаю, как админ.

Вероятно, что поменялись атрибуты файла, и снялся флажок "только для чтения". Но суть в том, что права юзера сейчас не трогаем, если юзер ограниченный, то читать-то он всё равно может, даже если не является владельцем файла/папки. Системные папки, у которых владелец - система/system, не трогаем также.
Igor_G wrote:Есть идеи?

1) поменять параметр dwDesiredAccess на GENERIC_READ (0x80000000L);
2) сделать хотя бы простейший анализ хэндла, возвращаемого CreateFile (равно или не равно -1);
3) выставьте все параметры-хэндлы как Signed Pointer-Sized Integer, иначе у вас на 64-битном :labview: будет через раз работать или вовсе не будет;
4) все эти функции не обязательно исполнять в UI-потоке, они потокобезопасны.

Кроме того, в чём смысл использования WinAPI для работы с файлами, когда стандартный функционал :labview: с успехом делает то же самое, причём внутренне вызывая те же функции WinAPI (CreateFile / Read/WriteFile / CloseHandle)?
User avatar
dadreamer
professor
professor
 
Posts: 3149
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 800
I/O VIP vision internet


Return to Сохранение данных

Who is online

Users browsing this forum: No registered users and 2 guests

cron