A
Alexsis
Вот блок моего исходника, написанного когда-то на 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);
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);