Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem bei statischer/dynamischer DLL-Einbindung (https://www.delphipraxis.net/52769-problem-bei-statischer-dynamischer-dll-einbindung.html)

JamesTKirk 3. Sep 2005 13:15


Problem bei statischer/dynamischer DLL-Einbindung
 
Hallo Leute!

Ich habe folgendes Problem:
Ich habe eine DLL mit folgender Funktion:
Delphi-Quellcode:
function GetTranslation(_name:pchar):pchar;stdcall;
var i:integer;
    bk:string;
begin
bk:=strnew(_name);
result:='';
for i:=0 to high(language) do
 if language[i].name=bk then begin
  result:=language[i].translation;
  exit;
 end;
end;
'language' ist ein statisches Array vom Typ TLanguage, welcher wiederum ein Record mit zwei PChars ('name' und 'translation') ist. Es ist global in der DLL deklariert und wird beim Start der DLL befüllt...

Binde ich die DLL nun statisch ein habe ich keine Probleme...
Mach ich es jedoch dynamisch, dann wir aus dem Wert des Paramter '_name' (bei mir zumindest) immer das Zeichen ''...

Wäre da für ein bisschen Hilfe echt Dankbar...

tommie-lie 3. Sep 2005 13:30

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Wie sieht denn dein dynamisches Einbinden aus?

JamesTKirk 3. Sep 2005 13:56

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Da wär erst mal die Funktion 'loaddll':
Delphi-Quellcode:
type
  TDll=record
   handle:thandle;
   name:string;
  end;

{Anderer Code}

var
 dlls:array of tdll;

{Anderer Code}

function loaddll(dll,name:string):boolean;
var _handle:thandle;
begin
result:=false;
if not fileexists(dll) then exit;
if name='' then exit;
_handle:=loadlibrary(pchar(dll));
if _handle<>0 then begin
 setlength(dlls,length(dlls)+1);
 dlls[high(dlls)].handle:=_handle;
 dlls[high(dlls)].name:=name;
 result:=true;
end;
end;
Sie ist dafür da mehrere DLLs dynamisch zu laden und zusammen mit anderen solchen Funktionen zu verwalten... (is in ner extra Unit)

In der Hauptunit steht folgendes:
Delphi-Quellcode:
{Typ-Deklaration}
  TTranslation=function (_name:pchar):pchar;
{weitere Typen und Code}

{globaler Var-Teil}
  develop:boolean=false;
  language:string='german';
  gettranslation:ttranslation;

{Implementation Teil}

procedure TForm1.FormCreate(Sender: TObject);
var dllerror:boolean;
    s:string;
begin

{Parameter checken und 'develop'(boolean) und 'language'(string) setzen}

if develop then
  dllerror:=not loaddll(extractfilepath(application.exename)+language+'dll\'+language+'.dll','languagedll')
else
  dllerror:=not loaddll(extractfilepath(application.exename)+language+'.dll','languagedll');

{dllerror prüfen und gegebenfalls programm terminieren}

//Funktion GetTranslation laden
@gettranslation:=GetProcAddress(getdllhandle('languagedll'), 'GetTranslation');
if @gettranslation=nil then begin
 messagedlg('Function "GetTranslation" in language DLL "'+language+'.dll" could not be initialized.'+#13#10+'Please check the DLL and restart SOL - Back to Earth.',mterror,[mbok],0);
 application.terminate;
end;
s:='title';
form1.caption:=gettranslation(pchar(s));
end;
Hab die unnötigen Stellen rausgelassen :wink:

tommie-lie 3. Sep 2005 14:05

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Zitat:

Zitat von JamesTKirk
Code:
[b]function[/b] GetTranslation(_name:pchar):pchar;[b][color=red]stdcall[/color][/b];

Zitat:

Zitat von JamesTKirk
Delphi-Quellcode:
  TTranslation=function (_name:pchar):pchar;

Fällt dir was auf? :zwinker:

Olli 3. Sep 2005 14:06

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Zitat:

Zitat von tommie-lie
Fällt dir was auf? :zwinker:

Du meine Güte. Hast du denn nicht richtig gelesen?
Zitat:

Zitat von JamesTKirk
Hab die unnötigen Stellen rausgelassen :wink:


tommie-lie 3. Sep 2005 14:09

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Stimmt. Was interessiert denn sowas unnötiges wie zwei verschiedene Calling Conventions, die die Daten an komplett unterschiedlichen Stellen verwaltet :mrgreen:

JamesTKirk 3. Sep 2005 14:15

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Verdammt! :wall: Des wars! :thumb: Sowas dummes aber auch... :oops:
Hatte net gmerkt, dass ma des bei der Typdeklaration mit angeben muss... Danke @tommy-lie für die Aufdeckung dieses Fehlers...

tommie-lie 3. Sep 2005 14:18

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Zitat:

Zitat von JamesTKirk
tommy-lie

Wenn du jetzt noch meinen Namen richtig schreibst... :mrgreen:

Robert Marquardt 3. Sep 2005 14:33

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Die Funktion ist ineffizient, da sie heimlich dauernd Strings alloziiert.
Delphi-Quellcode:
function GetTranslation(AName: PChar): PChar; stdcall;
var
  I: Integer;
begin
  Result := nil;
  // erst mal nil und Leerstring aussortieren
  if (AName <> nil) and (AName[0] <> #0) then
    // Low und High benutzen
    for I := Low(Language) to High(Language) do
      // den PChar Vergleicher benutzen
      if StrComp(Language[I].Name, AName) = 0 then
      begin
        Result := Language[I].Translation;
        // immer den schwaechsten Abbruch waehlen
        Break;
      end;
end;
Die obige Version kommt ohne temporaere Strings aus.

JamesTKirk 3. Sep 2005 14:52

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von JamesTKirk
tommy-lie

Wenn du jetzt noch meinen Namen richtig schreibst... :mrgreen:

Ups... des is mir jetzt aber peinlich... :oops:
Da schau ich mir deinen Namen noch extra genau an, um zu wissen, ob mit oder ohne '-' und dann das...

@Robert Marquardt:
Des StrComp kannte ich noch gar nicht... :?
Und warum sollte man immer den schwächsten Abbruch wählen?

Die Funktion klingt aber gut... Danke :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz