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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ansi to Unicode, Ansi to Unicode 
V
    Опции темы
Artem148
Дата 13.7.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


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

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



Здрасте!

Проблема: Ansi to Unicode...
PM MAIL WWW   Вверх
kami
Дата 13.7.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Artem148 @  13.7.2011,  21:34 Найти цитируемый пост)
Проблема: Ansi to Unicode...

(была шутка, удалена)
Поконкретнее, пожалуйста, потому что из описания проблемы вообще ничего не понятно.
PM MAIL WWW   Вверх
Snowy
Дата 14.7.2011, 10:36 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Artem148, это очень хорошо, что у тебя проблемы.
Форум для этого и существует, чтобы поддержать морально.
Давай, мы с тобой!!!
PM MAIL   Вверх
Clasteruga
Дата 14.7.2011, 12:50 (ссылка)   | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
var
  l: integer;
begin
  if ws = '' then
    Result := ''
else
  begin
    l := WideCharToMultiByte(codePage,
      WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
      @ws[1], -1, nil, 0, nil, nil);
    SetLength(Result, l - 1);
    if l > 1 then
      WideCharToMultiByte(codePage,
        WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
        @ws[1], -1, @Result[1], l - 1, nil, nil);
  end;
end;

Код


function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
  l: integer;
begin
  if s = '' then
    Result := ''
else
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil,
      0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        -1, PWideChar(@Result[1]), l - 1);
  end;
end;

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


Постоялец
*


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

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



Подробнее: Функция  DeviceIOControl (моя любимая) с параметром IOCTL_STORAGE_QUERY_PROPERTY возврашает:

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

смещение ASCII string(MSDN), а прога пишется в DELPHI XE(UnicodeString, как я понял) - следовательно отсюда:
Проблема: Ansi to Unicode...

P.S: Надеюсь я обьяснился, а не запутал сильнее
PM MAIL WWW   Вверх
14SatanA88
Дата 14.7.2011, 14:49 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



издалека ты зашел, Artem148 smile
PM MAIL ICQ   Вверх
Snowy
Дата 14.7.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Так и в чём проблема-то?
Нужен AnsiString? Ну так его и используй.
Хочешь превратить его в юникодную строку? Дельфи это делает автоматически при использовании присваивания.
PM MAIL   Вверх
Artem148
Дата 14.7.2011, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


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

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



Цитата

Хочешь превратить его в юникодную строку? Дельфи это делает автоматически при использовании присваивания...


Если б это было так (у меня или "китайскиие символы" или знаки "?")

Цитата

Так и в чём проблема-то?


Вместо нормальных надписей или китайсий или вопросительные знаки

Цитата

Нужен AnsiString? Ну так его и используй.


Используем. В 2007 дельфи нормальные надписи. В ХЕ - нет.

Перефразирую вопрос: как получить при запросе  IOCTL_STORAGE_QUERY_PROPERTY нормальную запись, а не иероглифы?


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


Постоялец
*


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

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



to Clasteruga: Результат использования твоей функции - знаки вопроса...  
 
user posted image
PM MAIL WWW   Вверх
kami
Дата 14.7.2011, 18:28 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Artem148 @  14.7.2011,  17:05 Найти цитируемый пост)
В 2007 дельфи нормальные надписи. В ХЕ - нет.

код получения одной строки из ее смещения - в студию
PM MAIL WWW   Вверх
Artem148
Дата 14.7.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


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

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



Ок. Но Автора уже не помю...

Код

function getValue(buf: PSTORAGE_DEVICE_DESCRIPTOR; offs: dword): string;
var
 mas: array[0..255] of char;
begin
  if offs=0 then exit;
    asm
      push eax
      push ebx
      push edx
      push esi
      push edi
      xor edi,edi
      xor esi,esi
      mov esi,offs
      lea edx,buf
      lea ebx,mas
      @m1:
      mov al,[edx+esi]
      mov [ebx+edi],al
      inc edi
      inc esi
      cmp al,0
      jne @m1
      pop edi
      pop esi
      pop edx
      pop ebx
      pop eax
    end;

  result := string(mas);

end;


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


Эксперт
***


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

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



