Autor |
Beitrag |
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Di 01.07.03 17:10
Die Frage stelle ich mir eigentlich schon lange und dieses mal stelle ich sie hier. Gemeint ist natürlich der Kommentarkopf einer Prozedur (nicht der Unit).
Mir ist klar, daß jeder es so gestallten kann wie er es Lustig findet. Für die meisten Prozeduren findet man überhaupt keine Beschreibung oder es ist nur eine Kommentarzeile. Ok, eine professionale Prozedur erkennt man daran, daß die selbsterklärend ist und keine Kommentare benötigt  (kleiner Insiderwitz). Ich gebe zu, daß man es bei den Borland-Units noch entschuldigen kann, da jede Prozedur in der Hilfe beschreiben wird. Allerdings geht es hier um normale Units für normale Programme. Ich sehe es ein, daß nicht jede Prozedur in jedem Programm eine derartige Aufmerksamkeit braucht, aber es gibt nun mal Units die allgemein sind und in vielen Programmen verwendet werden. Da bringt es schon was, wenn man die Prozeduren/Funktionen etwas besser beschreibt.
Also zeigt mal welche Prozedurköpfe ihr so kennt. Gemeint sind natürlich Köpfe die alle Informationen enthalten, also z.B. was die Prozedur/Funktion tut, welche Parameter sie hat usw. Natürlich kenne ich auch zwei oder drei Köpfe, die sind aber derart unterschiedlich, daß sie fast nichts gemeinsames haben. Deshalb gehe ich davon aus, daß es zig verschiedene Arten gibt die auch verschiede Menge an Informationen liefern. So gibt es welche, die zwar die Parameter beschreiben, aber sonst nichts, bei anderen gibt es dafür eine Versionsnummer und sogar eine History der Prozedur.
Also, ich bitte um Beteidigung. Würde mich wirklich interesieren was es da gibt.
_________________ Popov
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 01.07.03 17:50
Procedur-Header:
Delphi-Quelltext
Header der Hauptunit:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
|
|
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Di 01.07.03 18:05
Hi,
hab mal ne frage...
(Benutze btw nahezu keinerlei Kommentare)
Delphi-Quelltext
Procedure.. da steht der Name der Procedure... der is doch sowieso klar...?? Genauso wie Arguments und Result, erkennt man doch sofort wenn man die Procedure anguckt *guckt misstrauisch*
Der Author.. ok, das is hilfreich wenn mehrere Leute an einem Projekt arbeiten oder die Unit veröffentlicht wird etc.. damit man halt weiß an wen man sich wenden muß
und Purpose... wenn man da nich nen Roman hinschreibt is das doch auch überflüssig, oder??? Denn man kann den Proceduren-Namen doch so wählen das er selbsterklärend ist.
Deswegen frage ich mich bei solchen "Headern" immer.. welchen Zweck haben die, ausser das sie (in meinen Augen) den Code sehr unübersichtlich machen..?? (Ok, evtl is das geschmacks/gewöhnungssache, denn ich wette Luckie fände Code ohne diese Header sehr unübersichtlich  )
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 01.07.03 18:26
Naja, ich wähle meine Prozedur und Funktionsnamen relativ kurz, da ist es schon manchmal hilfreich, wenn man den Zwecknoch mal etwas ausführlicher schreiben kann.
Diese Funktion, die ich als Beispiel gepostet habe erfüllt nämlich so gesehen mehrere Zwecke. Sie checkt nicht nur, ob der Rechner online ist, sondern schreibt, wenn offline gegegangen wird das Protokoll.
|
|
Popov 
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Di 01.07.03 19:09
Aya hat folgendes geschrieben: | Denn man kann den Proceduren-Namen doch so wählen das er selbsterklärend ist. |
Glaubst du wirklich?
Das mit dem selbsterklärenden Code war nur ein Witz. Glaubst du, daß du von Funktionsnamen aus den Sinn der Funktion schließen kannst? Ok, ich hab in einer Unit die Funktion "GetChar". Wozu ist die Funktion gut. Mehr sage ich zu der Funktion nicht. Du solltes bedenken, daß man ein Programm nach zwei Jahren wieder auspackt und weiter drann arbeitet. Bist du sicher, daß du dann immer noch weißt wozu "GetChar" gut ist. Erschwerend kommt dazu, daß es gleich davor die "ReadChar" Funktion gibt  .
Mal erst, glaubst du, daß du in ein wichtiges Programm, daß du über Jahre pflegst, ohne Kommentare und Prozedurbeschreibungen auskommst?
_________________ Popov
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Di 01.07.03 19:10
Die "Arguments" zeile kann man sich doch sparen. Die stehen auch im Prozedurkopf. Also warum doppelt? Das selbe gilt auch für Result.
_________________ Ist Zeit wirklich Geld?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 01.07.03 19:13
Aber so kann man die Argumente und den Rückgabewert noch kommentieren. Und das ist übersichtlicher als mit Geschweiftenklammen den Kommentar in die Argumentenliste reinzuschreiben. 
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mi 02.07.03 08:59
Popov hat folgendes geschrieben: | Aya hat folgendes geschrieben: | Denn man kann den Proceduren-Namen doch so wählen das er selbsterklärend ist. |
Glaubst du wirklich?
Das mit dem selbsterklärenden Code war nur ein Witz. Glaubst du, daß du von Funktionsnamen aus den Sinn der Funktion schließen kannst? Ok, ich hab in einer Unit die Funktion "GetChar". Wozu ist die Funktion gut. Mehr sage ich zu der Funktion nicht. Du solltes bedenken, daß man ein Programm nach zwei Jahren wieder auspackt und weiter drann arbeitet. Bist du sicher, daß du dann immer noch weißt wozu "GetChar" gut ist. Erschwerend kommt dazu, daß es gleich davor die "ReadChar" Funktion gibt .
|
Hi,
wenn DU deine Procedure GetChar nennst, obwohl sie z.B. nen Bild zeichnet, dann hat natürlich niemand ne ahnung was diese Procedure macht.
Ich habe in meinem Code eine feste struktur, welche nie geändert wird... somit brauche ich auch nie irgendwelche Kommentare... und ich habe keinerlei probleme mich in ein Programm welches ich vor 2 Jahren geschrieben habe innerhalb von 2-3min reinzufinden.
Aber ich nenne eine Procedure die z.B. ein Bild halb transparent macht nich irgendwie "Blablubb" sondern "MakeImageTransparent". So kommen zwar u.U. recht lange Proceduren/Variablen Namen zu stande, allerdings... wen stört das schon???
Mehr Tipp Arbeit isses dank CodeInsight auchnet
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 02.07.03 09:29
Ich hab damit schon schlimme Erfahrungen gemacht: Ich habe während meines Seminarkurses einen Vokabeltrainer programmiert (wurde auch gut bewertet  ).
Vor einem Jahr habe ich dann gedacht, komm, jetzt kramste das Teil mal wieder raus und machst es erstmal bereit zur Veröffentlichung..... denkste, ich hab nix mehr geblickt, was ich da gemacht habe und bin zum Schluss gekommen, dass ich es wahrscheinlich schneller halb neu programmiert hätte, wie da jetzt wieder reinzuarbeiten.
Denn die Programmierweise ändert sich, auch wenn man denkt, man hat einen festen Stil, je mehr Erfahrung man hat, desto eher unterscheidet sich sein Stil von früher. Und man lernt IMMER mehr.
Seitdem mache ich vor jede Prozedur eine kleine Kommentarzeile, die beschreibt (in Kurzform natürlich), was die Prozedur macht und in jeder Prozedur habe ich dann Blöcke, wenn sie etwas größer ist, die auch wieder kommentiert sind.
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mi 02.07.03 10:35
Hi,
sicherlich ändert sich die Programmierweise, nen Programm was ich vor knapp 2 Jahren als ich Delphi angefangen habe gemacht habe, würde ich heute komplett anders programmieren...
Aber trotzdem weiß ich auch nach 2 Jahren noch ziemlich genau was ich damals gemacht habe, und vorallem was ich mir damals bei dem und dem gedacht habe.
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.07.03 10:54
Das ist ein Thread, in dem alle Recht haben.  Das ganze kommt auch auf die Größe des Projektes an und wieviele da mitmachen. Bei mir wäre es unmöglich, überall Autor usw. hinzuschreiben. Das würde bei tausenden Prozeduren länger dauern, als die reine Tiparbeit des Codes und wäre somit unzumutbar.
Hinzu kommen noch ganze Zeilen von
Quelltext 1:
| ------------------------------------------------------------------ |
Quelltext 1:
| *********************************************** |
usw., was die Dateien aufbläht. Mit Zip usw. macht das zwar nicht viel aus, aber schnell mal 30 Dateien auf eine Diskette kopieren, könnte wegen solcher Geschichten scheitern. Deshalb gehe ich den goldenen Mittelweg, wie im Leben eben üblich  :
1. aussagekräftige Namen für alles, nicht einfach nur Form1 etc.
2. beim kleinsten Zweifel über den Sinn einer Prozedur/Parametern: Kommentar
Also eher so wie Aya es macht.
Aya hat folgendes geschrieben: | (Benutze btw nahezu keinerlei Kommentare) |
 So faul bin ich aber dennoch nicht. Aya, das kannst Du doch nicht machen!!! Das mußt Du Dir dringend abgewöhnen. 
