![]() |
Problem bei statischer/dynamischer DLL-Einbindung
Hallo Leute!
Ich habe folgendes Problem: Ich habe eine DLL mit folgender Funktion:
Delphi-Quellcode:
'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...
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; 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... |
Re: Problem bei statischer/dynamischer DLL-Einbindung
Wie sieht denn dein dynamisches Einbinden aus?
|
Re: Problem bei statischer/dynamischer DLL-Einbindung
Da wär erst mal die Funktion 'loaddll':
Delphi-Quellcode:
Sie ist dafür da mehrere DLLs dynamisch zu laden und zusammen mit anderen solchen Funktionen zu verwalten... (is in ner extra Unit)
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; In der Hauptunit steht folgendes:
Delphi-Quellcode:
Hab die unnötigen Stellen rausgelassen :wink:
{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; |
Re: Problem bei statischer/dynamischer DLL-Einbindung
Zitat:
Zitat:
|
Re: Problem bei statischer/dynamischer DLL-Einbindung
Zitat:
Zitat:
|
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:
|
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... |
Re: Problem bei statischer/dynamischer DLL-Einbindung
Zitat:
|
Re: Problem bei statischer/dynamischer DLL-Einbindung
Die Funktion ist ineffizient, da sie heimlich dauernd Strings alloziiert.
Delphi-Quellcode:
Die obige Version kommt ohne temporaere Strings aus.
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; |
Re: Problem bei statischer/dynamischer DLL-Einbindung
Zitat:
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. |
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