Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   DLL-Problem (https://www.delphipraxis.net/180886-dll-problem.html)

Pfl 27. Jun 2014 11:21

DLL-Problem
 
Hi ^^

ich habe die Funktionen in eine DLL ausgelagert und wollte diese statisch aufrufen; leider meckert Delphi, aber ich finde die Ursache nicht :oops:

Source der Unit (fehlerhaft) :
Delphi-Quellcode:
var
  Form_main : TForm_main;
  sl : TStringList;
  cstore : string;
  cstore_help : string;
  cStore_activ_infofile : string;

implementation

function GetComputername : string; stdcall; external 'winslip.DLL';
function ExpandEnvStr( const szInput : string ); stdcall;
  external 'winslip.DLL';

{$R *.dfm}


uses
  Unit1,
  Unit3,
  Unit5,
  about,
  uGetWindowsVersion,
  Unit7;

/// <summary>
/// programm beenden und LOG erzeugen
/// </summary>
procedure TForm_main.Beenden1Click( Sender : TObject );
  begin
    if Application.MessageBox
      ( 'Sind Sie sicher, dass Sie den Lizenzmanager verlassen möchten?' + #13 +
      #10 + #13 + #10 + 'Nicht aktivierte Lizenzen gehen verloren!',
      'Domino Sicherheit', mb_ICONQUESTION or mb_YESNO ) = IDYES
    then
      // log sichern
      log.lines.SaveToFile( cstore + '\' + DateTimeToStr( date ) + '.log' );
    Application.Terminate;
  end;
die DLL:

Delphi-Quellcode:
library winslip;

uses
  System.SysUtils,
  System.Classes,
  Winapi.Windows;

{$R *.res}
/// <summary>
/// Es folgen Anweisungen für die Profüng auf Admin-Rechte, sowie die Lizenzierung
/// <p>
/// Administratorrolle (das Programm darf nur ausgeführt werden, sollte
/// der Nutzer der Administratorgruppe angehören);
/// </p>
/// <p>
/// Nutzer, die Schreibrechte in der Registry haben; und/oder in den Anwendsungsdaten
/// </p>
/// </summary>

function IsAdmin : Boolean;
  const
    SECURITY_NT_AUTHORITY : TSIDIdentifierAuthority =
      ( Value : ( 0, 0, 0, 0, 0, 5 ) );
    SECURITY_BUILTIN_DOMAIN_RID = $00000020;
    DOMAIN_ALIAS_RID_ADMINS = $00000220;

  var
    hAccessToken : THandle;
    ptgGroups : PTokenGroups;
    dwInfoBufferSize : DWORD;
    psidAdministrators : PSID;
    x : Integer;
    bSuccess : BOOL;
  begin
    Result := False;
    bSuccess := False;
    ptgGroups := nil;
    psidAdministrators := nil;
    try
      bSuccess := OpenThreadToken(
        GetCurrentThread,
        TOKEN_QUERY,
        True,
        hAccessToken );
      if not bSuccess
      then
      begin
        if GetLastError = ERROR_NO_TOKEN
        then
          bSuccess := OpenProcessToken(
            GetCurrentProcess,
            TOKEN_QUERY,
            hAccessToken );
      end;
      if bSuccess
      then
      begin
        GetMem(
          ptgGroups,
          1024 );
        bSuccess := GetTokenInformation(
          hAccessToken,
          TokenGroups,
          ptgGroups,
          1024,
          dwInfoBufferSize );
        if bSuccess
        then
        begin
          AllocateAndInitializeSid(
            SECURITY_NT_AUTHORITY,
            2,
            SECURITY_BUILTIN_DOMAIN_RID,
            DOMAIN_ALIAS_RID_ADMINS,
            0,
            0,
            0,
            0,
            0,
            0,
            psidAdministrators );
{$R-}
          for x := 0 to ptgGroups.GroupCount - 1 do
            if EqualSid( psidAdministrators, ptgGroups.Groups[ x ].Sid )
            then
            begin
              Result := True;
              Break;
            end;
{$R+}
        end;
      end;
    finally
      if bSuccess
      then
        CloseHandle( hAccessToken );
      if Assigned( ptgGroups )
      then
        FreeMem( ptgGroups );
      if Assigned( psidAdministrators )
      then
        FreeSid( psidAdministrators );
    end;
  end;

// ******************************************************
/// <summary>
/// Anweisungen für das Auslesen des PC-namens aus dem System
/// </summary>
function GetComputername : string;
  var
    dwlength : DWORD;
  begin
    dwlength := 253;
    SetLength(
      Result,
      dwlength + 1 );
    if not Winapi.Windows.GetComputername( pchar( Result ), dwlength )
    then
      raise Exception.create( 'PC-Name konnte nicht ermittelt werden. ' );
    Result := pchar( Result );
  end;

/// <summary>
/// Umgebungsvariablen überprüfen
/// </summary>
/// <returns>
/// STRING/NSSTRING
/// </returns>
/// function ExpandEnvStr(const szInput: string): string;
function ExpandEnvStr( const szInput : string )
  : string;
  const
    MAXSIZE = 32768; // laut PSDK sind 32k das Maximum

  begin
    SetLength(
      Result,
      MAXSIZE );
    SetLength(
      Result,
      ExpandEnvironmentStrings( pchar( szInput ), @Result[ 1 ],
      length( Result ) ) - 1 ); // -1 um abschließendes #0 zu verwerfen
  end;

// **********************************************
// Funktionen exportieren ===> zur Verwendung
exports
  GetComputername;

exports
  IsAdmin;

exports
  ExpandEnvStr;

begin

end.
Ich bin für jede Hilfe dankbar!

Der schöne Günther 27. Jun 2014 11:28

AW: DLL-Problem
 
Also... Ich meine... Er streicht die Zeile sogar extra feuerrot an. Und unten im Fenster "Meldungen" steht sogar, was er hat.

Vorausgesetzt das gepostete ist dein echter Quelltext.

himitsu 27. Jun 2014 13:51

AW: DLL-Problem
 
String in DLL?
> Sowas geht nicht ohne SharedMemory. (oder siehe hoika)

Application und VCL in DLL verwenden?
Sowas geht garnicht. (jedenfalls nicht ohne aufzupassen)
> also muß auch noch die RTTI und vorallem gleichj die ganze RTL/VCL geschared werden, womit das dann auf Laufzeitpackages der RTL/VCL hinausgeht. (da entfällt dann auch das ShareMem, da das hier bereits geshared wird)

hoika 27. Jun 2014 15:05

AW: DLL-Problem
 
Hallo,

oder PChar verwenden, wie es Windows selbst ja auch macht.


Heiko

Sir Rufo 27. Jun 2014 16:59

AW: DLL-Problem
 
@himitsu

Das mit den strings will ich ja unterschreiben (vor allem warum diese lütten Funktionen in der DLL liegen ist mir eh schleierhaft),

aber

wo wird denn in der DLL irgendwo was von der VCL benutzt? Ich sehe da nichts :gruebel:

himitsu 27. Jun 2014 21:14

AW: DLL-Problem
 
Hmmm, wenn ich jetzt nochma über den Code guck, frag ich mich das auch. :stupid:
Mir war irgendwie, ich hätte die Verwendung von dem "Application" dort gesehn.


Nja, was man sich auch noch fragen könnte warum diese funktionen überhaupt in eine DLL sollen?
Die sind ja nun wirklich nicht groß, womit dagegen die gesammte DLL wesentlich mehr Platz verbraucht.
Die Funktionen in eine eigene Unit auszulagern, aber in der EXE zu belassen, sind dagegen eine andere und möglicher Weise gute Idee.

hoika 29. Jun 2014 05:12

AW: DLL-Problem
 
Hallo,

das ganze Stringproblem umgeht man bei Verwendung von WideString.

Heiko

Pfl 15. Jul 2014 00:46

AW: DLL-Problem
 
Ich habe die Strings in PChar umgewandelt; jedoch wirft das Programm nur mit zugriffsverletzungen um sich :roll:

'Zugriffsverletzung bei Adresse 0x0053661 in Modul easl_vcl.exe. Lesen von Adresse 0xFFFFFFEC'.

Ich hab doch die Dlls richtig importiert; auch die exports-Anweisung existiert...

Sir Rufo 15. Jul 2014 01:05

AW: DLL-Problem
 
Zitat:

Zitat von Pfl (Beitrag 1265548)
Ich habe die Strings in PChar umgewandelt; jedoch wirft das Programm nur mit zugriffsverletzungen um sich :roll:

'Zugriffsverletzung bei Adresse 0x0053661 in Modul easl_vcl.exe. Lesen von Adresse 0xFFFFFFEC'.

Ich hab doch die Dlls richtig importiert; auch die exports-Anweisung existiert...

Entweder du schaust dir an, wie das mit den Pointern (Speicher reservieren, wer reserviert, wer gibt wieder frei) funktioniert, oder statt
Delphi-Quellcode:
PChar
nimmst du
Delphi-Quellcode:
WideString
.

Pfl 15. Jul 2014 09:00

AW: DLL-Problem
 
Thank you, Sir ^^ :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.

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