:: Visual Foxpro, Foxpro for DOS
Re: Серийный номер USB
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
x = "'0h'" + "'"+строка+"'"
? EVAL(x) && задел, Сергей
Не могу пробиться через твои кавычки.

Но я бы так написал то, что ты описал выше как Q-строка, изображается в фоксовом окне как 0haabbcc:
x = 0h + [строка]
? x && 0hF1F2F0EEEAE0

Аналогично выполняется и обратное преобразование Q -> C;
? [] + 0hF1F2F0EEEAE0 && строка

Ну, и наконец, оба этих преобразования можно выполнить явно:
? CAST('строка' as Q(6)) && 0hF1F2F0EEEAE0
? CAST(0hF1F2F0EEEAE0 as C(6)) && строка



Исправлено 2 раз(а). Последнее : akvvohinc, 14.03.23 02:10
Ratings: 0 negative/0 positive
Re: Серийный номер USB
ABB

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
После нескольких итераций ChatGPT предложил следующее решение:
* ```FoxPro
LOCAL oWMI, oDrives, oDrive, oPartitions, oPartition, oDisks, oDisk, nSerialNum, cSerialNumStr
oWMI = GetObject("winmgmts:\\.\root\CIMV2") && получение объекта WMI
oDrives = oWMI.ExecQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'") && запрос списка всех USB-дисков
FOR EACH oDrive IN oDrives
* получение списка дисковых разделов для данного диска
oPartitions = oWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + oDrive.DeviceID + "'} WHERE AssocClass=Win32_DiskDriveToDiskPartition")
FOR EACH oPartition IN oPartitions
* получение списка логических дисков, связанных с этим разделом
oDisks = oWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + oPartition.DeviceID + "'} WHERE AssocClass=Win32_LogicalDiskToPartition")
FOR EACH oDisk IN oDisks
IF oDisk.DriveType = 2 && фильтрация съемных дисков
nSerialNum = oDrive.SerialNumber
cSerialNumStr = TRANSFORM(nSerialNum)
MESSAGEBOX("The serial number of your USB-Drive is: " + cSerialNumStr, ;
64, "Serial Number of USB-Drive")
EXIT && выход после нахождения первого USB-накопителя
ENDIF
ENDFOR
ENDFOR
ENDFOR
FUNCTION GetObject(cObjPath)
DECLARE INTEGER GetObject IN ole32 STRING, STRING @
LOCAL cRetVal
cRetVal = GETOBJECT(cObjPath)
m.lcRetVal = IIF(VARTYPE(cRetVal)=="O", cRetVal, .NULL.)
RETURN m.lcRetVal
Ratings: 1 negative/3 positive
Re: Серийный номер USB
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() какой-то человеческий текст... с комментами, отступами...
()() он работает? Только под виндой... WMI...
Доб. убавил зеленки, непонятно



Исправлено 2 раз(а). Последнее : of63, 17.03.23 22:06
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
of63
какой-то человеческий текст
Раз это работает, значит, без человека не обошлось.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
ABB

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
of63
Работает
of63
() какой-то человеческий текст... с комментами, отступами...
Вот мой диалог с ботом. Обратите внимание на временные точки. Тормозил я - были другие дела.
Я, [14.03.2023 11:37]
получить серийный номер usb drive используя язык visual foxpro

ChatGPT Bot, [14.03.2023 11:37]
Для получения серийного номера USB-накопителя в Visual FoxPro можно использовать функцию API GetVolumeInformation. Вот пример кода, который генерирует сообщение в диалоговом окне с серийным номером выбранного USB-накопителя:
Обратите внимание: данное решение может не работать на новых версиях ОС Windows из-за ограничений доступа к функциям API.

Я, [14.03.2023 20:40]
код nDrive = ASC(UPPER(GETFILE("Select your USB-Drive from the file dialog...", "", "*.*/n"))) неверен

ChatGPT Bot, [14.03.2023 20:41]
Да, Вы правы, код nDrive = ASC(UPPER(GETFILE("Select your USB-Drive from the file dialog...", "", "*.*/n"))) некорректен. Я внес ошибку. Вместо него можно использовать функцию API GetLogicalDrives, которая возвращает информацию о всех доступных дисковых устройствах, включая USB-накопители.
Этот код сначала использует функцию GetLogicalDrives для получения битовой маски всех доступных дисковых устройств. Затем он проходит по всем буквам дисков (от A до Z) и проверяет их соответствие маске доступных дисков. Если диск является USB-накопителем, функция GetVolumeInformation запрашивает его серийный номер и выводит его в сообщении.

Я, [14.03.2023 20:51]
оператор F GetDriveType(cDriveLetter) = "DRIVE_REMOVABLE" неверен

ChatGPT Bot, [14.03.2023 20:51]
Да, вы правы. В операторе `IF GetDriveType(cDriveLetter) = "DRIVE_REMOVABLE"` неправильно установлено условие проверки.

В стандартной библиотеке Visual FoxPro нет функции GetDriveType, и мы использовали функцию API GetDriveTypeA из библиотеки kernel32.dll для получения типа дискового устройства.
Исправленный код с правильной проверкой типа дискового устройства выглядит так:
Теперь, если тип дискового устройства соответствует значению DRIVE_REMOVABLE, функция продолжает запрашивать информацию о диске и выводит его серийный номер.

Я, [14.03.2023 20:57]
функция GetDriveType(cDriveLetter) не видит сменного устройства

ChatGPT Bot, [14.03.2023 20:58]
Да, Вы правы. Функция GetDriveType из библиотеки kernel32.dll не всегда может правильно определять тип дискового устройства. Она может ошибочно считать, что съемный диск является фиксированным, если диск не содержит носитель, или если на диск нельзя записывать (например, если защита записи включена).

Вместо функции GetDriveType можно использовать функцию WMI (Windows Management Instrumentation), чтобы получить более точную информацию о дисковых устройствах, включая тип и съемность.
Вот пример кода, который использует функцию WMI для получения списка всех съемных дисков и выводит их серийные номера:
Этот код использует функцию ExecQuery для запроса списка всех USB-дисков. Затем он перебирает каждый диск и ассоциированные с ним устройства, получает их серийные номера и выводит их в сообщении.
Обратите внимание: для использования функции WMI необходимо иметь соответствующие права доступа на компьютере.

Я, [15.03.2023 12:49]
операто oItems = oDrive.AssociatedMedia выдает ошибку ole error code 0x80020006: unknown name

ChatGPT Bot, [15.03.2023 12:50]
Извините за путаницу. В коде я ошибочно использовал свойство `AssociatedMedia`, которого на самом деле не существует в классе Win32_DiskDrive. Вместо этого мы должны использовать класс Win32_DiskDriveToDiskPartition, чтобы получить информацию о дисковых разделах на диске, и класс Win32_LogicalDiskToPartition, чтобы получить информацию о логических дисках, связанных с этими разделами.
Вот исправленный код, который использует правильные классы для получения списка USB-накопителей и выводит их серийные номера:
В этом коде мы использовали связывающие запросы для получения информации о дисках, разделах и логических дисках. Затем мы фильтруем результаты, чтобы найти только съемные диски, и выводим их серийные номера.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Вот мой диалог с ботом.
Я. - Бот, сколько будет дважды два?
Bot. - Четыреста сорок четыре. (Обратите внимание - на новых версиях ОС Windows иногда бывает 445)
Я. - Ответ 444 неверен.
Bot. - Да, я ошибся. Использовал не ту библиотеку, надо было другую. А теперь? Сорок четыре.
Я. - Ответ 44 неверен.
Bot. - Извините за путаницу. У Фокса нет функции, которую я ошибочно применил. Может, четыре?
Я. - Лайк, лайк, лайк...
Ratings: 0 negative/0 positive
Re: Серийный номер USB
ABB

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
akvvohinc
Типичная реакция избегания
Реакция избегания или избегающее поведение (англ. Escape response) — род оборонительных реакций, возникающих в ответ на сигнал-предвестник негативно окрашенного эмоционального раздражения, либо действия, направленные на предотвращение такого раздражения. Различают активные и пассивные реакции избегания.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
В журнале "Наука и жизнь" где-то в середине 70-х, когда я ещё учился в школе, была опубликована статья из книги Мартина Гарднера "Математические досуги", которая называлась "Самообучающая машина из спичечных коробков".
Там "компьютер", который представлял собой спичечные коробки и разноцветные бусинки, примерно так же, как ваш Бот, обучался какой-то несложной игре. Если "компьютер" побеждал, его поощряли - оставляли ему его бусинки, если проигрывал - забирали. И в конце концов у него оставались только те бусинки, которые всегда приводили его к победе.

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

PS
Кому интересны детали самообучения того "компьютера", может скачать эту и другие книги Гарднера из серии занимательной математики здесь:
rutracker.org
(но можно и погуглить)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Но можно и по-другому - решение бота - как бесполезный кусок мрамора, но если человек отсечёт от него всё лишнее, то может получиться шедевр.
(возможно, я бы и удивился результатам вашего последнего общения, если бы не видел его решений предыдущих задачек.)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
Burn

Сообщений: 5640
Откуда: Днепр
Дата регистрации: 02.01.2002
А как вы его заставили разговаривать на русском?
Ratings: 0 negative/0 positive
Re: Серийный номер USB
ABB

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
В данном случае я пользовался ботом в телеграмме.
t.me
Ratings: 0 negative/0 positive
Re: Серийный номер USB
Burn

Сообщений: 5640
Откуда: Днепр
Дата регистрации: 02.01.2002
Синкс
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 34 (Гостей: 34)

© 2000-2024 Fox Club 
Яндекс.Метрика