UNICODE w XP

0

Witam.
Jak to jest z UNICODE w XP?
Kiedyś wyczytałem gdzieś na necie wyczytałem, że jak wywołam np.
MessageBoxA to XP najpierw wykona MessageBoxA, potem MessageBoxW - to
prawda?
Było tam też napisane, że bardziej się opłaca wykonywać funkcję tylko
w wersji UNICODE bo wtedy program działa szybciej, gdyż windows nie
wywołuje dodatkowo tej samej funkcji w wersji ANSI.
Czy to też jest prawdą?

Postanowiłem w swoim programie każdą funkcję zamienić na wersję "W",
jeśli taka istnieje - czy to dobre podejście? Mam na myśli również
taką procedurę obsługi komunikatów okien (wbrew pozorom - to nie jest
VCL, lecz moja klasa podobna do VCL):

function TMainWnd.WndProc(uMsg: UINT; wPar: WPARAM; lPar: LPARAM): 
LRESULT; stdcall; 
var 
  H: HWND; 
  Ret: Integer; 
  MainWndPS: TPaintStruct; 
begin 
  Result := 0; 
  H := Integer(Self); 
  Ret := GetWindowLongW(H, GWL_USERDATA); //UNICODE
  if (Ret <> 0) then Self := TMainWnd(Ret) 
  else Self := TMainWnd(PCreateStructW(lPar)^.lpCreateParams);  //UNICODE
  case uMsg of 
    WM_CREATE: 
    begin 
      SetWindowLongW(H, GWL_USERDATA, Integer(PCreateStructW(lPar)^.lpCreateParams));  //UNICODE
    end; 
    WM_PAINT: 
    begin
      //Jakieś tam rysowanie
      FDC := BeginPaint(H, MainWndPS); 
      TmpPen := CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); 
      DeleteObject(SelectObject(MainWndPS.hdc, TmpPen)); 
      MoveToEx(MainWndPS.hdc, 0, 0, nil); 
      LineTo(MainWndPS.hdc, FWidth - 1, 0); 
      LineTo(MainWndPS.hdc, FWidth - 1, FHeight - 1); 
      LineTo(MainWndPS.hdc, 0, FHeight - 1); 
      LineTo(MainWndPS.hdc, 0, 0); 
      EndPaint(H, MainWndPS); 
    end; 
    WM_DESTROY: 
    begin 
      PostQuitMessage(0); 
    end; 
    else Result := DefWindowProcW(H, uMsg, wPar, lPar);  //UNICODE
  end; 
end;
0

Deklaracje, dla przykładu MessageBox:

