Polskie znaki w Win32API
Aktualny czas: 28-04-26, 17:10 Witaj! Przejdź do zakładki Logowanie lub Rejestracja


Wątek zamknięty 
[XP] Polskie znaki w Win32API
dawidpieper Offline
*


Liczba postów: 38
Dołączył: 25-05-13

Pomógł: 5



Post: #1
Polskie znaki w Win32API

Witajcie!
Piszę ten temat, gdyż nigdzie nie mogę znaleźć odpowiedzi na pytanie:
Jak obsłużyć polskie znaki dla bibliotek *.dll, *.lib i *.so z poziomu RGSS.
Wcześniej pisałem w tym celu osobny program w C++, ale teraz muszę użyć ruby'ego.
Najpierw - tydzień temu - postanowiłem odłożyć to pytanie, ale dzisiaj sytuacja się powtarza, chodź problem jest nieco inny. Z tej przyczyny zapytam.

Problemem pierwszym było wyświetlenie informacji w MessageBoxu. Zrobiłem to tak:
tresc = "Dostępna jest nowa wersja gry: " + $nowa_wersja[1] + "." + $nowa_wersja[2] + "." + $nowa_wersja[3] + ". Czy chcesz ją teraz pobrać i zainstalować? Pobranie zostanie wykonane automatycznie przez tą aplikację."
mb = WIN32API.new("user32", "MessageBox", ['i','p','p','i'], 'i')
wybor = mb.call(0, tresc, "Dostępna jest nowa wersja gry!", 4|32|0x20000)

Problemem drugim było odczytanie informacji przez syntezator:
saapi = Win32API.new("screenreaderapi", "sayString", ['p','i'], 'v')
saapi_lib = Win32API.new("saapi32", 0, 0, 0)
saapi.call("Ciekawe czy to ł się wyświetli...", 1)

Niestety w obu przypadkach tekst jest wyświetlany bez polskich znaków. W C++ zrobiłbym to poprzez dodanie konwersji 'L' przed stringiem, ale to nie działa.
Nie działa też funkcja (PCHAR(Utf8ToSysy))
. W obydwu przypadkach pojawia się błąd podczas interpretacji.

Z góry bardzo dziękuję za pomoc
Dawid Pajper Pieper
02-10-13 19:47
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
Ayene Offline
*


Liczba postów: 758
Dołączył: 09-04-13

Pomógł: 112



Post: #2
RE: Polskie znaki w Win32API

To chcesz użyć Ruby, czy RGSS? Bo jednak jest względna różnica. W Ruby, z tego co wiem, trzeba zaimplementować Unicode.
$KCODE = 'u'
require 'jcode'
Oczywiście mogę się mylić. Nie pracuję na "czystym" Ruby.

[Obrazek: aye_furniture_pres.png]
04-10-13 00:34
Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
dawidpieper Offline
*


Liczba postów: 38
Dołączył: 25-05-13

Pomógł: 5



Post: #3
RE: Polskie znaki w Win32API

Witam!
Jako, że nazwa działu to "rpg maker", piszę o RGSS'sie zamiennie używając jego nazwy oraz ruby.
Mimo to dziękuję za pomoc, zobaczę czy uda się dołączyć jcode.rb do projektu rpg maker.

Napiszę czy się udało.

PZDR
DP

@EDIT
Niestety nie ma tego modułu w ruby 1.9.3
(Ten post był ostatnio modyfikowany: 05-10-13 14:32 przez dawidpieper.)
05-10-13 14:29
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
Ayene Offline
*


Liczba postów: 758
Dołączył: 09-04-13

Pomógł: 112



Post: #4
RE: Polskie znaki w Win32API

Jeśli zatem potrzebujesz wyświetlić wiadomość w RGSS... nie lepiej użyć komendy:
print(*arg)

[Obrazek: aye_furniture_pres.png]
14-10-13 08:16
Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
dawidpieper Offline
*


Liczba postów: 38
Dołączył: 25-05-13

Pomógł: 5



Post: #5
RE: Polskie znaki w Win32API

Nie koniecznie, chyba, że istnieje taki sposób wyświetlenia printu, że pojawią się opcje typu: anuuj, ponów próbę, ignoruj, tak, nie itp.
Takie bowiem funkcje ma mój skrypt.