_________________ Gruß
Hansa
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mi 02.07.03 11:15
hansa hat folgendes geschrieben: | Aya hat folgendes geschrieben: | (Benutze btw nahezu keinerlei Kommentare) |
So faul bin ich aber dennoch nicht. Aya, das kannst Du doch nicht machen!!! Das mußt Du Dir dringend abgewöhnen.  |
Ich finde einfach das viele Kommentare einen Sourcecode extrem unübersichtlich machen... das geht mir bei Codes die ich mir runterlade um was draus zu lernen genauso... am anfang werden erstmal alle Kommentare rausgeschmissen damit aus 10Seiten Code 3 Seiten werden...
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mi 02.07.03 11:26
lol, ich finde eine procedure sollte so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure SetWindowsFullBild; begin if ...... then begin .... end; end; |
das wäre eingetlich der optimale procenduren kopf... oder nicht ?
ich finde das der name der funktion bzw. der procedur immer selbsterklärend sein muss und auch die parametern in der proceudure/funktion.....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mi 02.07.03 11:32
mimi hat folgendes geschrieben: | lol, ich finde eine procedure sollte so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure SetWindowsFullBild; begin if ...... then begin .... end; end; | |
und wieso ist es so dermaßen wichtig zu wissen wann die Procedure geschrieben wurde, wann sie geändert wurde und ob z.B. ein Bug behoben is??? *guckt misstrauisch*
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.07.03 11:33
_________________ Gruß
Hansa
|
|
patrick
      
