Thema: DLL-Problem

Einzelnen Beitrag anzeigen

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