Здравствуйте умные люди мира сего Хелп!!!!
Возникла проблемка с копированием файла на SD — карту!
Если при копировании большого файла перейти в спящий режим,то когда КПК просыпается функция CopyFile возвращает false с кодом ощибки
31 — Присоединенное к системе устройство не работает. (иногда код 20 — Системе не удается найти указанное устройство). После этого любая попытка скопировать что-нибуть на SD-шку проваливается (с кодом 20).
Если вытащить и вставить SD-шку, то далее все будет копироваться нормально.
Теперь собственно вопрос:
Можно ли как нибуть в программе переинициализить строредж-карту (как происходит при вытаскивании и вставлении)?
Или может как нибуть подругому можно избежать такой ситуации??
14.12.04 01:52: Перенесено модератором из 'C/C++' — Павел Кузнецов
14.12.04 12:00: Перенесено модератором из 'Железо' — AndrewVK
Здравствуйте, CrazyZOObr, Вы писали:
CZO>Здравствуйте умные люди мира сего Хелп!!!! CZO>Возникла проблемка с копированием файла на SD — карту! CZO>Если при копировании большого файла перейти в спящий режим,то когда КПК просыпается функция CopyFile возвращает false с кодом ощибки CZO>31 — Присоединенное к системе устройство не работает. (иногда код 20 — Системе не удается найти указанное устройство). После этого любая попытка скопировать что-нибуть на SD-шку проваливается (с кодом 20). CZO>Если вытащить и вставить SD-шку, то далее все будет копироваться нормально.
CZO>Теперь собственно вопрос: CZO>Можно ли как нибуть в программе переинициализить строредж-карту (как происходит при вытаскивании и вставлении)? CZO>Или может как нибуть подругому можно избежать такой ситуации??
Этот вопрос больше относится к мобильным устройствам.... Лучше там задавать...
Здравствуйте, CrazyZOObr, Вы писали:
CZO>Если вытащить и вставить SD-шку, то далее все будет копироваться нормально.
После выключения и включения в WM2003 handle файла становится не валидным
CZO>Теперь собственно вопрос: CZO>Можно ли как нибуть в программе переинициализить строредж-карту (как происходит при вытаскивании и вставлении)?
У вас проблема в том, что вы используете старый handle.
можно перехватить сообщение WM_DEVICECHANGE — именно оно приходит при инциализации карты (при выходе из режима сна тоже приходит). Вообще это явно появилось в WM2003 — при выключении карта программно отключается и переинициализируется заново. А т.к. многие программы были расчитаны на старое поведение, то многие поизводители выпустили патчи не отсоединяющие карты и сохраняющие указатели валидными.
Поищите у производителя своего устройства. CZO>Или может как нибуть подругому можно избежать такой ситуации??
не выключать устройство? Перехват кнопки выключения?
Здравствуйте, Gandalf_The_Grey, Вы писали:
G_T>можно перехватить сообщение WM_DEVICECHANGE — именно оно приходит при инциализации
Проблемка в том, что под CE нет сообщения WM_DEVICECHANGE. Не могу найти его аналога... но получает же как то система оповещения...
Есть ли какие нибуть соображения?
Здравствуйте, CrazyZOObr, Вы писали:
CZO>Здравствуйте, Gandalf_The_Grey, Вы писали:
G_T>>можно перехватить сообщение WM_DEVICECHANGE — именно оно приходит при инциализации
CZO>Проблемка в том, что под CE нет сообщения WM_DEVICECHANGE. Не могу найти его аналога... но получает же как то система оповещения... CZO>Есть ли какие нибуть соображения?
При втыкании карточки, загружается драйвер и ему присваивается соответствующий DSK (DSK0:, DSK1:,...).
Далается это системой с помощью ActivateDevice
ActivateDevice loads a device driver in the manner that the plug and play system loads a device driver. ActivateDevice reads the registry key specified in lpszDevKey to get the DLL name, device prefix, index, and other values. Next it adds the device to the active device list in the registry branch HKEY_LOCAL_MACHINE\Drivers\Active, and stores the relevant values there. If no device index was specified in the key named in lpszDevKey, then it assigns a free index. Then it calls RegisterDevice to actually load the device driver DLL in the process space of the Device Manager. Finally, it broadcasts a WM_DEVICECHANGE message for the new device.
Могу добавить, что я встречал машинки, на которых были кривые драйвера. Мне достался Dell Axim c СF и SD слотами. При втыкании карточки в CF — все было нормально, а при втыкании в SD — нотификация не приходила. Но это была проблема конкретной модели, а не программная. Декларируется, что при втыкании карточки нотификация должна приходить.
И она приходит Проверено
Re[3]: Копирование на SD Card под Pocket PC
От:
Аноним
Дата:
14.12.04 11:03
Оценка:
Здравствуйте, CrazyZOObr, Вы писали:
CZO>Здравствуйте, Gandalf_The_Grey, Вы писали:
G_T>>можно перехватить сообщение WM_DEVICECHANGE — именно оно приходит при инциализации
CZO>Проблемка в том, что под CE нет сообщения WM_DEVICECHANGE. Не могу найти его аналога... но получает же как то система оповещения... CZO>Есть ли какие нибуть соображения?
G_T>При втыкании карточки, загружается драйвер и ему присваивается соответствующий DSK (DSK0:, DSK1:,...).
При вытаскивании и ставке карты нотификация происходит.
К сожалению нотификация не происходит при переходе в режим Sleep, а трабла появляется именно тогда.
G_T>Далается это системой с помощью ActivateDevice
Нужно обеспечить работоспособность для любой карты. Я не знаю наперед тип карты и раздел в реестре, отвечающий за это устройство... как тут быть?
Здравствуйте, CrazyZOObr, Вы писали:
G_T>>При втыкании карточки, загружается драйвер и ему присваивается соответствующий DSK (DSK0:, DSK1:,...). CZO>При вытаскивании и ставке карты нотификация происходит. CZO>К сожалению нотификация не происходит при переходе в режим Sleep, а трабла появляется именно тогда.
G_T>>Далается это системой с помощью ActivateDevice
CZO>Нужно обеспечить работоспособность для любой карты. Я не знаю наперед тип карты и раздел в реестре, отвечающий за это устройство... как тут быть?
При выходе из спящего режима вообще-то должно было бы посылать нотификацию про отсоединение и присоелинение карточки.
Попробуйте ловить нажатие на кнопку. Ее можно точно захукать.
Или можно написать драйвер, который будет получать XXX_PowerUp
или можно ловить в приложении здесь (но это появилось в .NET поэтому менее переносимо)
G_T>Попробуйте ловить нажатие на кнопку. Ее можно точно захукать. G_T>Или можно написать драйвер, который будет получать XXX_PowerUp G_T>или можно ловить в приложении
Даже если я отслежу нажатие ткнопки, мне придется как-то переинициализить флешку. Я получаю путь к флешке с помощью FindFirstFlashCard() и FindNextFlashCard(). Можно ли вытащить их инфу, нужную для функции ActivateDevice()? Или может есть другой способ переинициализации флэшки?
G_T>>Попробуйте ловить нажатие на кнопку. Ее можно точно захукать. G_T>>Или можно написать драйвер, который будет получать XXX_PowerUp G_T>>или можно ловить в приложении
CZO>Даже если я отслежу нажатие ткнопки, мне придется как-то переинициализить флешку. Я получаю путь к флешке с помощью FindFirstFlashCard() и FindNextFlashCard(). Можно ли вытащить их инфу, нужную для функции ActivateDevice()? Или может есть другой способ переинициализации флэшки?
Из сообщения, которое идет при монтировании карточки и значений в реестре можно вытащить Handle
Попробуйте запользовать CeResyncFilesys. Может в Вашем случае поможет...
Хотя это не нормально, что карточка не отсоединяется и не присоединяется после включения.
Нетипичное поведение.
G_T>Из сообщения, которое идет при монтировании карточки и значений в реестре можно вытащить Handle G_T>Попробуйте запользовать CeResyncFilesys. Может в Вашем случае поможет... G_T>Хотя это не нормально, что карточка не отсоединяется и не присоединяется после включения. G_T>Нетипичное поведение.
Не тепичное... и не тривиальное ! Происходит только если во время нажатия кнопки копируется файл, и то не всегда. Может 10 раз сработать, а один свалится... Причем при копировании на внутреннюю флэщку все путем..