Entwickler-Ecke
Dateizugriff - Ungenügende Forward- oder External-Deklaration
Wiesenbiber - Fr 11.10.02 22:07
Titel: Ungenügende Forward- oder External-Deklaration
: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:
Quelltext
1: 2:
| function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall; |
Christian S. - 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
Wiesenbiber - 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.
Delete - Sa 12.10.02 04:29
Implementier sie mal und dann sehen wir weiter.
Wiesenbiber - Sa 12.10.02 09:00
@ Luckie
der effekt ist der gleiche
Christian S. - 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:
Quelltext
1:
| function TForm1.RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall; |
MfG,
Peter
Delete - 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 [
http://www.auq.de/viewtopic.php?t=2790], von bis11:
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:
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:
Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormCreate(Sender: TObject); begin if(@RegisterServiceProcess <> nil) then RegisterServiceProcess(0,1); end; |
Christian S. - Sa 12.10.02 09:35
Wieder was dazu gelernt ... :D
Wiesenbiber - 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!
Delete - 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 - 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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!