Deutsch
Forum

Texte aus DLL auslesen

 
- Seite 1 -



Stephan
Sonneborn
Hallo,
in der LEER32.DLL habe ich testweise mit dem ResourceBuilder zwei Strings eingefügt:

einmal in der Sprache Deutsch $0407 bzw. 1031:

und einmal in der Sprache Englisch $0809 bzw. 2057:

Die DLL habe ich über USEDLL eingebunden.
Den Text weise ich so zu:
DE_Text$ = RES("GetStrings", PRGDLL&, 100, $00407)
EN_Text$ = RES("GetStrings", PRGDLL&, 100, $00809)

Aber ich bekomme die Fehlermeldung "String-Ressource nicht gefunden: #100".

Was ist falsch?
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
28.09.2020  
 



 
- Seite 1 -



Georg
Teles
Mir fällt auf, dass
PRGName$      = RES("GetStrings", PRGDLL&, "#100", $00407)

ein Array zurückgibt, aber ich bekomme es auch nicht hin, es auszulesen

So funktioniert es, aber ich verstehe nicht warum
Declare PRGNameN$[]'-------------------------------------#
PRGNameN$[] = RES("GetStrings", PRGDLL&, "#7", $00407)'--#
PRGName$ = PRGNameN$[4]'---------------------------------#

ganzer Code
'*******************************************************************************************************'
'* Programm: Vokabeltrainer                                                                            *'
''******************************************************************************************************'
'* Version: V0.01                                                                                      *'
'* Stand:   28.09.2020                                                                                 *'
'* Info:    Vokabeltrainer                                                                             *'
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Klassendefinition                                                                                   *'
'*******************************************************************************************************'
CLASS Vokabel = Wort$(21), \
Uebersetzung$(21), \
Genus$(2), \
Casus$(13), \
Numerus$(11), \
Verb1$(21), \
Verb22$(21), \
Verb3$(21), \
Lektion$(13)', \
' Anlegen&, \
' Importieren@, \
' Exportieren@, \
' Vorlesen@
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Variablendeklaration                                                                                *'
'*******************************************************************************************************'
'*- Programm -*'
DECLARE PRGDLL&
DECLARE PrgName$
DECLARE x!, xx!, y!, yy!
'*******************************************************************************************************'
'*- Dialog -*'
DECLARE DlgText&[5,30], DlgText$[5,30]
DECLARE DlgEdit&[5,30]
DECLARE ToolBar&, ToolbarIcons&   , TabControl&[5]
'*******************************************************************************************************'
'*- Vobaln -*'
DECLARE Begriff#
DECLARE String Texte[]
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Variablendimensionierung                                                                            *'
'*******************************************************************************************************'
DIM Begriff#, Vokabel
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Wertzuweisungen                                                                                     *'
'*******************************************************************************************************'
PRGDLL&       = USEDLL("Vokabeln_32.DLL")
'PRGName$      = RES("GetStrings", PRGDLL&, "#100", $00407)
'PRGName$      = EXTSTRING$(PRGDLL&, 100)
Declare PRGNameN$[]'-------------------------------------#
PRGNameN$[] = RES("GetStrings", PRGDLL&, "#7", $00407)'--#
PRGName$ = PRGNameN$[4]'---------------------------------#
ToolbarIcons& = 0'Hier später Toolbaricon eintragen
'*******************************************************************************************************'
'*- Skalierung *'
xx! = 1.30
yy! = 1.15
'*******************************************************************************************************'
'*******************************************************************************************************'
'* Prozedurname: MainWindow                                                                            *'
''******************************************************************************************************'
'* Version: V0.01                                                                                      *'
'* Stand:   28.09.2020                                                                                 *'
'* Info:    Baut das Hauptfenster/-dialog auf                                                          *'
'*******************************************************************************************************'

PROC MainWindow

    '*******************************************************************************************************'
    '*- Lokale Parameter -*'
    DECLARE Handle&
    DECLARE Tab&[5]
    DECLARE dx%, dy%
    DECLARE i%
    DECLARE Ende%
    '*******************************************************************************************************'
    '*- Wertzuweisungen -*'
    x!    = 1.00
    y!    = 1.00
    dX%   = 640
    dy%   = 480
    Ende% = 0
    '*******************************************************************************************************'
    '*- Fensteraufbau -*'
    Handle& = CREATE("Dialog", %HWND, PrgName$, 0,0,0,0)
    SETWINDOWPOS Handle& = INT((%MAXX-dx%)/2)*x!,INT((%MAXY-dy%)/2)*y! - dx%*x!, dy%*y!; 0
    Toolbar&       = CREATE("Toolbar", Handle&, ToolbarIcons&, 0, 0, WIDTH(Handle&), 64*y!)
    TabControl&[1] = CREATE("TabCtrl", Handle&, "Vokabel", 5*x!, HEIGHT(Toolbar&) + 5*x!, WIDTH(Handle&) - 2 * 5*x!, HEIGHT(Handle&) - Height(Toolbar&)-2* 5*x!   )
    FOR i%, 2,5,1
    TabControl&[i%] = INSERTTAB(TabControl&[1], i%,"Tab "+ STR$(i%) )
    ENDFOR
    '*******************************************************************************************************'
    '*- Ereignishandler -*'

    WHILENOT Ende%

        WAITINPUT
        Ende%=1

    ENDWHILE

    '*******************************************************************************************************'
    '*- Fenster schließen -*'
    DESTROYWINDOW(Handle&)
    '*******************************************************************************************************'