Во всем приведенном коде заменить Char на AnsiChar и string на AnsiString (в asm не вникал)
PM MAIL WWW   Вверх
CodeMonkey
Дата 15.7.2011, 07:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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



Цитата(Artem148 @  14.7.2011,  21:22 Найти цитируемый пост)
Ок. Но Автора уже не помю...


Какое слово было здесь непонятно?

Цитата(Snowy @  14.7.2011,  16:39 Найти цитируемый пост)
Нужен AnsiString? Ну так его и используй.




--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Чучмек
Дата 16.7.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(Artem148 @  14.7.2011,  20:22 Найти цитируемый пост)
Ок. Но Автора уже не помю...

А зачем такой гемор?

Код

...
var 
pc:pchar;
begin
pc:=pchar(buf)+offs;
rezult:=pc;
....

Это для 7

Для XE
Код

var s:string;

s:=pansichar(cardinal(buf)+offs);




Это сообщение отредактировал(а) Чучмек - 16.7.2011, 16:33


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Artem148
Дата 18.7.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


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

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



Чучмек, ошибка:

user posted image

Код:

Код

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

  _TSTORAGE_PROPERTY_QUERY = TSTORAGE_PROPERTY_QUERY;


type
 Storage_Bus_Type = ( BusTypeUnknown,
                      BusTypeScsi,
                      BusTypeAtapi,
                      BusTypeAta,
                      BusType1394,
                      BusTypeSsa,
                      BusTypeFibre,
                      BusTypeUsb,
                      BusTypeRAID );

type
 PSTORAGE_DEVICE_DESCRIPTOR = ^_TSTORAGE_DEVICE_DESCRIPTOR;
 TSTORAGE_DEVICE_DESCRIPTOR = record
   Version :               dword;
   Size :                  dword;
   DeviceType :            UCHAR;
   DeviceTypeModifier :    UCHAR;
   RemovableMedia :        BOOLEAN;
   CommandQueueing :       BOOLEAN;
   VendorIdOffset :        dword;
   ProductIdOffset :       dword;
   ProductRevisionOffset : dword;
   SerialNumberOffset :    dword;
   BusType :               STORAGE_BUS_TYPE;
   RawPropertiesLength :   dword;
   RawDeviceProperties :   array[1..500]of CHAR;
 end;

 _TSTORAGE_DEVICE_DESCRIPTOR = TSTORAGE_DEVICE_DESCRIPTOR;


function GetProductId(Device: PChar): String;
var
 hDevice        : THandle;
 ReturnedLength : THandle;
 STORAGE_DEVICE_DESCRIPTOR        : PSTORAGE_DEVICE_DESCRIPTOR;
 STORAGE_PROPERTY_QUERY           : PSTORAGE_PROPERTY_QUERY;
