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
 
Pfl

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

DLL-Problem

  Alt 27. Jun 2014, 11: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
 


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 13:54 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