2017-11-20 4 views
-4

Wie Exportiere ich diese Funktion ExecuteFile von ShellExecute in eine DLL. Es funktioniert nicht, wenn ich über DLL anrufe. Allerdings, wenn es ShellExecution direkt im Projekt verwenden, funktioniert esExport-Funktion von ShellExection DLL Delphi

procedure ExecuteFile(FileName:WideString);stdcall; 
begin 
    ShellExecute(0,nil,PChar(FileName),nil,nil,SW_NORMAL); 
end; 

procedure ExecuteFile(FileName:WideString);stdcall; external 'my.dll'; 
+1

Was speziell * nicht funktioniert * bedeuten? Wir können Ihren Bildschirm von hier aus nicht sehen. In welcher Weise ** speziell ** funktioniert ** nicht **? –

+2

Es sieht so aus, als ob Sie zwischen "external" und "exports" verwirrt sind. –

+0

Welche Version von Delphi verwenden Sie auch? 'ExecuteFile()' nimmt einen 'WideString' (warum?) Als Eingabe, also sollten Sie' ShellExecuteW() 'mit' PWideChar' aufrufen, um zu passen. 'ShellExecute()' wird nicht 'ShellExecuteW()' zugeordnet, und 'PChar' wird nicht' PWideChar' zugeordnet, es sei denn, Sie verwenden Delphi 2009+. –

Antwort

1

Sie benötigen zwei separate Projekte, eine für die DLL selbst und einen für das Projekt, das das DLL verwendet.

Im DLL-Projekt verwenden Sie exports, zB:

library my; 

uses 
    Shellapi; 

{$R *.res} 

procedure ExecuteFile(FileName: WideString); stdcall; 
begin 
    ShellExecuteW(0, nil, PWideChar(FileName), nil, nil, SW_NORMAL); 
end; 

exports 
    ExecuteFile; 

begin 
end. 

Dann im raubend Projekt verwenden Sie eine external Erklärung die Funktion aus der DLL zu importieren, zB:

procedure ExecuteFile(FileName: WideString); stdcall; external 'my.dll'; 

Dann kann das Projekt ExecuteFile() wie jede andere Funktion aufrufen, zB:

So stellen Sie sicher, dass der Export von DLL ist:

  1. befindet sich irgendwo auf der OS's search path, vorzugsweise im selben Ordner wie die raubend App.

  2. kompiliert, um die gleiche Bitness (32bit oder 64bit) wie das konsumierende Projekt zu verwenden.

Andernfalls wird es nicht korrekt geladen.

+0

Es hat funktioniert. Er war sich dieser anderen Funktion nicht bewusst. Ich verwende Exportpaar zu einer DLL von einem SDK, das ich entwerfe. Vielen Dank! –