![]() |
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:
die DLL:
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;
Delphi-Quellcode:
Ich bin für jede Hilfe dankbar!
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. |
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. |
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) |
AW: DLL-Problem
Hallo,
oder PChar verwenden, wie es Windows selbst ja auch macht. Heiko |
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: |
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. |
AW: DLL-Problem
Hallo,
das ganze Stringproblem umgeht man bei Verwendung von WideString. Heiko |
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... |
AW: DLL-Problem
Zitat:
Delphi-Quellcode:
nimmst du
PChar
Delphi-Quellcode:
.
WideString
|
AW: DLL-Problem
Thank you, Sir ^^ :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz