Code: Alles auswählen
library DynamicLibrary;
{$mode objfpc}{$H+}
(*{$modeswitch UNICODESTRINGS}*)
uses
SysUtils
{ you can add units after this };
// Das Unterprogramm der DLL
function convertToUppercase( data: string ): PChar;
var
upperData : string;
begin
upperData := UpperCase( data );
Result := PChar( upperData );
end;
// export function
exports
convertToUppercase;
begin
end.
Code: Alles auswählen
program DllTester;
{$mode objfpc}{$H+}
(*{$modeswitch UNICODESTRINGS}*)
uses
Windows;
function dllFunc: string;
type
// Definition des aufzurufenden Unterprogramms, wie es in der einzubindenden DLL definiert ist
PConvertToUppercase = function( data: string ): PChar; stdcall;
var
// Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
convertToUppercase: PConvertToUppercase;
// Legt einen Handle für den Handle der DLL an
dllHandle: THandle;
begin
// Ermittelt den Handle der zuverwendenden Library
dllHandle := LoadLibrary( PChar( 'DynamicLibrary.dll' ) );
// Prüft, ob das Laden der DLL erfolgreich war
if dllHandle <> 0 then
begin
// Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs zu
// 'convertToUppercase' aus der DLL DLLTest.dll zu.
Pointer( convertToUppercase ) := GetProcAddress( dllHandle, 'convertToUppercase' );
// Prüft, ob eine gültige Adresse zurück gegeben wurde
if @convertToUppercase <> nil then Result := convertToUppercase( PChar( 'hallo welt' ) );
end;
// Freigabe des Arbeitsspeichers
convertToUppercase := nil;
FreeLibrary( dllHandle );
end;
begin
WriteLn( dllFunc );
ReadLn;
end.