Moin moin,
ich hab das ein kleines Problemchen mit meiner
DLL.
[ Das Codegerümpel is unten ]
Also, los geht's. Ich hab in einer
DLL eine Sprache drin. Diese Sprache ist über einen Record aufgebaut. Das Auslesen klappt, wie es soll (per Debugger überprüft). Dann füge ich das ja in meine ObjectList hinzu ([1]) (TLanguageManager = class(TobjectList). Wenn ich nun auf diese Language zugreife ([2]), steht danach im Record nur Mist drinne.
Bis zu Zeitpunkt von [1] stimmt alles noch. Aber bei [2] ist dann Chaos in dem Record.
[edit]
Ich kann auch noch in der Procedure SearchLanguages das hier schreiben:
raise Exception.Create(Items['German'].LanguageInfo.lngDate);
Da funktionierts einwandfrei...
[/edit]
Erstmal Aufbau der Records:
Delphi-Quellcode:
type
TLanguageObj = record
Caption: PChar;
Hint: PChar;
end;
TLanguageInfoRec = record
lngAuthor: PChar;
lngLanguageVersion: PChar;
lngProgramVersion: PChar;
lngDate: PChar;
lngLanguageName: PChar;
end;
TLangfrmMainRec = record
lngmiFile: TLanguageObj;
lngactClose: TLanguageObj;
end;
TLanguageRec = record
lngfrmMain: TLangfrmMainRec;
end;
So, dann
DLL:
Delphi-Quellcode:
function GetLanguageRecord: TLanguageRec;
stdcall;
begin
Result.lngfrmMain.lngmiFile.Caption := '
Datei - DLL';
Result.lngfrmMain.lngmiFile.Hint := '
Datei - DLL';
Result.lngfrmMain.lngactClose.Caption := '
Programm beenden - DLL';
Result.lngfrmMain.lngactClose.Hint := '
Beendet das Programm';
end;
function GetLanguageInfo: TLanguageInfoRec;
stdcall;
begin
Result.lngAuthor := '
Manuel Rauber';
Result.lngLanguageVersion := '
1.0';
Result.lngProgramVersion := '
0.1';
Result.lngDate := '
2006-04-24';
Result.lngLanguageName := '
German';
end;
exports
GetLanguageRecord,
GetLanguageInfo;
Dann Auslesecode (
):
Delphi-Quellcode:
procedure TLanguageManager.SearchLanguages;
var
SR: TSearchRec;
Lang: TLanguage;
begin
inherited Clear;
if FindFirst(GetLangDir + '*.dll', faAnyFile, SR) = 0 then
begin
repeat
FDLLCommunicator.Filename := GetLangDir + SR.Name;
Lang := TLanguage.Create(Self);
Lang.LanguageInfo := FDLLCommunicator.GetLanguageInfo;
Lang.LanguageRec := FDLLCommunicator.GetLanguage;
inherited Add(Lang); //////////////////// [1]
until FindNext(SR) <> 0;
end;
end;
Passend dazu noch GetLanguageInfo:
Delphi-Quellcode:
function TLanguageDLLCommunicator.GetLanguageInfo: TLanguageInfoRec;
var
func: TGetLanguageInfo;
begin
if FOpened
then
begin
@func := GetProcAddress(FHandle, '
GetLanguageInfo');
if @func <>
nil then
begin
Result := func;
end;
end
else
raise Exception.Create('
DLL is not open');
end;
Und zu guter Letzt noch GetItem:
Delphi-Quellcode:
function TLanguageManager.GetItem(LangName: String): TLanguage;
var
I: Integer;
begin
for I := 0 to inherited Count - 1 do
begin
//////////////////// [2]
if (TLanguage(inherited Items[I]).LanguageInfo.lngLanguageName = LangName) then
begin
Result := TLanguage(inherited Items[I]);
Break;
end;
end;
end;