Einzelnen Beitrag anzeigen

Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#1

DLL: Record aus DLL holen

  Alt 24. Apr 2006, 18:02
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;
  Mit Zitat antworten Zitat