Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DeviceIOControl, Требуется функция "Cardinal to String" 
V
    Опции темы
Artem148
  Дата 20.6.2011, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



Здрасте!

Функция  DeviceIOControl с параметром IOCTL_STORAGE_QUERY_PROPERTY возврашает:

    1) VendorIdOffset        
    2) ProductIdOffset       
    3) ProductRevisionOffset 
    4) SerialNumberOffset    

Всё в DWORD`e

Вопрос: Как получить(конвертировать) это в String?


Заранее спасибо!
PM MAIL WWW   Вверх
Dik0n
Дата 20.6.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



Цитата(Artem148 @  20.6.2011,  18:35 Найти цитируемый пост)
Вопрос: Как получить(конвертировать) это в String?

IntToStr(); - даже как то странно, этого не знать smile 
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
kami
Дата 20.6.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Dik0n @  20.6.2011,  22:30 Найти цитируемый пост)
IntToStr(); - даже как то странно, этого не знать

В данном случае - неверно.
Потому что указанные параметры - это смещения относительно начала выходного буфера. По этому смещению начинается ASCII строка с завершающим 0, т.е. PAnsiChar.
Добраться до нее можно как-то так (общий принцип):

Код

var
  OutBuffer: pointer; // или PSTORAGE_DEVICE_DESCRIPTOR, или как_Вы_его_обозвали, без разницы - в любом случае это указатель
  PVendorID: PAnsiChar;
begin
  ...
  DeviceIOCtl(... , OutBuffer, ...);
  // сами смещения не рассматриваю, предполагаем, что их из этого OutBuffer мы получили.
  
  PVendorID:=PAnsiChar(pointer(DWORD(OutBuffer)+OutBuffer.VendorIdOffset));
  // собственно, и всё - пусть и в Pchar, но нужный показатель получен. Перевести в string - дело техники :)
...
end;


Добавлено @ 23:59
Ну и, само собой - VendorIDOffset и т.п. для правильного получения строки не должно быть =0, о чем прямо сказано в MSDN

Это сообщение отредактировал(а) kami - 21.6.2011, 00:02
PM MAIL WWW   Вверх
Dik0n
Дата 21.6.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



Цитата(kami @  20.6.2011,  23:56 Найти цитируемый пост)
В корне неверно.

Я подумал что надо просто DWORD в строку конвертировать smile 

Код

type
PSTORAGE_DEVICE_DESCRIPTOR = ^STORAGE_DEVICE_DESCRIPTOR;
_STORAGE_DEVICE_DESCRIPTOR = packed record
  Version: DWord; // Sizeof(_STORAGE_DEVICE_DESCRIPTOR)
  Size: DWord; // Total size of the descriptor, including the space for additional data and id strings
  DeviceType: Byte; // The SCSI-2 device type
  DeviceTypeModifier: Byte;  // The SCSI-2 device type modifier, if any, - this may be zero
  RemovableMedia: Boolean;
  CommandQueueing: Boolean;
  VendorIdOffset: DWord;
  ProductIdOffset: DWord;
  ProductRevisionOffset: DWord;
  SerialNumberOffset: DWord;
  BusType: STORAGE_BUS_TYPE;
  RawPropertiesLength: DWord;
  _Fill: array[0..2] of Byte;
  RawDeviceProperties: array[0..0] of Byte;
 end;

procedure Test()
var
  Buf: _STORAGE_DEVICE_DESCRIPTOR;
begin
  DeviceIOControl(... , @Buf, ...);
  Label.Caption := PAnsiChar(DWORD(Buf) + Buf.SerialNumberOffset);
end;


Это сообщение отредактировал(а) Dik0n - 21.6.2011, 00:44
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
kami
Дата 21.6.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Dik0n @  21.6.2011,  00:17 Найти цитируемый пост)
DeviceIOControl(... , @Buf, ...);

И будете всегда получать ERROR_INSUFFICIENT_BUFFER. Потому что RawDeviceProperties - это всего лишь указатель на первый байт области памяти, в которой хранятся те самые PAnsiVendorID и т.д. В Вашем же примере размер выходного буфера постоянен. И никакие данные в 1 байт не влезут.

PM MAIL WWW   Вверх
Artem148
Дата 21.6.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



[DCC Error] E2089 Invalid typecast
PM MAIL WWW   Вверх
kami
Дата 21.6.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Artem148 @  21.6.2011,  13:36 Найти цитируемый пост)
[DCC Error]

телепаты в отпуске. Что Invalid typecast ?

Это сообщение отредактировал(а) kami - 21.6.2011, 15:32
PM MAIL WWW   Вверх
Artem148
Дата 22.6.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



Код

type
  TSTORAGE_PROPERTY_QUERY = packed record
    PropertyId:              Integer; 
    QueryType:               Integer;  
    AdditionalParameters: array [0..1] of WORD;  
  end;

type  
  TSTORAGE_DEVICE_DESCRIPTOR           = packed record
    Version:                           DWORD;
    Size:                                DWORD;
    DeviceType:                     Byte;
    DeviceTypeModifier:         Byte;
    RemovableMedia:            Boolean;
    CommandQueueing:       Boolean;
    VendorIdOffset:              DWORD;
    ProductIdOffset:             DWORD;
    ProductRevisionOffset:   DWORD;
    SerialNumberOffset:       DWORD;
    StorageBusType:            STORAGE_BUS_TYPE;
    RawPropertiesLength:    DWORD;
    RawDeviceProperties:     array[0..1] of Byte;

var
  STORAGE_PROPERTY_QUERY:      TSTORAGE_PROPERTY_QUERY;
  STORAGE_DEVICE_DESCRIPTOR: TSTORAGE_DEVICE_DESCRIPTOR;

lblProductId.Caption := PAnsiChar(pointer(DWORD(STORAGE_DEVICE_DESCRIPTOR) +   // DWORD(STORAGE_DEVICE_DESCRIPTOR) <== Здесь "[DCC Error] E2089 Invalid typecast"
                                                           STORAGE_DEVICE_DESCRIPTOR.VendorIdOffset))
; 



Цитата

   "телепаты в отпуске..."  

        а жаль....
PM MAIL WWW   Вверх
kami
Дата 22.6.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Artem148 @  22.6.2011,  20:32 Найти цитируемый пост)
Здесь "[DCC Error] E2089 Invalid typecast

А Вы обратили внимание, какого типа буфер у меня в примере (приставка P о чем-нибудь говорит?):
Цитата(kami @  20.6.2011,  23:56 Найти цитируемый пост)
OutBuffer: pointer; // или PSTORAGE_DEVICE_DESCRIPTOR


и у Вас:
Цитата(Artem148 @  22.6.2011,  20:32 Найти цитируемый пост)
STORAGE_DEVICE_DESCRIPTOR: TSTORAGE_DEVICE_DESCRIPTOR;

Все равно - наступите на те же грабли, что и в коде Dik0n.

Добавлено @ 22:19
Совет: Найдите поиском в интернете код, который выкладывала Riply. Afair, дело было на DelphiMaster.

Это сообщение отредактировал(а) kami - 22.6.2011, 22:20
PM MAIL WWW   Вверх
Dik0n
Дата 23.6.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



Цитата(kami @  22.6.2011,  22:08 Найти цитируемый пост)
Найдите поиском в интернете код, который выкладывала Riply

http://forum.sources.ru/index.php?showtopic=210411 оно не ?
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
Artem148
Дата 23.6.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



Цитата(kami @ 22.6.2011,  22:08)
А Вы обратили внимание, какого типа буфер у меня в примере (приставка P о чем-нибудь говорит?):
Цитата(kami @  20.6.2011,  23:56 Найти цитируемый пост)
OutBuffer: pointer; // или PSTORAGE_DEVICE_DESCRIPTOR


и у Вас:
Цитата(Artem148 @  22.6.2011,  20:32 Найти цитируемый пост)
STORAGE_DEVICE_DESCRIPTOR: TSTORAGE_DEVICE_DESCRIPTOR;



Офтальмолог тоже в отпуске...


Да, всё равно в Type где-то вру...   smile 
Если вас не затруднит, можете скинуть пример...

Это сообщение отредактировал(а) Artem148 - 23.6.2011, 14:00
PM MAIL WWW   Вверх
kami
Дата 23.6.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Artem148 @  23.6.2011,  11:26 Найти цитируемый пост)
Да, всё равно в Type где-то вру...    Если вас не затруднит, можете скинуть пример...

Вам была дана вся необходимая информация: ключевые моменты, ссылки на описания в MSDN и ссылка на пример использования (за Вас ее нашел Dik0n).
Вы залезли достаточно глубоко в WinAPI, где далеко не всегда существуют примеры "на все случаи жизни", а писать за Вас уже готовый код вряд ли будут. Учитесь адаптировать "под себя" то, что дано.

Добавлено через 6 минут и 17 секунд
Совет - чтобы не ошибиться в объявлении типов, рекомендую воспользоваться JWA
PM MAIL WWW   Вверх
Artem148
  Дата 24.6.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



Вопрос снят!

kami, всё дело оказалась прозаичнее: во всём виновата десятая еврейская делфи(всё ей не так!  smile  ), 
                   запустил в 2007 - работает и мой код и ваш(после небольшой доработки  smile  )


Всем спасибо за помощь  и утраченное время  smile 

P.S Delphi XE капризничает уже так не первый раз ...  smile 

Это сообщение отредактировал(а) Artem148 - 24.6.2011, 21:56
PM MAIL WWW   Вверх
kami
Дата 24.6.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Artem148 @  24.6.2011,  21:55 Найти цитируемый пост)
во всём виновата десятая еврейская делфи(всё ей не так!    ), 

Думается, Delphi здесь ни при чем smile
Отличие версии 2007 от 2010 в большинстве случаев "виноватости" состоит только в одном:
в 2007 string = AnsiString
в 2010 string = UnicodeString.
Со всеми вытекающими.
PM MAIL WWW   Вверх
Artem148
Дата 25.6.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



P.S Всё равно получаю в Delphi XE китайские символы...
      Всё обгуглил; функции конвектирования нет...   Ну что ж, пойду учить китайский...  smile 

Это сообщение отредактировал(а) Artem148 - 25.6.2011, 19:30
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.