От Delphi 7 к Delphi 2010

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Alexsis f, 15 Mar 2010.

  1. Alexsis f

    Alexsis f New Member

    Joined:
    11 Feb 2009
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Вот блок моего исходника, написанного когда-то на 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. maestro-ant

    maestro-ant New Member

    Joined:
    7 Jan 2007
    Messages:
    26
    Likes Received:
    4
    Reputations:
    6
    А почему такая необходимость юзать 2010 (если не секрет)?
    Если у тебя уже готовый код, который работал на D7, то зачем его компилить в другой среде?
     
  3. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    2010 и 2009 сырые еще, особенно в вин7 это сильно проявляется. Лучше оставить в д7...
     
  4. Alexsis f

    Alexsis f New Member

    Joined:
    11 Feb 2009
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Я бы с удовольствием оставил как есть, но прога не корректно работает в Win 7. Видимо разработчики не зря в D2010 и в D2009 изменили типы char - значит этого потребовали изменения в самой ОС. Сами понимаете, Win XP - это вчерашний день, да и D7 тоже. Поэтому и прошу совета ))
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Alexsis f начиная с 2000 винды все WinAPI функции в unicode.
    Если тебе не нравится формат выходного файла... после получения результата и записи его в файл. открой его преобразуй в ANSI и сохрани :)
     
    _________________________
  6. Alexsis f

    Alexsis f New Member

    Joined:
    11 Feb 2009
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Здесь в большей мере проблема не в том, в каком формате получить выходной файл, а в том, что большую часть текста не возможно прочесть ни в одной кодировке, а часть - можно. Вот я и думаю, что проблема в самом коде. к примеру при использовании
    GetWindowText(CWnd, SzKeyName, SizeOf(SzKeyName))
    выходной текст вообще не читабелен ни в какой кодировке.
     
  7. Alexsis f

    Alexsis f New Member

    Joined:
    11 Feb 2009
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Всем огромное спасибо за советы. Изменил все заданные переменные Char на AnsiChar, сделал теже изменения в параметрах функций, заменил GetKeyNameText и GetWindowText на GetKeyNameTextA и GetWindowTextA соответственно. И все заработало!