Witajcie !
Ostatnio użytkownicy systemu Windows 98 zaczęli zgłaszać mi pojawianie się błędu "Range check error" podczas używania jednego z moich programów.
Przeanalizowałem dokładnie moment, w którym pojawia się ten błąd oraz zmiany jakie wprowadziłem w programie od czasu ostatniej jego wersji. Wcześniejsza bowiem wersja nie powodowała pojawiania się tego komunikatu.
Najbardziej prawdopodobną przyczyną jest ten oto kawałek kodu:
h := FindWindow(nil, 'Tytuł okna aplikacji');
if h <> 0 then
begin
error_message := GetMessageBoxTextFromTitle('Tytuł okna aplikacji');
PostMessage(h, WM_QUIT, 0, 0);
end;
Kod ten ma za zadanie sprawdzić czy w danym momencie obecne jest okno pewnej zewnętrznej aplikacji powiązanej z moim programem. W razie obecności tego okna ma ono zostać zamknięte, a treść tego okna ma zostać umieszczona w zmiennej error_message.
Poniżej zaś deklaracja funkcji GetMessageBoxTextFromTitle:
function GetMessageBoxTextFromTitle(as_Title: String): WideString;
var
li_Handle : integer ;
li_Identifier : integer;
ll_ret : longint ;
lul_Size : ulong ;
lpc_Text : PChar ;
lc_Buffer : Array[0..255] of Char;
ls_Text : String ;
begin
// Set Variables
ls_Text := '';
li_Identifier := 65535;
lul_Size := 255;
getMem(lpc_Text, lul_Size);
// get the WindowHandle
li_Handle := FindWindow(PChar(0), StrPCopy(lc_Buffer, as_Title));
if li_Handle > 0 then
begin
// If Window found, get Text of Messagebox
ll_ret := GetDlgItemText(li_Handle, li_Identifier, lpc_Text, lul_Size);
if ll_ret > 0 then
begin
ls_Text := trim(lpc_Text);
end;
end;
getMessageBoxTextFromTitle := ls_Text;
end;
Dziwi mnie fakt, że na innych systemach operacyjnych, włączając w to Windows Vista a także linuksowy emulator Windows błąd ten się nie pojawia.
Będę wdzięczy na Wasze wskazówki i głosy w dyskusji.