Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 952

/ вопрос открыт /

Приветствую, уважаемые эксперты!

Суть вопроса такова у меня установлено Delphi 6 и 2009. Есть исходный текст в которой есть функция PAnsiChar, при компиляции в шестерки все работает как часики а в 2009 ругается на PAnsiChar, заменил на PWideChar, ругаться перестал а работает плохо. Этот текст - кусок кейлогера, после постановки PWideChar в файл записываются символы "?" вместо реальных клавишь. Что же делать в данной ситуации? Спасибо!

Приложение:
  1. function FileExists(const FileName: string): Boolean;
  2. var
  3. Code: Integer;
  4. begin
  5. Code := GetFileAttributes(PAnsiChar(FileName));
  6. Result := (Code <> -1) and (FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_HIDDEN or
  7. FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_ARCHIVE or FILE_ATTRIBUTE_NORMAL and Code <> 0);
  8. end;


Demosha Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Demosha (статус: Посетитель)
Вопрос отправлен: 28 июня 2009, 08:40
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Виталий

Здравствуйте, Demosha!
Ну всё весьма просто, я думаю. Дело в String. В Delphi 2009 String = WideString, а вам нужно AnsiString.
То есть изначально делфи передаёт параметр в юникоде, а вы его ломаете преобразовывая в PAnsiChar.

Ответ отправил: Виталий (статус: 2-ой класс)
Время отправки: 28 июня 2009, 08:58


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 28 июня 2009, 12:40; участников в обсуждении: 4.
Demosha

Demosha (статус: Посетитель), 28 июня 2009, 09:17 [#1]:

И как же мне быть? я не догоняю)
Amidamaru

Amidamaru (статус: 4-ый класс), 28 июня 2009, 09:40 [#2]:

попробуй вместо string - ansistring
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Demosha

Demosha (статус: Посетитель), 28 июня 2009, 09:51 [#3]:

Заменил! А в Code что?
function FileExists(const FileName: !!!ansistring!!!): Boolean;
var
Code: Integer;
begin
Code := GetFileAttributes(???????????(FileName));
Result := (Code <> -1) and (FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_HIDDEN or
FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_ARCHIVE or FILE_ATTRIBUTE_NORMAL and Code <> 0);
end;
Amidamaru

Amidamaru (статус: 4-ый класс), 28 июня 2009, 10:08 [#4]:

когда внутри скобок нажимаешь ctrl+shift+пробел какой он тип пишет? вот тот и пиши.
Просто у меня 2009й нету, поэтому я с этой проблемой ещё не сталкивался.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Demosha

Demosha (статус: Посетитель), 28 июня 2009, 10:18 [#5]:

в том и дело пишет PWideChar, а если его ставишь прога корректно не работает
Amidamaru

Amidamaru (статус: 4-ый класс), 28 июня 2009, 10:27 [#6]:

Попробуй вместо GetFileAttributes - GetFileAttributesA
И на будущее у большинства API функций есть 2 "вида":
для ansi и для wide, имена которых заканчиваются соответственно на A или W.
Функция без такого символа в конце имени просто привязана к одному из вариантов. Т.е. например в 6й делфи GetFileAttributes и GetFileAttributesA - это одна и таже функция, а в 2009й GetFileAttributes = GetFileAttributesW
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Demosha

Demosha (статус: Посетитель), 28 июня 2009, 11:01 [#7]:

Ну пожалуйста, раставьте эти типы долбанные! В этом примере с латинским все в поряде а с кирилицей лажа, кодировка не правильная, уже запутался, пожалуйста прямо в исходник вбейти профану)


function FileExists(const FileName: ansistring): Boolean;
var
Code: Integer;
begin
Code := GetFileAttributesA(PAnsiChar(FileName));
Result := (Code <> -1) and (FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_HIDDEN or
FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_ARCHIVE or FILE_ATTRIBUTE_NORMAL and Code <> 0);
end;
Виталий

Виталий (статус: 2-ой класс), 28 июня 2009, 11:28 [#8]:

Именно из-за этой путаницы я ушёл с Delphi 7 на Delphi 2007, а не 2009.

Если проект был на Delphi 6, то тебе теоретически нужно заменить во всём коде String на Ansistring, PChar на PAnsiChar.

Многие говорят, что юникод это хорошо, но на самом деле нет.
Demosha

Demosha (статус: Посетитель), 28 июня 2009, 11:41 [#9]:

Ладно. допустим, а подскажи пожалуйста как из юникода получить обычный текст, т.е. что бы он записывал в файл не хрень юникодовскую а обычную кирилицу
Виталий

Виталий (статус: 2-ой класс), 28 июня 2009, 11:50 [#10]:

Ну для этого есть Google

{:converts unicode string to ansi string using specified code page.
@param ws unicode string.
@param codepage code page to be used in conversion.
@returns converted ansi string.
}

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; { widestringtostring }


{:converts ansi string to unicode string using specified code page.
@param s ansi string.
@param codepage code page to be used in conversion.
@returns converted wide string.
}
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; { stringtowidestring }
Вадим К

Вадим К (статус: Академик), 28 июня 2009, 12:40 [#11]:

to Demosha
Устное предупреждение!
Следим за словами и выражениями. Аккуратнее.
Во вторых - читаем книги, разбираемся.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.