AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL-Problem

Ein Thema von Pfl · begonnen am 27. Jun 2014 · letzter Beitrag vom 15. Jul 2014
Antwort Antwort
Pfl

Registriert seit: 5. Jun 2012
Ort: Berlin
65 Beiträge
 
Delphi XE6 Architect
 
#1

DLL-Problem

  Alt 27. Jun 2014, 12:21
Hi ^^

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

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!
Friedrich
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: DLL-Problem

  Alt 27. Jun 2014, 12:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#3

AW: DLL-Problem

  Alt 27. Jun 2014, 14:51
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Jun 2014 um 22:11 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: DLL-Problem

  Alt 27. Jun 2014, 16:05
Hallo,

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


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: DLL-Problem

  Alt 27. Jun 2014, 17:59
@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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#6

AW: DLL-Problem

  Alt 27. Jun 2014, 22:14
Hmmm, wenn ich jetzt nochma über den Code guck, frag ich mich das auch.
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: DLL-Problem

  Alt 29. Jun 2014, 06:12
Hallo,

das ganze Stringproblem umgeht man bei Verwendung von WideString.

Heiko
Heiko
  Mit Zitat antworten Zitat
Pfl

Registriert seit: 5. Jun 2012
Ort: Berlin
65 Beiträge
 
Delphi XE6 Architect
 
#8

AW: DLL-Problem

  Alt 15. Jul 2014, 01:46
Ich habe die Strings in PChar umgewandelt; jedoch wirft das Programm nur mit zugriffsverletzungen um sich

'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...
Friedrich
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: DLL-Problem

  Alt 15. Jul 2014, 02:05
Ich habe die Strings in PChar umgewandelt; jedoch wirft das Programm nur mit zugriffsverletzungen um sich

'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 PChar nimmst du WideString .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Pfl

Registriert seit: 5. Jun 2012
Ort: Berlin
65 Beiträge
 
Delphi XE6 Architect
 
#10

AW: DLL-Problem

  Alt 15. Jul 2014, 10:00
Thank you, Sir ^^
Friedrich
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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