ENDPROC

'*******************************************************************************************************'
'*******************************************************************************************************'
'* Hauptprogramm                                                                                       *'
''******************************************************************************************************'
CLS
Mainwindow
DISPOSE Begriff#
FREEDLL PRGDLL&
END

Ich würde gern eine Erklärung hierfür haben

Grüße

EDIT:
Da der "Deutsche Texte" in Zeile 4 steht s. ResHacker, könnte die Nummer 4 im Array was damit zutun haben ?
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

28.09.2020  
 




Stephan
Sonneborn
H.Brill (28.09.2020)
Mach doch alles mit Rolands eingebauten Funktionen.


Würde ich gerne machen, aber ich möchte gar nicht die Vokabeln in einer DLL sichern, sondern nur die Texte der Programmoberfläche. Eigentlich brauche ich das nicht für ein Vokabelprogramm, da kann die Oberfläche ja ruhig in Deutsch bleiben. Aber ich habe auf der Arbeit ein Programm entwickelt, dass in unterschiedlichen Sprachen läuft. Und da gehe ich immer noch den umständlichen Weg mit den einzelnen DLLs je Sprache und dem Auslesen mittels ExtString$(). Ich wollte einfach mal die neuen Möglichkeiten testen.

Dazu sollte ich aber schon wissen, welchen String ich auslese. Klar, ich könnte jetzt für jeden Text einen Ressourcenbereich (also den 3. Parameter in der RES("GetStrings" - Funktion) festlegen. Aber ich dachte, es geht auch einfacher, z.B. alle Texte auf Fenster 1, alle Texte auf Fenster 2, alle Hilfetexte zu Fenster 1, alle Hilfetexte zu Fenster 2 u.s.w. jeweils in einen Resourcenbereich ablegen. Damit wäre die DLL viel übersichtlicher, insbesondere dann, wenn man die Text-Nummern dann frei festlegen kann, z.B. 100-199 für die Fenstertexte, 200-299 für die zugehörigen Hilfetexte u.s.w.

Ich habe mir dafür in Excel eine Tabelle erstellt: in Spalte A die Nummer, in Spalte B ein Komma, in Spalte C der deutsche Text, in D dann der Englische. In den Spalten E und F wird dann daraus der Eintrag für die DLL generiert: Nummer & Komma & Text in der jeweiligen Sprache. Danach kann ich dann in Excel einfach die ganze Spalte kopieren und im Resource Builder einfügen. Fertig!
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
28.09.2020  
 




Stephan
Sonneborn
Georg Teles (28.09.2020)
Mir fällt auf, dass
PRGName$ = RES("GetStrings", PRGDLL&, "#100", $00407)
ein Array zurückgibt, aber ich bekomme es auch nicht hin, es auszulesen


Georg Teles (28.09.2020)
So funktioniert es, aber ich verstehe nicht warum
Declare PRGNameN$ '-------------------------------------#
PRGNameN$ = RES("GetStrings", PRGDLL&, "#7", $00407) '--#
PRGName$ = PRGNameN$ '---------------------------------#


Ich hatte auch schon einen variablen Array probiert mit "#7" als 3. Parameter. Weil der ResHacker da eben eine 7 schreibt. Warum? Ich weiß es nicht...

Das macht auch nur der ResHacker. Der Resource Builder macht das nicht. Dafür kann der auch nicht mit Texten als 3. Parameter (z.B. dem "MONAT" in Rolands Beispiel) leben.

Georg Teles (28.09.2020)
EDIT:
Da der "Deutsche Texte" in Zeile 4 steht s. ResHacker, könnte die Nummer 4 im Array was damit zutun haben ?


Bei mir erhalte ich als Rückgabewert für den PRGName$ den Wert "8", zumindest wird das als Fenstertitel angezeigt...
Für PRGNameN$ übrigens auch...


126 kB
Hochgeladen:28.09.2020
Ladeanzahl73
Herunterladen
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
28.09.2020  
 




E.T.
Ich nutze für sowas ohne Probleme ExtString$ , z.B. so:
SetText Status&, 0, @ExtString$(Prg_Dll& ,40)
oder
Checker&[22] = @Create("RadioButton",Static_1&[0],@ExtString$(Prg_Dll& ,24),570,305,200,20)

Der Parameter ist dann genau die Zahl, welche z.B. im ResHacker genau vor dem Texteintrag steht.
Im Bsp. weiter oben also 1584 für "Januar" , 1585 für "Februar" usw...
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
28.09.2020  
 




Stephan
Sonneborn
E.T. (28.09.2020)
Ich nutze für sowas ohne Probleme ExtString$ , z.B. so:
SetText Status&, 0, @ExtString$(Prg_Dll& ,40)
oder
Checker&[22] = @Create("RadioButton",Static_1&[0],@ExtString$(Prg_Dll& ,24),570,305,200,20)

Der Parameter ist dann genau die Zahl, welche z.B. im ResHacker genau vor dem Texteintrag steht.
Im Bsp. weiter oben also 1584 für "Januar" , 1585 für "Februar" usw...


So mache ich das normalerweise auch. Aber damit kann man nicht mit unterschiedlichen Sprachen arbeiten. Oder man muss mit unterschiedlichen Nummernkreisen arbeiten, was ich nicht möchte...
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
29.09.2020  
 




E.T.
Versch. Sprachen für die Programmoberfläche packe ich immer in eine "verkappte" .ini-Datei (mit "falscher" Erweiterung).
Pro Sprache eine Datei.
Lässt sich m.M. nach einfacher bearbeiten bzw. erweitern, als wie jedes mal die .dll zu bearbeiten.
 
XProfan 11
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
29.09.2020  
 



 
- Seite 2 -



Georg
Teles
Guten Morgen,

Stephan Sonneborn (28.09.2020)
Bei mir erhalte ich als Rückgabewert für den PRGName$ den Wert "8", zumindest wird das als Fenstertitel angezeigt...
Für PRGNameN$ übrigens auch...


RES gibt ja auch einen ARRAY zurück, bei dir versucht der Befehl
PRGName$ = RES("GetStrings", PRGDLL&, "#7", $00407)
PRGNameN$ = RES("GetStrings", PRGDLL&, "#7", $00407)

den ARRAY in einen String zu zwingen, 8 vermute ich ist die Anzahl der Strings in diesem ARRAY --- du müsstest entsprechend denen String PRGNameN$ als ARRAY definieren, also PRGNameN$[] und aus diesem dann deine Strings heraussuchen
PRGNameN$[] = RES("GetStrings", PRGDLL&, "#7", $00407)
String1$ = PRGNameN$[0]
String2$ = PRGNameN$[1]
...

Ehrlich gesagt sehe ich bei dem Befehl RES auch nicht durch und habe es noch nie angewandt --- persönlich würde ich wie ET schon schrieb mit
ExtString$(hDLL& , <String#>)
die Strings aus der EXE/DLL auslesen, wenn es so nötig sein soll

Bei meinen mehrsprachigen Programmen verwende ich einen ARRAY intern, je nach Sprache wird der ARRAY dann entsprechend gefüllt - das ist einfacher.

so nebenbei:
Habe bis jetzt nur bei TrackMenüs die Ressourcen in der EXE für mehrsprachige Verwendung benutzt, das erspart dann wesentlich den Aufbau des TrackMenüs - extern laden und anzeigen  [...] 

das sieht im ResHacker dann so aus:



Grüße
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

30.09.2020  
 




H.Brill
Könnte man ja auch als RC_DATA Ressource machen,
zumal er ja schon eine Exceldatei hat. Die kann man ja
auch als normale Textdatei in Excel speichern :
Declare string Menu[], Memory Bereich, Long groesse, anzahl, hdll, info
Def %RT_RCDATA 10
/*
Das als Textdatei speichern und mit dem Reshacker
als RC_DATA unter TEXTE einfügen :
100, Datei,File
101,Öffnen,Open
102,Schließen,Close
*/
cls
hdll = UseDLL("E:\vokabeln.dll")
info = Res("Info", hdll, %RT_RCDATA, "TEXTE", 0)
groesse = Res("Size", hdll, info)
Dim Bereich, groesse
Bereich = Res("Get", hdll, info)
anzahl = Len(String$(Bereich, 0), Chr$(13))
' Oder gleich mit
' Menu[] = Explode(String$(Bereich, 0), Chr$(13))
' ins Array transferieren.

WhileLoop 1, anzahl

    Print SubStr$(String$(Bereich, 0), &LOOP, Chr$(13))
    ' hier kann der ganze String(Nr, deutsch, Englisch)
    ' nochmals untergliedert werden.

EndWhile

WaitInput
FreeDll hdll
Dispose Bereich
end

Vielleicht kommt er ja so weiter.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
30.09.2020  
 




Stephan
Sonneborn
Nach etwas Überlegung und nochmaliger "genauer" Inaugenscheinnahme der Hilfe



habe ich mir folgendes Konstrukt gebaut:
StringID& = 100
Sektion$ = "#"+STR$(INT(StringID&/16)+1)
Array$[] = RES("GetStrings", PRGDLL&, Sektion$, $00407)
PRGName$ = Array$[INT(StringID&-16*(INT(StringID&/16)))]

Zunächst definiere ich in einer Hilfsvariablen die Nummer des Strings in der DLL. Dann ermittele ich die Sektion, also den 3. Parameter der RES("Getstrings" - Funktion. Dann kann ich das Array mit den maximal 16 Einträgen füllen, dabei werden nicht belegte Nummern automatisch mit Leerstrings versehen. Der eigentlichen Variablen muss ich dann nur noch den richtigen Eintrag im Array zuweisen.

Ist etwas umständlich, sollte aber funktionieren...

47 kB
Hochgeladen:30.09.2020
Ladeanzahl74
Herunterladen
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
30.09.2020  
 




E.T.
Naja, warum einfach, wenns umständlich auch geht

... aber jeden das seine

Hab solch einen Ansatz auch mal per .dll versucht, Habs aber dann aufgegeben. Hatte dann pro Sprache einfach eine sep. dll-Datei gemacht, welche bei Prog-Start geladen wurde.

Bin dann bei meiner o.g. Version mit jeweils einer Sprach-Datei pro Sprache geblieben. Das lässt sich für mich am einfachsten Bearbeiten und erweitern.
 
XProfan 11
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
04.10.2020  
 




Stephan
Sonneborn
E.T. (04.10.2020)
Naja, warum einfach, wenns umständlich auch geht

... aber jeden das seine

Hab solch einen Ansatz auch mal per .dll versucht, Habs aber dann aufgegeben. Hatte dann pro Sprache einfach eine sep. dll-Datei gemacht, welche bei Prog-Start geladen wurde.


So hab ichs bisher auch immer gemacht. Ich konnte sogar per Laufzeit die Sprache umstellen (ohne Neustart).

Aber das "kompliziertere" um-die-Ecke-denken bereitet doch dem Hobby-Programmierer den meisten Spaß!
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
04.10.2020  
 




H.Brill
Also bei mir funktioniert das :
Declare String Menu1[], Menu2[]
Declare Memory Bereich1, Bereich2
Declare Long groesse1, groesse2, anzahl, hdll, info_d, info_e
Def %RT_RCDATA 10
/*
Das als Textdateien speichern und mit dem Reshacker
als RCDATA unter DEUTSCH und ENGLISCH einfügen :
Deutsch.txt :
Öffnen
Speichern
Schließen
Englisch.txt :
Open
Save
Close
*/
cls
hdll = UseDLL("E:\Sprachen.dll")
info_d = Res("Info", hdll, %RT_RCDATA, "DEUTSCH", 0)
info_e = Res("Info", hdll, %RT_RCDATA, "ENGLISCH", 0)
groesse1 = Res("Size", hdll, info_d)
Dim Bereich1, groesse1
groesse2 = Res("Size", hdll, info_e)
Dim Bereich2, groesse2
Bereich1 = Res("Get", hdll, info_d)
Bereich2 = Res("Get", hdll, info_e)
anzahl = Len(String$(Bereich1, 0), Chr$(13))
Menu1[] = Explode(String$(Bereich1, 0), Chr$(13))
anzahl = Len(String$(Bereich2, 0), Chr$(13))
Menu2[] = Explode(String$(Bereich2, 0), Chr$(13))
PopUp "&Datei"
AppendMenu 100, Menu1[0]
AppendMenu 101, Menu1[1]
AppendMenu 102, Menu1[2]
PopUp "&File"
AppendMenu 100, Menu2[0]
AppendMenu 101, Menu2[1]
AppendMenu 102, Menu2[2]
WaitInput
FreeDll hdll
Dispose Bereich1, Bereich2
end

Man muß nur darauf achten, die beiden Ressourcen synchron zu
halten. Man könnte auch noch vor die Menütexte Zahlen schreiben,
um die Menüpunkte aus den Array besser zu identifizieren. Oder halt
alles zusammen (100, Öffnen, Open) . Das ganze ist ja dann leicht
mit SubStr$() rauszuziehen.
Da gibt es ja Möglichkeiten genug, um sowas zu realisieren.
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
04.10.2020  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.650 Betrachtungen

Unbenanntvor 0 min.
Member 862464119.05.2024
H.Brill15.09.2022
RudiB.22.04.2021
Alibre22.02.2021
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie