Delphi-PRAXiS

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

tommie-lie 3. Sep 2005 15:11

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

Zitat von JamesTKirk
Da schau ich mir deinen Namen noch extra genau an, um zu wissen, ob mit oder ohne '-' und dann das...

shit happens ;-)

Zitat:

Zitat von JamesTKirk
Und warum sollte man immer den schwächsten Abbruch wählen?

Weil es besserer Stil ist, nicht die Holzhammer-Methode zu benutzen. break verlässt nur die Schleife, wenn du später Code anfügst, wunderst du dich nicht, warum er die Funktion komplett verlässt. Der erzeugte Assembler-Code ist sowohl bei deinem, als auch bei Roberts Code identisch.

Robert Marquardt 3. Sep 2005 15:13

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Mit grosser Wahrscheinlichkeit aendert man eine Funktion nach dem ersten Schreiben.
Es kommt dann leicht vor das man Zeilen nach der Schleife einfuegt und annimmt das sie ausgefuehrt werden.
Mit Exit ist das nicht der Fall. An solchen Fehlern gruebelt man lange.
Nimmt man den schwaechsten Abbruch, so werden die Zeilen ausgefuehrt. Fehler fallen dann leichter auf, denn es passiert etwas.

Mist zu langsam.

JamesTKirk 3. Sep 2005 15:20

Re: Problem bei statischer/dynamischer DLL-Einbindung
 
Ah ja... des werd ich mir merken... :thumb:
(meine liebste methode für sowas is sonst application.terminate *g* :wink: )

tommie-lie 3. Sep 2005 15:29

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

Zitat von JamesTKirk
(meine liebste methode für sowas is sonst application.terminate *g* :wink: )

Application.Terminate ist immerhin die saubere Methode. Die Funktion halt schon nicht mehr :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.

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