Przykładowo:
mb = Win32API.new("user32", "MessageBoxA", [i','p','p','i'], 'i')
odp = mb.call(0, "Dostępna jest nowa wersja gry. Czy chcesz ją teraz pobrać i zainstalować?", "NOWA WERSJA GRY JEST DOSTĘPNA", 0x30|4|0x20000)

Wyświetli informacje o nowej wersji z opcjami tak oraz nie.
Jeśli użytkownik kliknie tak, zmienna odp będzie zawierać liczbę 6, w przeciwnym wypadku 7.
Print, z tego co mi wiadomo, nie jest wstanie wyświetlić innych przycisków oprócz OK.
Zastanawiałem się, czy nie użyć
MessageBoxW
zamiast
MessageBoxA
, ale wtedy cały MessageBox składa się z jakiś chińskich znaków, a nie tylko polskie litery.
Jak mówiłem znalazłem też taki skrypt w internecie:
mb = Win32API.new("user32", "MessageBoxA", ['i','p','p','i'], 'i')
odp = mb.call(0, PCHAR(UTF8ToSys("Dostępna jest nowa wersja gry. Czy chcesz ją pobrać i zainstalować?")), (PCHAR(UTF8ToSys("NOWA WERSJA GRY")), 0x20000|4|32)
Ale pojawia się błąd interpretacji skryptu. Tak samo nie działa
mb = Win32API.new("user32", "MessageBoxA", [L'i',L'p',L'p',L'i')
odp = mb.call(0, L"Dostępna jest nowa wersja gry. Czy chcesz ją pobrać i zainstalować?", L"NOWA WERSJA GRY", 0x20000|4|32)
, a tak to robiłem w C++. Więcej pomysłów nie mam poza naisanie pliku .exe, który odczytywał by dane z pliku i wyświetlał na ich podstawie wiadomość.
Wolałbym jednak tego uniknąć, gdyż moja gra już ma więcej plików .exe i nie chcę zawieszać systemu.

PZDR
DP
14-10-13 19:52
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
Ayene Offline
*


Liczba postów: 758
Dołączył: 09-04-13

Pomógł: 112



Post: #6
RE: Polskie znaki w Win32API

A spróbuj tego:
to_char = Win32API.new("kernel32", "MultiByteToWideChar", 'ilpipi', 'i')
to_byte = Win32API.new("kernel32", "WideCharToMultiByte", 'ilpipipp', 'i')
  
mb_a = Win32API.new("user32", "MessageBoxA", 'lppi', 'i')
  
utf8 = 65001
text = 'Dostępna jest nowa wersja gry. Czy chcesz ją pobrać i zainstalować?'
w = to_char.call(utf8, 0, text, text.size, nil, 0)
b = "\0" * (w*2)
w = to_char.call(utf8, 0, text, text.size, b, b.size/2)    
w = to_byte.call(0, 0, b, b.size/2, nil, 0, nil, nil)
b2 = "\0" * w
w = to_byte.call(0, 0, b, b.size/2, b2, b2.size, nil, nil)

odp = mb_a.call(0, b2, "NOWA WERSJA GRY", 0x20000|4|32)

[Obrazek: aye_furniture_pres.png]
14-10-13 22:06
Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
dawidpieper Offline
*


Liczba postów: 38
Dołączył: 25-05-13

Pomógł: 5



Post: #7
RE: Polskie znaki w Win32API

Bardzo dziękuję, zaraz sprawdzę czy działa, chodź teoretycznie powinno.
Próbowałem konwertować tekst w samej bibliotece dll, nie wpadłem na pomysł (*), by to zrobić w samym ruby'm.
Napiszę czy zadziałało.

Pozdrawiam
Dawid Pieper

PS. Czy ktoś wie jak usunąć komunikat: "script is changing"?
W resourcach nic nie znalazłem, a dekompilacja pliku "game.exe" też nic nie dała.
Może zdekompilować RGSS104E.dll?
Wiem tylko, że RGSS został napisany częściowo w delphi, a częściowo w C++.
Pytam o to, gdyż nie mogę użyć Graphics.update w poniższym zadaniu:
url_dll = Win32API.new("url", 0, 0, 0)
pobierz = Win32API.new("urlmon", "URLDownloadToFile", ['p','p','p','i','p'], 'i')
while pobierz.call(nil, "http://dpieper.webd.pl/labirynt.zip", "%tmp%\\labirynt.zip", 0, nil)
Graphics.update
end
Następnie ten plik jeszcze jest rozpakowywany.
Niestety podczas pobierania gra się wstrzymuje, a po pobraniu widzę okienko ze znienawidzonym przeze mnie komunikatem "SCRIPT IS CHANGING".
Chyba pozostaje tylko zewnętrzna aplikacja (jak mówiłem wolę tego uniknąć) oraz wielowątkowość. Nie wiem jednak jak przetworzyć BeginThread w RGSS'sie tym bardziej, że nie wiem jak widziane są definicje przez winapi.
Z góry dziekuję.



@EDIT
Skrypt działa, był tylko jeden błąd:
w = to_char.call(utf8, 0, text, text.size, b, b.size/2)    
Nie wiem na czym polegał błąd, napisałem linijkę od początku i działa.
Musiałem też usunąć spacje w pustych linijkach, gdyż odczytywał je (interpreter) jako zmienne. Nie wiem dlaczego wcześniej tak nie było.
Pojawiają się jednak polskie litery, efekt osiągnąłem, bardzo dziękuję i pozdrawiam.
DP
(Ten post był ostatnio modyfikowany: 15-10-13 21:13 przez dawidpieper.)
15-10-13 19:10
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika
"Pomógł" przyznał(a):
Wątek zamknięty 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości

Kontakt | Ultima Forum | Wróć do góry | Wróć do forów | Wersja bez grafiki | RSS
Powered By MyBB. © 2013 MyBB Group. All Rights Reserved.
Skórka by Ayene.