Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Padeg.dll и Delphi XE


Автор: BDmV 5.3.2012, 14:51
На WinXP SP3, Rad Studio XE после компиляции проекта, padeg.dll стала возвращать перекорёженные слова.
Например Пупкин Иван Ивановичь на выходе получается "упки= ва= вановиg" вместо "Пупкину Ивану Ивановичу"
Что я делаю не так? Или padeg.dll версии 3.3 просто выдаёт текст в какой-то своей кодировке  как тогда получить нормальный перевод?
Пример кода:

Код

unit Unit2;

interface

uses
  Windows, Forms, Controls, StdCtrls, Classes, SysUtils;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DllHandle : HMODULE;
  GetFIOPadeg   : function (pLastName, pFirstName, pMiddleName: PChar;
                           bSex: Boolean; nPadeg: LongInt; pResult: PChar;
                           var nLen: LongInt): Integer; stdcall;

  Form2: TForm2;
  Sex:boolean;
  nLen:LongInt;
  pResult:PChar;
  pVar:integer;
  FPadeg:Boolean;
  Fio,nName,SName:string;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
   Fio:='Пупкин';
   nName:='Иван';
   SName:='Иванович';
end;

procedure TForm2.FormShow(Sender: TObject);
begin
   Label1.Caption:=Fio;
   Label2.Caption:=nName;
   Label3.Caption:=SName;
   Sex:=True;
   if Assigned(GetFIOPadeg) then
     begin
       nLen := Length(FIO)+10;
       pResult:=StrAlloc(nLen);
       try
          pVar:=GetFIOPadeg(PChar(Fio),'','',Sex,3, pResult, nLen);
          Label4.Caption:=pResult;
       finally
          StrDispose(pResult);
       end;
       nLen := Length(nName)+10;
       pResult:=StrAlloc(nLen);
       try
         GetFIOPadeg('',PChar(nName),'',Sex,3, pResult, nLen);
         Label5.Caption:=pResult;
       finally
          StrDispose(pResult);
       end;
       nLen := Length(sName)+10;
       pResult:=StrAlloc(nLen);
       try
         GetFIOPadeg('','',PChar(SName),Sex,3, pResult, nLen);
         Label6.Caption:=pResult;
       finally
          StrDispose(pResult);
       end;
     end;
   if Sex then
     Label7.Caption:='Муж.'
   else
     Label7.Caption:='Жен.';
end;

initialization
  DllHandle := LoadLibrary('padeg.dll');
  FPadeg:=True;
  if DllHandle <> 0 then
    Begin
      @GetFIOPadeg := GetProcAddress(DllHandle, 'GetFIOPadeg');
    end
  else
    FPadeg:=False;
finalization
  FreeLibrary(DllHandle);
end.
end.

Автор: northener 5.3.2012, 15:01
А вы уверены что сия dll умеет работать с юникодом?

Автор: BDmV 5.3.2012, 15:10
Цитата(northener @ 5.3.2012,  15:01)
А вы уверены что сия dll умеет работать с юникодом?

Нет не уверен.
Последний раз я её пользовал на WinXP SP3, Delphi 2007 проблем тогда небыло. Сейчас решил немного доработать прогу и упёрся... :(

А как тогда сформировать строку, чтоб сия dll её обработала не перекорёжив?

Автор: northener 5.3.2012, 15:16
В Д2009+, к которым относится и ХЕ PChar это PWideChar.
Попробуйте описать функцию так:
Код

GetFIOPadeg   : function (pLastName, pFirstName, pMiddleName: PAnsiChar;
                           bSex: Boolean; nPadeg: LongInt; pResult: PAnsiChar;
                           var nLen: LongInt): Integer; stdcall;


И везде в коде заменить PChar на  PAnsiChar. А String на AnsiString;

Автор: BDmV 5.3.2012, 15:28
Пробывал. Не помогает.
Даже вообще Русские буквы пропадают. :(

Даже пробыва менять в реестре HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252  менял с c_1251.nls на c_1251.nls

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)