Przekazanie tekstu z polskimi znakami do funkcji WinAPI

0

Witam.
Przepisałem rozszerzenie powłoki windows z Delphi do lazarusa.
Rozszerzenie działa, jednak mam problem z polskimi znakami.

var
  Ikona: TBitmap;

function TMSEContextMenu.QueryContextMenu(hmenu: HMENU; indexMenu: UINT; idCmdFirst: UINT;
      idCmdLast: UINT; UFlags: uint): HRESULT; StdCall;
begin
  Result := 0;
  if CMenu then
  begin
    if ((uFlags and $0000000F) = CMF_NORMAL) or ((uFlags and CMF_EXPLORE) <> 0) then
    begin
      InsertMenu(
        hmenu,
        indexMenu,
        MF_STRING or MF_BYPOSITION,
        idCmdFirst,
        'Otwórz'
        );

      if Ikona.Handle <> 0 then
        SetMenuItemBitmaps(hmenu, indexMenu, MF_BYPOSITION, Ikona.Handle, Ikona.Handle);

      Result := 1;
    end;
  end;
end;

Problem występuje w funkcji InsertMenu, Wygląda to tak:
user image
próbowałem też funkcji InsertMenuW, z takim samym skutkiem.
Czy ktoś wie jak to zrobić prawidłowo?

0

Skorzystaj z wersji unikodowej (czyli InsertMenuW) i wykonaj poniższe rzutowanie:

PWideChar(UnicodeString('Otwórz'))
0
InsertMenuW(
        hmenu,
        indexMenu,
        MF_STRING or MF_BYPOSITION,
        idCmdFirst,
        PWideChar(UnicodeString('Otwórz'))
        );

Niestety efekt jest taki sam.

0

Wrzuć jakiś testowy projekt do pobawienia się, bo nie wierzę, że podany sposób nie działa.

0

Ok, moje rozszerzenie nie jest aż tak rozbudowane, więc niech to będzie ten projekt testowy.
ShellExtension64.rar

Dodam jeszcze, że jest to Windows 10 64bit, Lazarus 1.6 64bit, projekt kompilowany pod 64bity.

0

Spróbuj może z funkcją InsertMenuItemW;

Chwilowym rozwiązaniem może być skorzystanie z wersji dla ANSI - to powinno działać prawidłowo:

PChar(UTF8ToAnsi('Otwórz'))

Póki co nie wiem dlaczego wersja unikodowa nie działa jak należy - na pewno jest problem ze złym kodowaniem ciągu.

0
furious programming napisał(a):

Chwilowym rozwiązaniem może być skorzystanie z wersji dla ANSI - to powinno działać prawidłowo:

PChar(UTF8ToAnsi('Otwórz'))

Jeśli dobrze rozumiem chodzi o coś takiego:

InsertMenuA(
        hmenu,
        indexMenu,
        MF_STRING or MF_BYPOSITION,
        idCmdFirst,
        PChar(UTF8ToAnsi('Otwórz'))
        );

Niestety nadal jest tak samo.
Sprawdzę InsertMenuItemW.


Znalazłem rozwiązanie trochę na około.
Pliki projektu lazarusa są zapisywane w kodowaniu utf-8.
Stworzyłem sobie dodatkowy unit, w którym umieściłem stałą z nazwą pozycji w menu, i zapisałem ten plik w ANSI.
Teraz tekst jest pokazywany prawidłowo.

UTF8ToWinCP nie mogę znaleźć w którym to jest unicie, lazarus tego nie rozpoznaje.
Jutro spróbuję z InsertMenuItemW
Wystarczy mi na dzisiaj.
Dzięki za pomoc.

0

Funkcja UTF8ToWinCP znajduje się w module LazUTF8, ale tak jak pisałem, to tylko chwilowe rozwiązanie.

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