Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Programmversion in DLL (https://www.delphipraxis.net/193157-programmversion-dll.html)

sko1 28. Jun 2017 10:01

Programmversion in DLL
 
Hallo,

ich bin am Erstellen einer DLL, dabei ist mir aufgefallen, dass obwohl in den Projektoptionen / Versionsinfo z.B. 1.0.3.0 eingestellt ist (und der Haken bei DLL gesetzt).

Innerhalb der DLL stelle ich dem Aufrufer die Version mit folgendem Code zur Verfügung:

Delphi-Quellcode:
function GetDLLVersion(): PChar; stdcall;
var
  ver: string;
begin
  ver := 'Version : ' + GetCurrentVersion();
  Result := PChar(ver);
end;

Was habe ich übersehen?

Ciao
Stefan

Der schöne Günther 28. Jun 2017 10:03

AW: Programmversion in DLL
 
Uns den Code für dein
Delphi-Quellcode:
GetCurrentVersion()
zu zeigen

Bernhard Geyer 28. Jun 2017 10:13

AW: Programmversion in DLL
 
Delphi-Quellcode:
Result := PChar(ver);
Eine lokale Variable so zu verwenden ist ungünstig.
In deinem Fall wird die Adress nicht gleich überschrieben werden, aber eigentlich zeigt der Pointer nach Verlassen der Funktion auf einen ungültigen Speicherbereich.

jaenicke 28. Jun 2017 10:15

AW: Programmversion in DLL
 
Ist ver leer oder kommt nichts in der Hostanwendung an?

Falls nichts ankommt, dürfte das daran liegen, dass du statt einen Puffer in der Hostanwendung zu reservieren und an die DLL zum Füllen zu übergeben einen Pointer auf eine Zeichenkette zurücklieferst.
Es hat schon einen Grund, dass das niemand sonst so macht. ;-)

Mehr zu dem Thema:
https://stackoverflow.com/questions/...the-delphi-dll

sko1 28. Jun 2017 10:17

AW: Programmversion in DLL
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1375522)
Uns den Code für dein
Delphi-Quellcode:
GetCurrentVersion()
zu zeigen

wird selbstverständlich nachgeholt:

Delphi-Quellcode:
function GetCurrentVersion(): string;
var
  VerInfoSize: DWord;
  VerInfo: Pointer;
  VerValueSize: DWord;
  VerValue: PVSFixedFileInfo;
  Dummy: DWord;
begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do
  begin
    Result := IntTostr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntTostr(dwFileVersionLS shr 16);
    Result := Result + '.' + IntTostr(dwFileVersionLS and $FFFF);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;

Diesen Code nutze ich seit Jahren für die Versionsausgabe in Windows-Exe-Projekten

Die Rückgabe aus der DLL ist "Version : 1.0.0.0" anstelle der erwarteten "1.0.3.0" die im Projekt eingestellt sind.

Ciao
Stefan

Fritzew 28. Jun 2017 10:19

AW: Programmversion in DLL
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1375523)
Delphi-Quellcode:
Result := PChar(ver);
Eine lokale Variable so zu verwenden ist ungünstig.
In deinem Fall wird die Adress nicht gleich überschrieben werden, aber eigentlich zeigt der Pointer nach Verlassen der Funktion auf einen ungültigen Speicherbereich.

Ja das ist total falsch, niemals einen Speiecherbereich so in Dll's übergeben.
Besser:

Delphi-Quellcode:
function getDllVersion(Buffer : Pchar; bufsize : integer) : integer;
begin

// Hier den buffer mit maximal bufsize füllen
//strpcopy oder was auch immer

end;
hat den Vorteil das auch über das Result auf zu kleinen Buffer oder sonstige Problem hingewiesen werden kann

Bernhard Geyer 28. Jun 2017 10:21

AW: Programmversion in DLL
 
ParamStr(0) liefert doch immer den Dateinamen deiner Exe!

sko1 28. Jun 2017 10:23

AW: Programmversion in DLL
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1375528)
ParamStr(0) liefert doch immer den Dateinamen deiner Exe!

stimmt, jetzt wo Du das schreibst wird es mir klar!
... und wie komm ich an die DLL von innerhalb der DLL heraus?

Ciao
Stefan

DeddyH 28. Jun 2017 10:25

AW: Programmversion in DLL
 
Spontan würde ich es mit GetModuleFilename versuchen.

Fritzew 28. Jun 2017 10:25

AW: Programmversion in DLL
 
Zitat:

Zitat von sko1 (Beitrag 1375529)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1375528)
ParamStr(0) liefert doch immer den Dateinamen deiner Exe!

stimmt, jetzt wo Du das schreibst wird es mir klar!
... und wie komm ich an die DLL von innerhalb der DLL heraus?

Ciao
Stefan

So :

Delphi-Quellcode:
function getModuleName: string;
  var
    FileName: array[0..MAX_PATH - 1] of Char;
  begin
    GetModuleFileName(HInstance, FileName, SizeOf(FileName));
    Result := string(FileName);
  end; { DSiRealModuleName }


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.
Seite 1 von 2  1 2      

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