Beiträge: 1481
WIN2k, WIN XP
D6 Personal, D2005 PE
|
Verfasst: Mi 02.07.03 12:32
meins sieht (bei großen projekten) so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure tform1.aussagekräftiger_name(sinvolle variable:string);
var... begin ... |
_________________ Patrick
im zweifelsfall immer das richtige tun!!!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 02.07.03 13:50
@Hansa:
1. Die Kommenrate landen nicht in der Exe, sie vergrößern die Exe also nicht. Bzw. auch die Quellcodedateien werden nur unerheblich größer und reiner Text läßt sich immer gut packen.
2. Mit den GExperts ist das für mich nur ein Tastendruck und alles steht so da, ich muß nur noch den Purpose ausfüllen.
@Aya:
Datum und was und wann zu letzt geändert kann manchmal ganz wichtig sein, wenn mehrer Personen an einem Projekt arbeiten.
Und du würdest alle Kommentare rausschmeißen?
Gut, dann pass mal auf:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| program xxxxxxxx;
uses Windows, ntddk in 'ntddk.pas';
{$R res\Image.res}
function Protect(Characteristics: ULONG): ULONG; const Mapping: array [0..7] of ULONG = ( PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE, PAGE_EXECUTE_READWRITE ); begin Result := Mapping[Characteristics shr 29]; end;
type PImageSectionHeaders = ^TImageSectionHeaders; TImageSectionHeaders = array [0..95] of TImageSectionHeader; var ProcessInfo: TProcessInformation; StartupInfo: TStartupInfo; Success: Boolean; Context: TContext; BaseAddress: Pointer; BytesRead: DWORD; Resource: Pointer; NtHeaders: PImageNtHeaders; BytesWritten: DWORD; Sections: PImageSectionHeaders; i: ULONG; OldProtect: ULONG; begin FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := SizeOf(TStartupInfo); if CreateProcess(nil, PChar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartupInfo, ProcessInfo) then begin Success := False; try Context.ContextFlags := CONTEXT_INTEGER; if GetThreadContext(ProcessInfo.hThread, Context) and ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8), @BaseAddress, SizeOf(BaseAddress), BytesRead) and (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) then begin Resource := LockResource( LoadResource(0, FindResource(0, 'Image', 'EXE'))); if Assigned(Resource) then begin NtHeaders := PImageNtHeaders( Cardinal(Resource) + Cardinal(PImageDosHeader(Resource)._lfanew)); BaseAddress := ntddk.VirtualAllocEx(ProcessInfo.hProcess, Pointer(NtHeaders.OptionalHeader.ImageBase), NtHeaders.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); if Assigned(BaseAddress) and WriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Resource, NtHeaders.OptionalHeader.SizeOfHeaders, BytesWritten) then begin Sections := PImageSectionHeaders(ImageFirstSection(NtHeaders)); for i := 0 to NtHeaders.FileHeader.NumberOfSections - 1 do if WriteProcessMemory(ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Pointer(Cardinal(Resource) + Sections[i].PointerToRawData), Sections[i].SizeOfRawData, BytesWritten) then ntddk.VirtualProtectEx(ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Sections[i].Misc.VirtualSize, Protect(Sections[i].Characteristics), OldProtect); if WriteProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8), @BaseAddress, SizeOf(BaseAddress), BytesWritten) then begin Context.Eax := ULONG(BaseAddress) + NtHeaders.OptionalHeader.AddressOfEntryPoint; Success := SetThreadContext(ProcessInfo.hThread, Context); end; end; end; end; finally if not Success then TerminateProcess(ProcessInfo.hProcess, 0) else ResumeThread(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; end; end. |
Deiner Aussage nach müßtest du ja ohne probleme verstehen, was das Programm macht oder?
Der Vollständigkeit halber:
ntddk.pas:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219:
| unit ntddk;
interface
uses Windows;
type HANDLE = THandle; PVOID = Pointer; LPVOID = Pointer; LONG_PTR = Integer; ULONG_PTR = Cardinal; NTSTATUS = Longint; SIZE_T = Cardinal;
const IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16; IMAGE_SIZEOF_SHORT_NAME = 8;
type PImageDosHeader = ^TImageDosHeader; TImageDosHeader = packed record e_magic : Word; e_cblp : Word; e_cp : Word; e_crlc : Word; e_cparhdr : Word; e_minalloc: Word; e_maxalloc: Word; e_ss : Word; e_sp : Word; e_csum : Word; e_ip : Word; e_cs : Word; e_lfarlc : Word; e_ovno : Word; e_res : array [0..3] of Word; e_oemid : Word; e_oeminfo : Word; e_res2 : array [0..9] of Word; _lfanew : Longint; end;
PImageFileHeader = ^TImageFileHeader; TImageFileHeader = packed record Machine : Word; NumberOfSections : Word; TimeDateStamp : DWORD; PointerToSymbolTable: DWORD; NumberOfSymbols : DWORD; SizeOfOptionalHeader: Word; Characteristics : Word; end;
PImageDataDirectory = ^TImageDataDirectory; TImageDataDirectory = record VirtualAddress: DWORD; Size : DWORD; end;
PImageOptionalHeader = ^TImageOptionalHeader; TImageOptionalHeader = packed record Magic : Word; MajorLinkerVersion : Byte; MinorLinkerVersion : Byte; SizeOfCode : DWORD; SizeOfInitializedData : DWORD; SizeOfUninitializedData : DWORD; AddressOfEntryPoint : DWORD; BaseOfCode : DWORD; BaseOfData : DWORD; ImageBase : DWORD; SectionAlignment : DWORD; FileAlignment : DWORD; MajorOperatingSystemVersion: Word; MinorOperatingSystemVersion: Word; MajorImageVersion : Word; MinorImageVersion : Word; MajorSubsystemVersion : Word; MinorSubsystemVersion : Word; Win32VersionValue : DWORD; SizeOfImage : DWORD; SizeOfHeaders : DWORD; CheckSum : DWORD; Subsystem : Word; DllCharacteristics : Word; SizeOfStackReserve : DWORD; SizeOfStackCommit : DWORD; SizeOfHeapReserve : DWORD; SizeOfHeapCommit : DWORD; LoaderFlags : DWORD; NumberOfRvaAndSizes : DWORD; DataDirectory : array [0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES-1] of TImageDataDirectory; end;
PImageNtHeaders = ^TImageNtHeaders; TImageNtHeaders = record Signature : DWORD; FileHeader : TImageFileHeader; OptionalHeader: TImageOptionalHeader; end;
PImageSectionHeader = ^TImageSectionHeader; TImageSectionHeader = packed record Name : array [0..IMAGE_SIZEOF_SHORT_NAME-1] of Byte; Misc : record case Integer of 0: (PhysicalAddress: DWORD;); 1: (VirtualSize : DWORD;); end; VirtualAddress : DWORD; SizeOfRawData : DWORD; PointerToRawData : DWORD; PointerToRelocations : DWORD; PointerToLinenumbers : DWORD; NumberOfRelocations : Word; NumberOfLinenumbers : Word; Characteristics : DWORD; end;
function ImageFirstSection(ntheader: PImageNtHeaders): PImageSectionHeader;
function VirtualAllocEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flAllocationType: DWORD; flProtect: DWORD): LPVOID; stdcall; function VirtualProtectEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL; stdcall;
function ZwUnmapViewOfSection(ProcessHandle: HANDLE; BaseAddress: PVOID): NTSTATUS; stdcall;
const ntdll = 'ntdll.dll';
implementation
function ImageFirstSection(ntheader: PImageNtHeaders): PImageSectionHeader; begin Result := PImageSectionHeader( ULONG_PTR(@ntheader.OptionalHeader) + ntheader.FileHeader.SizeOfOptionalHeader); end;
type TFNVirtualAllocEx = function(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flAllocationType: DWORD; flProtect: DWORD): LPVOID; stdcall;
var FNVirtualAllocEx: TFNVirtualAllocEx;
function VirtualAllocEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flAllocationType: DWORD; flProtect: DWORD): LPVOID; stdcall; begin Result := nil; if not Assigned(FNVirtualAllocEx) then FNVirtualAllocEx := TFNVirtualAllocEx( GetProcAddress(GetModuleHandle(kernel32), 'VirtualAllocEx')); if not Assigned(FNVirtualAllocEx) then SetLastError(ERROR_CALL_NOT_IMPLEMENTED) else Result := FNVirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect); end;
type TFNVirtualProtectEx = function(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL; stdcall;
var FNVirtualProtectEx: TFNVirtualProtectEx;
function VirtualProtectEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T; flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL; stdcall; begin Result := False; if not Assigned(FNVirtualProtectEx) then FNVirtualProtectEx := TFNVirtualProtectEx( GetProcAddress(GetModuleHandle(kernel32), 'VirtualProtectEx')); if not Assigned(FNVirtualProtectEx) then SetLastError(ERROR_CALL_NOT_IMPLEMENTED) else Result := FNVirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect, lpflOldProtect); end;
type TFNZwUnmapViewOfSection = function(ProcessHandle: HANDLE; BaseAddress: PVOID): NTSTATUS; stdcall;
var FNZwUnmapViewOfSection: TFNZwUnmapViewOfSection;
function ZwUnmapViewOfSection(ProcessHandle: HANDLE; BaseAddress: PVOID): NTSTATUS; stdcall; const STATUS_NOT_IMPLEMENTED = NTSTATUS($C0000002); begin if not Assigned(FNZwUnmapViewOfSection) then FNZwUnmapViewOfSection := TFNZwUnmapViewOfSection( GetProcAddress(GetModuleHandle(ntdll), 'ZwUnmapViewOfSection')); if not Assigned(FNZwUnmapViewOfSection) then Result := STATUS_NOT_IMPLEMENTED else Result := FNZwUnmapViewOfSection(ProcessHandle, BaseAddress); end;
end. |
Jetzt sag mir doch mal bitte, was das Programm macht. 
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.07.03 13:59
haha, ätsch Aya *fg*, erwischt
@Luckie:
Natürlich belasten die Kommentare nicht die EXE, aber ich habe ein Programm, das paßt haargenau ungezippt auf eine Diskette. Wäre in jeder Unit solch ein Header drin, dann wärs rum mit 1 Diskette.
Außerdem war doch die Frage nach Prozeduren, oder ?? Bei den Units könnte man das schon reinschreiben, warum nicht? Für Luckie der viele Quelltexte veröffentlicht macht das schon Sinn. Im Team natürlich auch, aber nur, wenn jeder "seine eigene" Unit baut.
Ja, und die GEexperts, wo sind die? Die sind bei mir plötzlich weg. Wo sind die denn nur? *grübel* Muß suchen. 
_________________ Gruß
Hansa
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 02.07.03 14:08
Desweiteren Aya, wird dir jeder professionelle Softwareentwickler sagen wie wichtig Kommentare sind. Man soll es nicht übertreiben, aber da wo es nötig ist, sollten uf keinen Fall welche fehlen.
Stell dir vor obiger Verfassen von dem Quellcode würde kündigen. Und jetzt kommt der Chef an und sagt dir: "OK. Dann bauen sie mir noch mal das und das ein und kucken sie mal warum eine AV kommt, wenn man das und das macht." Dann bist du erstmal eine Woche damit beschäftigt rauszufinden was da überhaupt wo passiert.
Obiger Code ist noch sehr kurz. Aber stell dir vor die hätten Word ohne Kommentare programmiert. Oder OpenSource Software für Linux ohne Kommentare, ein Ding der Unmöglichkeit.
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mi 02.07.03 14:11
@Lucki
deshalb sollte man den qullcode auch mit kometraen fühlen da man sonst sich nach 10 jahren nicht mehr im qullcode zurecht findet
aber mal schauen ob aya den code lesese kann *warte ungeduldig* 
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
|