|
Вопрос # 2 952/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Суть вопроса такова у меня установлено Delphi 6 и 2009. Есть исходный текст в которой есть функция PAnsiChar, при компиляции в шестерки все работает как часики а в 2009 ругается на PAnsiChar, заменил на PWideChar, ругаться перестал а работает плохо. Этот текст - кусок кейлогера, после постановки PWideChar в файл записываются символы "?" вместо реальных клавишь. Что же делать в данной ситуации? Спасибо!
Приложение: Переключить в обычный режим- function FileExists(const FileName: string): Boolean;
- var
- Code: Integer;
- begin
- Code := GetFileAttributes(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;
 |
Вопрос задал: 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 (статус: Посетитель), 28 июня 2009, 09:17 [#1]:
И как же мне быть? я не догоняю)
|
|
Amidamaru (статус: 4-ый класс), 28 июня 2009, 09:40 [#2]:
попробуй вместо string - ansistring
|
|
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 (статус: 4-ый класс), 28 июня 2009, 10:08 [#4]:
когда внутри скобок нажимаешь ctrl+shift+пробел какой он тип пишет? вот тот и пиши.
Просто у меня 2009й нету, поэтому я с этой проблемой ещё не сталкивался.
|
|
Demosha (статус: Посетитель), 28 июня 2009, 10:18 [#5]:
в том и дело пишет PWideChar, а если его ставишь прога корректно не работает
|
|
Amidamaru (статус: 4-ый класс), 28 июня 2009, 10:27 [#6]:
Попробуй вместо GetFileAttributes - GetFileAttributesA
И на будущее у большинства API функций есть 2 "вида":
для ansi и для wide, имена которых заканчиваются соответственно на A или W.
Функция без такого символа в конце имени просто привязана к одному из вариантов. Т.е. например в 6й делфи GetFileAttributes и GetFileAttributesA - это одна и таже функция, а в 2009й GetFileAttributes = GetFileAttributesW
|
|
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 (статус: Посетитель), 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
Устное предупреждение!
Следим за словами и выражениями. Аккуратнее.
Во вторых - читаем книги, разбираемся.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|