Axolotl wrote: Thu May 29, 2025 4:46 pm
With the debugger you can try to set breakpoints around the suspicious codes.
Or you can do some LoggingToFile stuff.
In fact, after various tests, it turns out that the problem occurs when the debugger is enabled. It systematically crashes unexpectedly, either at startup or at exit if the program was able to launch. I haven't been able to discover the reason. I used the OnError() lib instead of the debugger, but no error was returned. I tested on several versions of PB, on Windows 10 and 11, and the result is the same. Difficult to debug with debugger that crashes without saying why...
To remedy this, I modified Freak's method to create a multilingual program, and I succeeded by including each language in the DataSection. Thus, with automatic detection of the user's language, the program loads the correct translation at startup. This way, I no longer have any crashes in 64-bit.
Method used:
Code: Select all
;-===========================
;-LANGAGE FREAK ;Edited by Jacobus
;-===========================
Global NbLanguageGroups, NbLanguageStrings
Structure LanguageGroup
Name$
GroupStart.l
GroupEnd.l
IndexTable.l[256]
EndStructure
;Modified procedure:
;we no longer load an external file, but we directly indicate which language should be used.
Procedure LoadLanguage(FileLang$)
; do a quick count in the datasection first:
NbLanguageGroups = 0
NbLanguageStrings = 0
;selection of language data in the DataSection:
Select FileLang$
Case "French" : Restore French
Case "English" : Restore English
Case "German" : Restore German
EndSelect
Repeat
Read.s Name$
Read.s String$
Name$ = UCase(Name$)
If Name$ = "_GROUP_"
NbLanguageGroups + 1
ElseIf Name$ = "_END_"
Break
Else
NbLanguageStrings + 1
EndIf
ForEver
Global Dim LanguageGroups.LanguageGroup(NbLanguageGroups) ; all one based here
Global Dim LanguageStrings.s(NbLanguageStrings)
Global Dim LanguageNames.s(NbLanguageStrings)
; Now load the standard language In the user language data part:
Group.i = 0
StringIndex.i = 0
Select FileLang$
Case "French" : Restore French
Case "English" : Restore English
Case "German" : Restore German
EndSelect
Repeat
Read.s Name$
Read.s String$
Name$ = UCase(Name$)
If Name$ = "_GROUP_"
LanguageGroups(Group)\GroupEnd = StringIndex
Group + 1
LanguageGroups(Group)\Name$ = UCase(String$)
LanguageGroups(Group)\GroupStart = StringIndex + 1
For i = 0 To 255
LanguageGroups(Group)\IndexTable[i] = 0
Next i
ElseIf Name$ = "_END_"
Break
Else
StringIndex + 1
LanguageNames(StringIndex) = Name$ + Chr(1) + String$ ; keep name and string together for easier sorting
EndIf
ForEver
LanguageGroups(Group)\GroupEnd = StringIndex ; set end for the last group!
; Now do the sorting and the indexing for each group
For Group = 1 To NbLanguageGroups
If LanguageGroups(Group)\GroupStart <= LanguageGroups(Group)\GroupEnd ; sanity check.. check for empty groups
SortArray(LanguageNames(), 0, LanguageGroups(Group)\GroupStart, LanguageGroups(Group)\GroupEnd)
char = 0
For StringIndex = LanguageGroups(Group)\GroupStart To LanguageGroups(Group)\GroupEnd
LanguageStrings(StringIndex) = StringField(LanguageNames(StringIndex), 2, Chr(1)) ; splitt the value from the name
LanguageNames(StringIndex) = StringField(LanguageNames(StringIndex), 1, Chr(1))
If Asc(Left(LanguageNames(StringIndex), 1)) <> char
char = Asc(Left(LanguageNames(StringIndex), 1))
LanguageGroups(Group)\IndexTable[char] = StringIndex
EndIf
Next StringIndex
EndIf
Next Group
ProcedureReturn #True
EndProcedure
; No change in the language application procedure
Procedure.s Language(Group$, Name$)
Static Group.i ; for quicker access when using the same group more than once / pour un accès plus rapide lorsque vous utilisez le même groupe plusieurs fois
Protected String$, StringIndex.i, Result.i
Group$ = UCase(Group$)
Name$ = UCase(Name$)
String$ = "##### String not found! #####" ; to help find bugs / pour aider à trouver des bugs
If LanguageGroups(Group)\Name$ <> Group$ ; check if it is the same group as last time / vérifier s'il s'agit du même groupe que la dernière fois
For Group = 1 To NbLanguageGroups
If Group$ = LanguageGroups(Group)\Name$
Break
EndIf
Next Group
If Group > NbLanguageGroups ; check if group was found / vérifier si le groupe a été trouvé
Group = 0
EndIf
EndIf
If Group <> 0
StringIndex = LanguageGroups(Group)\IndexTable[ Asc(Left(Name$, 1)) ]
If StringIndex <> 0
Repeat
Result = CompareMemoryString(@Name$, @LanguageNames(StringIndex));,#PB_String_CaseSensitive,-1,#PB_UTF8)
If Result = 0
String$ = LanguageStrings(StringIndex)
Break
ElseIf Result = -1 ; string not found! / chaîne non trouvée !
Break
EndIf
StringIndex + 1
Until StringIndex > LanguageGroups(Group)\GroupEnd
EndIf
EndIf
;Debug "StringIndex = "+StringIndex + " : "+String$
ProcedureReturn String$
EndProcedure
;We define what the user's language is:
Procedure.s DefineUserLanguage()
Define Lang.s, UserIntLang, *Lang
If OpenLibrary(0, "kernel32.dll")
*Lang = GetFunction(0, "GetUserDefaultUILanguage")
If *Lang
UserIntLang = CallFunctionFast(*Lang)
EndIf
CloseLibrary(0)
EndIf
Select UserIntLang
Case 1031 : Lang = "German"
Case 2057 : Lang = "English"
Case 1036 : Lang = "French"
Case 1049 : Lang = "Russian"
Case 3082 : Lang = "Spanish"
Default : Lang = "French"
EndSelect
ProcedureReturn Lang
EndProcedure
;-LOAD LANGUAGE
UserLang.s = DefineUserLanguage()
If UserLang = "French"
LoadLanguage("French") ; default language
ElseIf UserLang = "English"
LoadLanguage("English")
ElseIf UserLang = "German"
LoadLanguage("German")
EndIf
DataSection ;{
French:
; ===================================================
Data$ "_GROUP_", "MenuTitle"
; ===================================================
Data$ "Fichier", "Fichier"
Data$ "Editer", "Editer"
; ===================================================
Data$ "_GROUP_", "MenuItem"
; ===================================================
Data$ "Nouveau", "Nouveau"
Data$ "Ouvrir", "Ouvrir..."
Data$ "Sauvegarder", "Sauvegarder"
; ===================================================
Data$ "_END_", ""
; ===================================================
English:
; ===================================================
Data$ "_GROUP_", "MenuTitle"
; ===================================================
Data$ "Fichier", "File"
Data$ "Editer", "Edit"
; ===================================================
Data$ "_GROUP_", "MenuItem"
; ===================================================
Data$ "Nouveau", "New"
Data$ "Ouvrir", "Open..."
Data$ "Sauvegarder", "Save"
; ===================================================
Data$ "_END_", ""
; ===================================================
German:
; ===================================================
Data$ "_GROUP_", "MenuTitle"
; ===================================================
Data$ "Fichier", "Datei"
Data$ "Editer", "Bearbeiten"
; ===================================================
Data$ "_GROUP_", "MenuItem"
; ===================================================
Data$ "Nouveau", "Neu"
Data$ "Ouvrir", "Offen..."
Data$ "Sauvegarder", "Zum Schutz"
; ===================================================
Data$ "_END_", ""
; ===================================================
;}
EndDataSection
Debug Language("MenuTitle", "Fichier")
Debug Language("MenuItem", "Sauvegarder")
Debug Language("MenuItem", "Ouvrir")
I haven't had time to test other programs yet, which I will do to determine if this is due to a specific program or not. To be continued...
PureBasicien tu es, PureBasicien tu resteras.