Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL schreiben - Was mach ich falsch? (https://www.delphipraxis.net/18386-dll-schreiben-mach-ich-falsch.html)

Delphi-Coder 17. Mär 2004 19:38


DLL schreiben - Was mach ich falsch?
 
Hallo, ich möchte eine DLL schreiben, die checkt ob ein Programm läuft! Ergebnisse sollen folgende sein:
0 - Programm läuft nicht
1 - Programm läuft
2 - kein Parameter empfangen

Nur, falls es von Interesse ist: Die Dll soll für NSIS sein! Wenn ich sie so, wie sie jetzt ist einbinde liefert sie nur den parameter zurück, den ich an sie übergebe!

Was ist falsch an meinem Quelltext?

Delphi-Quellcode:
library Process;

uses
  ShareMem,
  Windows,
  SysUtils,
  Classes,
  TLHelp32;

{$R *.RES}

function CheckProcess(exe: PChar): Integer;
var
  hSnap: THandle;
  ProcEntry: TProcessEntry32;
  s: String;
  sl : TStringList;
  i : Integer;
begin
if exe <> '' then
begin
  hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnap <> INVALID_HANDLE_VALUE) then
  begin
    sl := TStringList.Create;
    ProcEntry.dwSize := SizeOf(ProcessEntry32);
    if (Process32First(hSnap, ProcEntry)) then
    begin
      s := ProcEntry.szExeFile;
      sl.Add(UPPERCASE(ExtractFileName(s)));

      while Process32Next(hSnap, ProcEntry) do
      begin
        s := ProcEntry.szExeFile;
        sl.Add(UPPERCASE(ExtractFileName(s)));
      end;
    end;
  end;

  for i:=0 to sl.Count-1 do
      if UPPERCASE(exe) = UPPERCASE(sl.Strings[i]) then
         Result := 1
      else
         Result := 0;

  CloseHandle(hSnap);
  sl.free;
end
else
    Result := 2;
end;

exports
    CheckProcess;

begin

end.
Vielen Dank für eure Hilfe im voraus!
Delphi-Coder

kiar 17. Mär 2004 19:52

Re: DLL schreiben - Was mach ich falsch?
 
hallo delphi_coder,

es fehlt die aufrufkonvention siehe:
Zitat:

Nun muss diese Funktion nur noch in das DLL-Grundgerüst eingefügt werden. Zuvor ist aber noch anzumerken, dass es bei DLLs eine Besonderheit gibt: Wenn es möglich sein soll, dass Funktionen oder Prozeduren einer DLL auch von anderen Programmiersprachen genutzt werden können, muss das reservierte Wort stdcall hinter den Funktions- bzw. Prozedurkopf geschrieben werden. In unserm Fall also:
function addiere(zahl1, zahl2: integer): integer; stdcall;

Bei stdcall handelt es sich um eine sog. "Aufrufkonvention". Weitere sind register, cdecl und safecall. Sie unterscheiden sich darin, wie Parameter übergeben werden und ob dabei CPU-Register verwendet werden. Für Aufrufe der Windows-API wird stdcall verwendet; register ist das effizienteste. Auf jeden Fall muss darauf geachtet werden, dass sowohl in der DLL auch beim Aufruf aus einer Anwendung die gleiche Aufrufkonvention verwendet wird.

Delphi-Coder 17. Mär 2004 20:14

Re: DLL schreiben - Was mach ich falsch?
 
Danke für die Antwort! Mit stdcall und safecall hat es gar nicht funktioniert und wenn ich es mit register bzw. cdecl versuche liefert er mir wieder nur den übergebenen Parameter! Bin am verzweifeln! Was mach ich nur falsch?

NicoDE 17. Mär 2004 20:42

Re: DLL schreiben - Was mach ich falsch?
 
Zitat:

Zitat von Delphi-Coder
Danke für die Antwort! Mit stdcall und safecall hat es gar nicht funktioniert und wenn ich es mit register bzw. cdecl versuche liefert er mir wieder nur den übergebenen Parameter! Bin am verzweifeln! Was mach ich nur falsch?

Die exportierten Prozeduren eines NSIS-Plugins haben folgenden Typ:
Delphi-Quellcode:
procedure Foo(const Parent: HWND; const StringSize: LongInt; const Variables: PAnsiChar; const StackTop: Pointer); cdecl;
Das Ergebnis wird dann auf dem NSIS-Stack zurückgegeben.
Sieh Dir am besten das Beispiel unter {$NSIS}/Contrib/ExDLL/ an.

Delphi-Coder 17. Mär 2004 20:53

Re: DLL schreiben - Was mach ich falsch?
 
Ok! Und wie kann ich jetzt die übergebene Variable vom Typ VarConstants mit einem String vergleichen?

SleepyMaster 17. Mär 2004 21:12

Re: DLL schreiben - Was mach ich falsch?
 
[OT]Nur mal ne Frage am Rande: was ist NSIS?[/OT]

fkerber 17. Mär 2004 21:13

Re: DLL schreiben - Was mach ich falsch?
 
Hi!

http://nsis.sourceforge.net/home/

ein Installer


Ciao fkerber

NicoDE 17. Mär 2004 21:19

Re: DLL schreiben - Was mach ich falsch?
 
Zitat:

Zitat von Delphi-Coder
wie kann ich jetzt die übergebene Variable vom Typ VarConstants mit einem String vergleichen?

Wenn Du die NSIS.pas verwendest:
Delphi-Quellcode:
if GetUserVariable(INST_x) = 'foo' then
// bzw.
if PopString() = 'bar' then
Je nach dem wie die Parameter vom NSIS-Skript (Push/$x) übergeben werden.

Delphi-Coder 18. Mär 2004 07:08

Re: DLL schreiben - Was mach ich falsch?
 
Vielen Dank für die Hilfe! Es läuft jetzt! Ich hatte in der for-Schleife noch einen kleinen Fehler drin! :-)

Viele Grüße
Delphi-Coder


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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