begin
  hDevice := CreateFile(pchar('\\.\' + Device),
           GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE,
                                                 nil, OPEN_EXISTING, 0, 0);


  ZeroMemory(STORAGE_PROPERTY_QUERY, SizeOf(STORAGE_PROPERTY_QUERY));

  if hDevice <> INVALID_HANDLE_VALUE then

    if DeviceIoControl(hDevice,
                       IOCTL_STORAGE_QUERY_PROPERTY,
                       STORAGE_PROPERTY_QUERY,
                       sizeof(STORAGE_PROPERTY_QUERY),
                       STORAGE_DEVICE_DESCRIPTOR,
                       sizeof(STORAGE_DEVICE_DESCRIPTOR),
                       ReturnedLength,
                       nil  ) then

      begin
        Result := PAnsiChar(Сardinal(STORAGE_DEVICE_DESCRIPTOR) + STORAGE_DEVICE_DESCRIPTOR.ProductIdOffset);
      end;
end;

PM MAIL WWW   Вверх
Чучмек
Дата 18.7.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



А где выделяется память под STORAGE_DEVICE_DESCRIPTOR ?


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Artem148
Дата 18.7.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


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

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



А-а, даже если обнулять, то ошибка выскакивает...

P.S Функция "ZeroMemory" заполняет указанный фрагмент памяти нулями ("обнуляет"),
      а выделяется при чтении декларации (Слово "Var"  smile )   smile 

Это сообщение отредактировал(а) Artem148 - 18.7.2011, 21:35
PM MAIL WWW   Вверх
Чучмек
Дата 18.7.2011, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(Artem148 @  18.7.2011,  18:06 Найти цитируемый пост)
STORAGE_DEVICE_DESCRIPTOR        : PSTORAGE_DEVICE_DESCRIPTOR;



Цитата(Artem148 @  18.7.2011,  18:06 Найти цитируемый пост)
PSTORAGE_DEVICE_DESCRIPTOR = ^_TSTORAGE_DEVICE_DESCRIPTOR;


var выделит 4 байта под указатель



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 18.7.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Код

type
  PSTORAGE_PROPERTY_QUERY = ^_TSTORAGE_PROPERTY_QUERY;
  TSTORAGE_PROPERTY_QUERY = packed record
    PropertyId:              Integer;
    QueryType:               Integer;
    AdditionalParameters: array [0..1] of WORD;
  end;
  _TSTORAGE_PROPERTY_QUERY = TSTORAGE_PROPERTY_QUERY;
type
 Storage_Bus_Type = ( BusTypeUnknown,
                      BusTypeScsi,
                      BusTypeAtapi,
                      BusTypeAta,
                      BusType1394,
                      BusTypeSsa,
                      BusTypeFibre,
                      BusTypeUsb,
                      BusTypeRAID );
type
 PSTORAGE_DEVICE_DESCRIPTOR = ^_TSTORAGE_DEVICE_DESCRIPTOR;
 TSTORAGE_DEVICE_DESCRIPTOR = record
   Version :               dword;
   Size :                  dword;
   DeviceType :            UCHAR;
   DeviceTypeModifier :    UCHAR;
   RemovableMedia :        BOOLEAN;
   CommandQueueing :       BOOLEAN;
   VendorIdOffset :        dword;
   ProductIdOffset :       dword;
   ProductRevisionOffset : dword;
   SerialNumberOffset :    dword;
   BusType :               STORAGE_BUS_TYPE;
   RawPropertiesLength :   dword;
   RawDeviceProperties :   array[1..500]of CHAR;
 end;
 _TSTORAGE_DEVICE_DESCRIPTOR = TSTORAGE_DEVICE_DESCRIPTOR;
function GetProductId(Device: PChar): String;
var
 hDevice        : THandle;
 ReturnedLength : THandle;
 STORAGE_DEVICE_DESCRIPTOR        : TSTORAGE_DEVICE_DESCRIPTOR;
 STORAGE_PROPERTY_QUERY           : TSTORAGE_PROPERTY_QUERY;
begin
  hDevice := CreateFile(pchar('\\.\' + Device),
           GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE,
                                                 nil, OPEN_EXISTING, 0, 0);
  ZeroMemory(@STORAGE_PROPERTY_QUERY, SizeOf(STORAGE_PROPERTY_QUERY));
  if hDevice <> INVALID_HANDLE_VALUE then
    if DeviceIoControl(hDevice,
                       IOCTL_STORAGE_QUERY_PROPERTY,
                       @STORAGE_PROPERTY_QUERY,
                       sizeof(STORAGE_PROPERTY_QUERY),
                       @STORAGE_DEVICE_DESCRIPTOR,
                       sizeof(STORAGE_DEVICE_DESCRIPTOR),
                       ReturnedLength,
                       nil  ) then
      begin
        Result := PAnsiChar(Сardinal(@STORAGE_DEVICE_DESCRIPTOR) + STORAGE_DEVICE_DESCRIPTOR.ProductIdOffset);
      end;
end;



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Artem148
Дата 19.7.2011, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Постоялец
*


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

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



Чучмек - волшебник...  smile 

Если не затруднит: объясните в чём ошибка?

Спасибо всем за помощь!
PM MAIL WWW   Вверх
Чучмек
Дата 19.7.2011, 21:43 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Прежде чем передавать  в функцию указатель на структуру, нужно сначала выделить память под оную.(new(),getmem() и др.)
А указатель в var указывает в никуда.
 "Собака" возвращает указатель на память выделенную для переменной.
sizeof для любого указателя возвращает 4.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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