function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
function MessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
function MessageBoxW(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;

Z czego pierwsza operuje na Charach, druga na AnsiCharach, trzecia na WideCharach. W serwisie 4programmers w funkcjach WinApi jest fragment, że np. MessageBoxW jest wspierana przez warstwę Unicode. Więc jeśli już coś obsługuje, to JakasFunkcjaW.

PS. Doskonale widać, że to WinAPI (komunikaty, TPaintStruct). W VCL jest zupełnie co innego.

0
mnbvcX napisał(a)

Z czego pierwsza operuje na Charach, druga na AnsiCharach, trzecia na WideCharach.W serwisie 4programmers w funkcjach WinApi jest fragment, że np. MessageBoxW jest wspierana przez warstwę Unicode. Więc jeśli już coś obsługuje, to JakasFunkcjaW.

Na razie napisałeś to co ja już wiem - pewnie mnie nie zrozumiałeś.

Chodzi mi o to, że (wg. tego, co kiedyś wyczytałem):

Jeśli w jakimś miejscu w kodzie wrzucę jakąś funkcję w wersji ANSI to po odpaleniu programu Windows zrobi coś takiego:
JakasFunkcjaA -> JakasFunkcjaW.
Czyli ogółem tak czy siak zawsze wywoła funkcję UNICODE (wg. tamtego artykułu). Jeśli to prawda to bez sensu jest używać funkcji ANSI, skoro XP tak czy siak wywoła dodatkowo wersję UNICODE tejże funkcji bo to spowalnia pracę programu i lepiej będzie od razu odpalić funkcję UNICODE - większa szybkość pracy programu. Nie wiem tylko czy to jest prawdą.

Opatrzyłem komentarzami wersje UNICODE funkcji itd. w moim kodzie w pierwszym poście.

0
Reset napisał(a)

Czyli ogółem tak czy siak zawsze wywoła funkcję UNICODE (wg. tamtego artykułu). Jeśli to prawda to bez sensu jest używać funkcji ANSI, skoro XP tak czy siak wywoła dodatkowo wersję UNICODE tejże funkcji bo to spowalnia pracę programu i lepiej będzie od razu odpalić funkcję UNICODE - większa szybkość pracy programu. Nie wiem tylko czy to jest prawdą.

Zdziwiłbyś się, ile firm siedzi dalej na starszych systemach operacyjnych, które domyślnie nie mają wsparcia Unicode. Wygodniej dla międzynarodowych użytkowników korzystać z aplikacji z Unicode - na pewno, funkcje ASCII wywołują funkcje Widechar - być może (byłoby to uzasadnione), aplikacja obsługująca Unicode działająca szybciej niż ASCII - nie ma mowy.

Głupie przeszukiwanie stringa (strpos/pos) jest dłuższe dla znaków wielobajtowych niż ASCII. Dodatkowe obciążenie, wynikające z potrzeby alokacji o wiele większych zakresów pamięci dla Unicode wprowadza zapewne znaczące spowolnienie, nie mówiąc już o zarządzaniu przez system czcionkami Unicode, które są bardzo pamięciożerne, a operacje na których - ze względu na rozmiar - trudne do optymalizowania i cache'owania. Jeśli coś może spowalniać pracę w trybie ASCII to sam fakt konwersji, który dla typowego Unicode UCS16 - 16 bitowe znaki o równych rozmiarach - nie wymaga żadnych operacji poza wstawieniem dodatkowych pustych bajtów do bajtów znaków ASCII.

Zatem masz tu wybór - zostać przy rozwiązaniu w pełni zgodnym wstecz i szybszym (!) - czyli ASCII [to robi wiele firm w Polsce], czy też postawić na wsparcie wielu języków - czyli Unicode [do tego są zmuszone wszystkie firmy w kraju, w którym się znajduję].</quote>

0

Dzięki za sensowną odpowiedź. Nie mam więcej pytań, przynajmniej na razie :)

0

Poczekaj do jutra, będzie premiera DELPHI 2009 a ono wspiera UNICODE

0

Wow. A ja myślałem, że Delphi jest już "na wymarciu" od dawna...
Jutro poczytam cosik o tym nowym Delphi.
Ale jeśli będzie takie samo jak Turbo Delphi, do którego trzeba instalować masę syfu żeby to środowisko zadziałało to ja podziękuję i zostanę przy starym i dobrym D7PE.

Kiedyś wyczytałem gdzieś na necie wyczytałem, że jak wywołam np.
MessageBoxA to XP najpierw wykona MessageBoxA, potem MessageBoxW - to
prawda?

Wiktor S. napisał(a)

Mniej więcej. MessageBoxA konwertue tekst na unikod zgodnie z aktualną
stroną kodową, po czym wywołuje MessageBoxW.

To wyżej z grup dyskusyjnych google, założyłem tam identyczny temat, ale nieco wcześniej. Myślałem, że nikt nie odpisze więc postanowiłem zgłosić się do was :)

0

Jak chcesz w aplikacji używać funkcji *W to zdaj sobie też sprawę że standardowo Delphi nie ma kontrolek do wyświetlania WideChar'ów. Albo sobie musisz doinstalować np TnT albo poczekać na tego Tiburiona czy jak mu tam. Nie sądzę żeby było tak że działanie funkcji A polega na konwerowaniu na W. Zgadzam się ze stwierdzenie że jak coś ma działać wolniej to właśnie funkcje wspierające Unicode.

0
b0bik napisał(a)

Jak chcesz w aplikacji używać funkcji *W to zdaj sobie też sprawę że standardowo Delphi nie ma kontrolek do wyświetlania WideChar'ów.

Zerknij w mój podpis ;)

0

Taaa ... założenie że każy użytkownik forum ma włączone wyświetlanie sygnaturek jest błędne. Ja na ten przykład sobie wyłączyłem.

0

Aaa no tak :D Nie pomyślałem o tym. Zwracam honor.

1 użytkowników online, w tym zalogowanych: 0, gości: 1