AGB  ·  Datenschutz  ·  Impressum  







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

Funktion aus DLL einbinden

Ein Thema von RandomDD · begonnen am 22. Aug 2016 · letzter Beitrag vom 22. Aug 2016
Antwort Antwort
RandomDD

Registriert seit: 11. Aug 2016
42 Beiträge
 
#1

Funktion aus DLL einbinden

  Alt 22. Aug 2016, 01:09
Ich tu mich gerade ein bisschen schwer dabei, eine einzelne Funktion aus einer DLL in meine DPR-Datei einzubinden.
Ich benötige nur ShellExecute und möchte wirklich ungern die komplette ShellAPI einbinden.

Wie binde ich diese eine einzelne Funktion ein?

Das hier funktioniert nicht

Delphi-Quellcode:
{$R *.res}

function ShellExecute; external 'shell32.dllname 'ShellExecuteA';
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Funktion aus DLL einbinden

  Alt 22. Aug 2016, 02:51
Kurze Google oder Forensuche: https://www.delphi-treff.de/tutorial...pascal/dlls/6/

Oder: http://michael-puff.de/Programmierun...ch_laden.shtml

Delphi-Quellcode:
type
  TShellexecute = function(hWnd: HWND; Operation, FileName, Parameters,
    Directory: PChar; ShowCmd: Integer): HINST; stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var
  hLib: cardinal;
  MyShellExecute: TShellexecute;
begin
  hLib := LoadLibrary('shell32.dll');
  if hLib <> 0 then
  begin
    @MyShellexecute := GetProcAddress(hLib, 'ShellExecuteA');
    if not Assigned(MyShellexecute) then
    begin
      RaiseLastOSError;
      exit;
    end;
  end
  else
  begin
    RaiseLastOSError;
    exit;
  end;
  MyShellexecute(Form1.Handle, 'open', 'Notepad.exe', nil, nil, SW_NORMAL);
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
hoika

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

AW: Funktion aus DLL einbinden

  Alt 22. Aug 2016, 05:22
Hallo,
durch Einbinden einer Unit wird nicht die komplette Unit in die Exe reinkompiliert.
Der Linker schmeißt nicht benutzte Funktionen raus.

Der Code von Luckie ist natürlich trotzdem kleiner ...
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Funktion aus DLL einbinden

  Alt 22. Aug 2016, 08:55
Alternativ zu dem was Luckie gepostet hat (dynamische Bindung) gibt es noch die etwas weniger aufwendigere statische Bindung:
Delphi-Quellcode:
function Shellexecute(hWnd: HWND; Operation, FileName, Directory: PChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dllname 'ShellExecuteA';

procedure TForm1.Button1Click(Sender: TObject);
begin
  Shellexecute(Form1.Handle, 'open', 'Notepad.exe', nil, nil, SW_NORMAL);
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.851 Beiträge
 
Delphi 12 Athens
 
#5

AW: Funktion aus DLL einbinden

  Alt 22. Aug 2016, 09:28
Beide Quelltexte sind so nicht korrekt, da sie nicht unter allen Delphiversionen funktionieren.
Korrekt wäre:
Delphi-Quellcode:
{$IFDEF UNICODE}
function Shellexecute(hWnd: HWND; Operation, FileName, Directory: PWideChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dllname 'ShellExecuteW';
{$ELSE}
function Shellexecute(hWnd: HWND; Operation, FileName, Directory: PAnsiChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dllname 'ShellExecuteA';
{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Shellexecute(Form1.Handle, 'open', 'Notepad.exe', nil, nil, SW_NORMAL);
end;
Denn PChar ist je nach Delphiversion PAnsiChar oder PWideChar. Deshalb ist es falsch den Metatyp PChar bei API-Deklarationen zu benutzen.

Wenn die oben geposteten Quelltexte unter Delphi 2009 oder höher benutzt würden, würde es einen Fehler geben, da nur das erste Zeichen an die Ansi-deklarierte Funktion übergeben würde.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Funktion aus DLL einbinden

  Alt 22. Aug 2016, 12:03
PChar darf man gern verwenden, wenn die "Funktion" wirklich dynamisch ist.
Delphi-Quellcode:
function Shellexecute(hWnd: HWND; Operation, FileName, Directory: PChar; ShowCmd: Integer): HINST; stdcall;
  external 'shell32.dllname {$IFDEF UNICODE}'ShellExecuteW'{$ELSE}'ShellExecuteA'{$ENDIF};
Aber grundsätzlich stimmt es schon, bei den meisten WinAPIs -> xxxA mit PAnsiChar, xxxW mit PWideChar und xxx mit PChar (wird in den C++-Headern auch so gemacht und die Delphi-Headerübersetungen selber machen das auch schon länger so)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Funktion aus DLL einbinden

  Alt 22. Aug 2016, 13:45
Beide Quelltexte sind so nicht korrekt, da sie nicht unter allen Delphiversionen funktionieren.
Der Quellcode ist entstanden, als man bei Delphi noch nicht mal wusste, was Unicode überhaupt ist. Und etwas als falsch zu bezeichnen, weil der Code unter neuen Delphi Versionen so nicht mehr läuft, finde ich etwas dreist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 14:48 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 by Thomas Breitkreuz