Autor Beitrag
Wiesenbiber
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 11.10.02 22:07 
:oops: Hallo,

ich habe versucht eine Funktion in mein Programm einzubinden, allerdings erhalte ich immer die Fehlermeldung 'Ungenügende Forward- oder External-Deklaration' vom Compiler. Ich kann als Delphi 'Beginner' damit aber nicht viel anfangen und die Hilfe ist auch nicht unbedingt nützlich..
Die Deklaration der Funktion sieht so aus:
ausblenden Quelltext
1:
2:
function RegisterServiceProcess
(dwProcessID, dwType: DWord) : DWord; stdcall;
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 11.10.02 23:17 
Soweit ich weiß, erhält man diese Meldung, wenn die Funktion nicht exakt so implementiert wurde, wie du sie deklariert hast. Also beispielsweise Schreibfehler im Funktionsnamen, oder andere Paramater etc.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Wiesenbiber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 11.10.02 23:32 
Hallo Peter,

danke für die Antwort. In der Delphi Hilfe steht auch drin, dass das mit irgendwelche Schreibfehlern zusammenhängen könnte, aber bis jetzt habe ich diese Funktion nur deklariert aber noch nicht implementiert, der Fehler muss als inner dieser zwei Zeile Code stehen.

_________________
Gruß
Chris
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.10.02 04:29 
Implementier sie mal und dann sehen wir weiter.
Wiesenbiber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 12.10.02 09:00 
@ Luckie

der effekt ist der gleiche

_________________
Gruß
Chris
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 12.10.02 09:03 
Am Besten postest Du mal Deklaration und Implementation. Dann sehen wir ja, ob es da Fehler gibt. Ach ja, sollte die Funktion in der Typdefiniton von TForm1 deklariert sein, dann muss die Implementation so aussehen:

ausblenden Quelltext
1:
function TForm1.RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall;					


MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.10.02 09:14 
Ist das nicht die Funktion zum Verstecken eines Programms unter Windows 9x vor dem Taskmanager? In dem Fall wäre wohl eine Implementierung als Form-bezogene Funktion völlig daneben?!
Hier dürfte die Fehlermeldung wohl eher damit zu tun haben, dass das Programm nicht "weiß", dass das eine Systemfunktion ist, die nicht im Unitcode geschrieben werden muss.

Lösung -

Variante #1, gefunden in der Sparte Sonstiges, von bis11:
ausblenden Quelltext
1:
2:
function RegisterServiceProcess(dwProcessId,dwType:
    dword):Integer;stdcall; external 'kernel32.dll';

Vorteil: ist einfacher; Nachteil: unter NT-Systemen gibt es eine unschöne Fehlermeldung.

Variante #2, die dynamische Methode:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
type
  TRegisterServiceProcess = function(dwProcessId,dwType: dword): integer; stdcall;
var
  RegisterServiceProcess : TRegisterServiceProcess;
  dll : THandle = 0;

{ ... }

initialization
  if(Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
    begin
      dll := LoadLibrary('kernel32.dll');
      if(dll <> 0) then
        begin
          RegisterServiceProcess := GetProcAddress(dll,'RegisterServiceProcess');
          if(@RegisterServiceProcess = nil) then
            begin
              FreeLibrary(dll); dll := 0;
            end;
        end;
    end;
finalization
  if(dll <> 0) then FreeLibrary(dll);
end;

Vorteil: keine Fehlermeldung; Nachteil: ein bisschen mehr Schreibarbeit und vor der Benutzung muss kontrolliert werden, ob die Funktion überhaupt zugewiesen wurde, da das z.B. unter NT, 2000 und XP eben nicht der Fall ist:
ausblenden Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
  if(@RegisterServiceProcess <> nil) then
    RegisterServiceProcess(0,1);
end;
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 12.10.02 09:35 
Wieder was dazu gelernt ... :D

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Wiesenbiber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Sa 12.10.02 14:12 
Titel: @MathiasSimmack
@MathiasSimmack

Ja, ich will mit dieser funktion das Programm vor dem Taskmanager verstecken. Am Liebsten wär es mir sogar wenn ich das unter win9x/NT/W2k/XP machen kann.
Ich habe so wie du den code geschrieben hast versucht die Funktion einzubinden, aber mit 'TRegisterServiceProcess' kann der in der variablen deklaration leider nix anfangen, kann es sein, dass ich bei uses was einbinden muss?
Ach übrigens vielen danke für die tolle lösung!

_________________
Gruß
Chris
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.10.02 14:52 
Titel: Re: @MathiasSimmack
Wiesenbiber hat folgendes geschrieben:
Am Liebsten wär es mir sogar wenn ich das unter win9x/NT/W2k/XP machen kann.

NT, 2000 und XP kennen diese Funktion aber nicht. Deswegen wird´s da nicht klappen.

Zitat:
Ich habe so wie du den code geschrieben hast versucht die Funktion einzubinden, aber mit 'TRegisterServiceProcess' kann der in der variablen deklaration leider nix anfangen, kann es sein, dass ich bei uses was einbinden muss?

Nein. Wenn du den Code wirklich so abgetippt bzw. abkopiert hast, dann funktioniert es tadellos. Den Typ "TRegisterServiceProcess" darfst du allerdings nicht aufrufen. Dafür hast du nach wie vor die Variable "RegisterServiceProcess" (ohne T am Anfang).

Hilfreich wäre, wenn du mal die Fehlermeldung zitierst, damit ich dir sagen kann, wo bei dir der Fehler liegt.
Wiesenbiber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: So 13.10.02 19:40 
Titel: @MathiasSimmack
@MathiasSimmack

Weisst du dann vielleicht eine Möglichket das Prog vor dem Schliessen durch den Taskmanager unter NT/2K/XP zu schützen?

_________________
Gruß
Chris