Защо?

17 отговора 176 прегледа
#1

Защо?

Като погледне човек обявите за работа и му става ясно, че повече (едва ли не единствено) програмисти със VC, а тук повечето хора използват Dеlphi - Защо така?

Отговор
в отговор на Az #2

Отг: Защо?

Stoto Delphi e mente i se izpolzwa samo ot USER-i. VC e za seriozni razrabotiki!!!!


Отговор
в отговор на VC #3

Отг: Защо?

Ега ти тъпото обяснение. Това ми прилича на една мисъл която висеше навремето в коридора на ФММ: "Марксизма е всесилен, защото е верен!"
Май забравяш и такива неща като инерцията на големия бизнес. Що ми се струва че и преди съм виждал подобни писаници. Май бяха за това че Linux за нищо не става освен да ентусиастите да си чешат крастата.

Отговор
в отговор на VB #4

Отг: Защо?

Ami to kato otwori duma Linux-a za nisto ne stawa naistina!!!

Отговор
в отговор на VC #5

Отг: Защо?

Delphi не е език за програмиране а среда за разработка. Езика е Object Pascal.

Всеки език си има своите предимства и недостатъци.

PS: Delphi/CBuilder сe използвaт много защото са перфектни среди за разработка на приложения за Windows, a съвсем скоро и за Linux. Там Delphi ще се казва KeLix и ще излези към средата на 2001

Отговор
в отговор на VC #6

Отг: Защо?

Имам силно подозрение, че VC нищо не отбира от сериозно програмиране, а както каза е от user-ите, които искат ама само д...т. Казвам това не за да го обидя, рядко съставям мнение за някого бързо и безвъзвратно, но повярвай VC, досега не съм срещал истински професионален програмист, който да отрича конкуретната на любимата му среда. Так и най-върлите micro$oft-ци имат най-малкото уважението на Borland средата, която до неотдавна беше идинствена алтернатива и искат не искат с нея са прохождали, както и обратното Borland привържениците може да се възмущават срещу нечистите дела на micro$odt, но са длъцни да признаят, че те движат цялата индустрия (не зависимо за добро или не). Виждаш ли, VC, за да станеш истински програмист ще трябва да се научиш да мълчиш за неща които дори не си виждал...просто ела днес на събирането на Borland общество и ще напреднеш много в умствения си и професионален растеж :-)

...may the source be with you :-)

Отговор
в отговор на Az #7

Отг: Защо?

Едно време Fortran се наложи над ALGOL (предшественика на Pascal) от IBM. Не че бе по-добър. Икономическата мощ на IBM направи това. Преди доста време (5-6 год.) приказвах с мой познат, който работи в Канада като програмист и програмира на С. Попитах го за неговата преценка относно популярността на С и на Pascal. Каза ми, че С е американски език, докато Pascal е европейски и това в голяма степен е определящо.
За мен винаги са били безполезни споровете за сравняване между равномощни езици за програмиране. И да не се забравя, че много от качествата на реализирания софтуер зависи и от конкретния компилатор.

Отговор
в отговор на Ученика_anon_anon #8

Отг: Защо?

Да. Точно така. ...но зависи също и от прогрмистите на какво ново са.

Отговор
в отговор на Shveik_anon #9

Отг: Защо?

Ako niakoi mi dade primer za software napisano na VC koeto ne move da se naprawi na Delphi shte mu stisna rykata i publichno shte se otkava da pisha na Delphi.
Ne che iskam da sporim za towa koe e po-dobro ili ne no dosega nikoi ne mi e dal podoben primer.


Отговор
в отговор на delphi sourcer_anon #10

Щом искаш.....

напиши ми VxD driver на Delphi, .. еми няма да стане нали... докато на VC някои драйвери, но не всички могат да се напишат, и се компилират към *.vxd

Като изключим това, СЪН СЪГЛАСЕН С ТЕБ, че с Delphi може да се напряви всичко, АБСОЛЮТНО ВСИЧКО.

PS: по принцип VxD driver се разработват на МАСМ 6.11c и след това се дописват на VC (само това дописване може да стане на Delphi защото става въпрос за писане на *.dll библиотеки)

Отговор
в отговор на Az #11

Отг: Защо?

zashtoto e po-lesno za pisane
no pyk s nego se prawqt trudno raboti, koito ne sa predwideni da se prawqt :)
pyk i ima oshte edna prostotiq, exe-to e golqmo, a na wsichkoto otgore pri startirane, edna Delphi programa se load-wa maj cqlata w pametta (ili maj si zadelqshe cqlata nujna pamet), ta taka e po-byrzo, ama i dosta poveche resources se lapat

Отговор
в отговор на Маниту #12

Отг: Защо?

kade e tova Borland ob6testvo?
A i za6to nqma fenove na CBuilder?

Отговор
в отговор на Shveik_anon #13

VXD na Delphi

unit IngusPacket;

interface

uses windows, Protohdr, Ingusclass;

type
(*
typedef struct tagTRANSPORT_PROTOCOLS {
UCHAR Protocol;
TCHAR szName[20];
TCHAR szDescription[MAX_PATH];
} TRANSPORT_PROTOCOLS, *LPTRANSPORT_PROTOCOLS;
*)

tagTRANSPORT_PROTOCOLS = packed record
Protocol: UCHAR;
szName: array [0..19] of Char;
szDescription: array[0..MAX_PATH-1] of Char;
end;
TRANSPORT_PROTOCOLS = tagTRANSPORT_PROTOCOLS;
LPTRANSPORT_PROTOCOLS = ^TRANSPORT_PROTOCOLS;

(*
//see rfc1340.txt
TRANSPORT_PROTOCOLS transProtos[] = {
{1 , "ICMP", "Internet Control Message" },
{2 , "IGMP", "Internet Group Management"},
{3 , "GGP" , "Gateway-to-Gateway"},
{4 , "IP" , "IP in IP (encasulation)"},
{5 , "ST" , "Stream"},
{6 , "TCP" , "Transmission Control"},
{8 , "EGP" , "Exterior Gateway Protocol"},
{9 , "IGP" , "any private interior gateway"},
{17, "UDP" , "User Datagram"},
{27, "RDP" , "Reliable Data Protocol"},
{28, "IRTP", "Internet Reliable Transaction"},
{29, "ISO-TP4" , "ISO Transport Protocol Class 4"},
{35, "IDPR" , "Inter-Domain Policy Routing Protocol"},
{37, "DDP" , "Datagram Delivery Protocol"},
{38, "IDPR-CMTP", "IDPR Control Message Transport Proto"},
{88, "IGRP" , "IGRP"},
{89, "OSPFIGP" , "OSPFIGP"},
{92, "MTP" , "Multicast Transport Protocol"},
{94, "IPIP" , "IP-within-IP Encapsulation Protocol"},
{97, "ETHERIP" , "Ethernet-within-IP Encapsulation"},
{98, "ENCAP" , "Encapsulation Header"}
};
#define TRANSPROTOS_MAX (sizeof(transProtos)/sizeof(TRANSPORT_PROTOCOLS))
*)
TRANSPORT_PROTOCOLS_ARRAY = array [0..21] of TRANSPORT_PROTOCOLS;
const
transProtos: TRANSPORT_PROTOCOLS_ARRAY = (
(Protocol: 1; szName: 'ICMP'; szDescription: 'Internet Control Message'),
(Protocol: 2; szName: 'IGMP'; szDescription: 'Internet Group Management'),
(Protocol: 3; szName: 'GGP'; szDescription: 'Gateway-to-Gateway'),
(Protocol: 4; szName: 'IP' ; szDescription: 'IP in IP (encasulation)'),
(Protocol: 5; szName: 'ST' ; szDescription: 'Stream'),
(Protocol: 6; szName: 'TCP'; szDescription: 'Transmission Control'),
(Protocol: 8; szName: 'EGP'; szDescription: 'Exterior Gateway Protocol'),
(Protocol: 9; szName: 'IGP'; szDescription: 'any private interior gateway'),
(Protocol: 17; szName: 'UDP'; szDescription: 'User Datagram'),
(Protocol: 27; szName: 'RDP'; szDescription: 'Reliable Data Protocol'),
(Protocol: 28; szName: 'IRTP'; szDescription: 'Internet Reliable Transaction'),
(Protocol: 29; szName: 'ISO-TP4'; szDescription: 'ISO Transport Protocol Class 4'),
(Protocol: 35; szName: 'IDPR' ; szDescription: 'Inter-Domain Policy Routing Protocol'),
(Protocol: 37; szName: 'DDP' ; szDescription: 'Datagram Delivery Protocol'),
(Protocol: 38; szName: 'IDPR-CMTP'; szDescription: 'IDPR Control Message Transport Proto'),
(Protocol: 88; szName: 'IGRP' ; szDescription: 'IGRP'),
(Protocol: 89; szName: 'OSPFIGP' ; szDescription: 'OSPFIGP'),
(Protocol: 91; szName: 'LARP' ; szDescription: 'Multicast Transport Protocol'),
(Protocol: 92; szName: 'MTP' ; szDescription: 'Multicast Transport Protocol'),
(Protocol: 94; szName: 'IPIP' ; szDescription: 'IP-within-IP Encapsulation Protocol'),
(Protocol: 97; szName: 'ETHERIP' ; szDescription: 'Ethernet-within-IP Encapsulation'),
(Protocol: 98; szName: 'ENCAP' ; szDescription: 'Encapsulation Header')
);

const
TRANSPROTOS_MAX = 20; //it's Delphi :)

(*
typedef struct _XICMPProto{
UCHAR icmp_type;
UCHAR icmp_code;
USHORT icmp_cksum;
ULONG filler;
}XICMP_HDR, *PXICMP_HDR;
*)

type
_XICMPProto = packed record
icmp_type: UCHAR;
icmp_code: UCHAR;
icmp_cksum: SHORT;
filler: ULONG;
end;
XICMP_HDR = _XICMPProto;
PXICMP_HDR = ^XICMP_HDR;

(*
typedef struct _XARPProto{
USHORT ar_hwtype;
USHORT ar_prtype;
UCHAR ar_hwlen;
UCHAR ar_prlen;
UCHAR ar_op;
char ar_addr[1];
}XARP_HDR, *XPARP_HDR;
*)

_XARPProto = packed record
ar_hwtype: SHORT;
ar_prtype: SHORT;
ar_hwlen: UCHAR;
ar_prlen: UCHAR;
ar_op: UCHAR;
ar_addr: array[0..0] of Char;
end;

(*
#define ARP_REQUEST 1
#define ARP_REPLY 2
#define RARP_REQUEST 3
#define RARP_REPLY 4
*)
const
ARP_REQUEST = 1;
ARP_REPLY = 2;
RARP_REQUEST = 3;
RARP_REPLY = 4;

type
TIngusIPPacket = class(TIngusPacketBase)
private
FIPProto: integer;
FIPSourceAddr: PChar;
FIPDestAddr: PChar;
FData: PChar;
FpIPHdr: PIP_RHDR;
FIPLength: integer;
protected
public
constructor Create(MacAddr: PChar; uBuffer: PChar); override;
destructor Destroy; override;

property IPProtocol: integer read FIPProto;
property IPHeader: PIP_RHDR read FpIPHdr;
property IPSourceAddr: PChar read FIPSourceAddr;
property IPDestAddr: PChar read FIPDestAddr;
property IPData: PChar read FData;
property IPLength: integer read FIPLength;
end;

TIngusICMPPacket = class(TIngusIPPacket)
private
FIcmpType: UCHAR;
FIcmpCode: UCHAR;
FpIcmpHdr: PXICMP_HDR;
protected
public
constructor Create(MacAddr: PChar; uBuffer: PChar); override;
destructor Destroy; override;

property ICMPHdr: PXICMP_HDR read FpIcmpHdr;
property ICMPType: UCHAR read FIcmpType;
property ICMPCode: UCHAR read FIcmpCode;

end;

TIngusTCPPacket = class(TIngusIPPacket)
private
FSourcePort: SHORT;
FDestPort: SHORT;
FSeq: ULONG;
FAck: ULONG;
FFlag: integer;
FTCPHdr: PTCP_RHDR;
protected
function GetFlag: integer;
public
constructor Create(MacAddr: PChar; uBuffer: PChar); override;
destructor Destroy; override;

property TCPHeader: PTCP_RHDR read FTCPHdr;
property SourcePort: SHORT read FSourcePort;
property DestPort: SHORT read FDestPort;
property SeqNum: ULONG read FSeq;
property AckNum: ULONG read FAck;
property Flag: integer read FFlag;
end;

TIngusUDPPacket = class(TIngusIPPacket)
private
FSourcePort: SHORT;
FDestPort: SHORT;
FUDPHdr: PUDP_RHDR;
public
constructor Create(MacAddr: PChar; uBuffer: PChar); override;
property UDPHeader: PUDP_RHDR read FUDPHdr;
property SourcePort: SHORT read FSourcePort;
property DestPort: SHORT read FDestPort;
end;

implementation


constructor TIngusUDPPacket.Create(MacAddr: PChar; uBuffer: PChar);
begin
inherited Create(MacAddr, uBuffer);
FUDPHdr := PUDP_RHDR(IPData);
FSourcePort := TOUSHORT(@(FUDPHdr^.Source[0]));
FDestPort := TOUSHORT(@(FUDPHdr^.Destination[0]));
end;


function TIngusTCPPacket.GetFlag: integer;
begin
Result := FTCPHdr^.Flags_Rsvd1 and $FC;
if Result <> 0 then
Result := FTCPHdr^.Flags_Rsvd1 div $4; //Shift Right 2 bits
end;

constructor TIngusTCPPacket.Create(MacAddr: PChar; uBuffer: PChar);
begin
inherited Create(MacAddr, uBuffer);
FTCPHdr := PTCP_RHDR(IPData);
FSourcePort := TOUSHORT(@(FTCPHdr^.Source[0]));
FDestPort := TOUSHORT(@(FTCPHdr^.Destination[0]));
FSeq := TOULONG(@(FTCPHdr^.Seq[0]));
FAck := TOULONG(@(FTCPHdr^.Ack[0]));
FFlag := GetFlag;
end;

destructor TIngusTCPPacket.Destroy;
begin
//...
inherited Destroy;
end;


constructor TIngusIPPacket.Create(MacAddr: PChar; uBuffer: PChar);
begin
inherited Create(MacAddr, uBuffer);
FpIPHdr := PIP_RHDR(EthernetData);
FIPSourceAddr := @(FpIPHdr^.Source[0]);
FIPDestAddr := @(FpIPHdr^.Destination[0]);
FData := @(FpIPHdr^.Data[0]);
FIPProto := FpIPHdr^.Protocol;
FIPLength := TOUSHORT(@(FpIPHdr^.Length[0]));
end;

destructor TIngusIPPacket.Destroy;
begin
//...
inherited Destroy;
end;



constructor TIngusICMPPacket.Create(MacAddr: PChar; uBuffer: PChar);
begin
inherited Create(MacAddr, uBuffer);
FpIcmpHdr := PXICMP_HDR(IPData);
FIcmpType := FpIcmpHdr^.icmp_type;
FIcmpCode := FpIcmpHdr^.icmp_code;
end;

destructor TIngusICMPPacket.Destroy;
begin
//...
inherited Destroy;
end;

end.

Отговор
в отговор на delphi sourcer_anon #14

VXD na Delphi

unit Ingusclass;

interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Packet32, Protohdr;

const
MAX_ADAPTER_COUNT = 5;

type
TIngusPacketBase = class;
TPacketDirection = (pdOutput, pdInput, pdPassThrough);
TParsePacketEvent = procedure( nPacketSeq: Longint;
uBuffer: PChar;
nRecvBytes: integer;
sPacket: TIngusPacketBase ) of object;

TIngusPacketBase = class(TObject)
private
FMacAddr: PChar;
FBuffer: PChar;
FEthernetHdr: PETHERNET_HDR;
FPacketDirection: TPacketDirection;
FProtocol: Integer;
FData: PChar;

protected
public
constructor Create(MacAddr: PChar; uBuffer: PChar); virtual;
destructor Destroy; override;

property EthernetProtocol: integer read FProtocol;
property PacketDirection: TPacketDirection read FPacketDirection;
property EthernetHeader: PETHERNET_HDR read FEthernetHdr;
property EthernetData: PChar read FData;

end;

TIngusSnifferThread = class(TThread)
private
FMacAddr: PChar; // FPiette May 12, 1999
FpAdapter: LPADAPTER;
FpPacket: LPPACKET;
FdwRxBytes: DWORD;
FRxPacketSeq: Longint;
FParsePacketEvent: TParsePacketEvent;

protected
public
constructor Create; virtual;
destructor Destroy; override;

procedure Execute; override;
procedure SyncParseEvent;

property MacAddr: PChar read FMacAddr write FMacAddr;
property Adapter: LPADAPTER read FpAdapter write FpAdapter;
property Packet: LPPACKET read FpPacket write FpPacket;
property OnParsePacket: TParsePacketEvent read FParsePacketEvent write FParsePacketEvent;

end;


TAfterGetAdapterDesc = procedure(bStatus: Boolean; sAdapterDesc: string) of object;
TAfterGetMacAddress = procedure(bStatus: Boolean; pMacAddr: PChar) of object;
TAfterSetFilter = procedure(bStatus: Boolean; uFilter: ULONG) of object;

TIngusSniffer = class(TObject)
private
//FuBuffer: array[0..1520] of Char;
FuMac: array[0..5] of UCHAR;
FAdapterDescs: array[0..MAX_ADAPTER_COUNT-1] of ADAPTER_DESC;
FAdapterNames: TStringList;
FAdapterCount: integer;
FpPacket: LPPACKET;
FhAdapter: DWORD;
FbStartSnoop: Boolean;
FParsePacketEvent: TParsePacketEvent;
FIngusThread: TIngusSnifferThread;

FAfterGetAdapterDesc: TAfterGetAdapterDesc;
FAfterGetMacAddress: TAfterGetMacAddress;
FAfterSetFilter: TAfterSetFilter;

protected
procedure GetAdapterNameList;
function GetMacAddr: PChar; // FP 12/05/99

public
constructor Create; virtual;
destructor Destroy; override;

//zero-based index
function StartSnoop(nAdapterIndex: integer): Boolean;
procedure StopSnoop;

property MacAddr: PChar read GetMacAddr; // FP 12/05/99
property AdapterNameList: TStringList read FAdapterNames;
property AdapterCount: integer read FAdapterCount;
property OnParsePacket: TParsePacketEvent read FParsePacketEvent
write FParsePacketEvent;
property OnAfterGetAdapterDesc: TAfterGetAdapterDesc read FAfterGetAdapterDesc
write FAfterGetAdapterDesc;
property OnAfterGetMacAddress: TAfterGetMacAddress read FAfterGetMacAddress
write FAfterGetMacAddress;
property OnAfterSetFilter: TAfterSetFilter read FAfterSetFilter
write FAfterSetFilter;

end;

var
FuBuffer: array[0..1520] of Char;

implementation
uses IngusPacket;

constructor TIngusPacketBase.Create(MacAddr: PChar; uBuffer: PChar);
begin
inherited Create;
FMacAddr := MacAddr;
FBuffer := uBuffer;
FEthernetHdr := PETHERNET_HDR(FBuffer);
FProtocol := TOUSHORT(@(FEthernetHdr^.Protocol[0]));
FData := @(FEthernetHdr^.Data[0]);

//Packet Direction
FPacketDirection := pdPassThrough;
if CompareMem(FMacAddr, @(FEthernetHdr^.Destination[0]), 6) then begin
//Input
FPacketDirection := pdInput;
end
else if CompareMem(FMacAddr, @(FEthernetHdr^.Source[0]), 6) then begin
//Output
FPacketDirection := pdOutput;
end;
end;

destructor TIngusPacketBase.Destroy;
begin
//...
inherited Destroy;
end;

constructor TIngusSnifferThread.Create;
begin
//Initiate vars
FpAdapter := nil;
FpPacket := nil;

inherited Create(True);
end;

destructor TIngusSnifferThread.Destroy;
begin
//...
inherited Destroy;
end;

procedure TIngusSnifferThread.Execute;
begin
if (FpAdapter = nil)or(FpPacket = nil) then exit;

FRxPacketSeq := 0;
while (not Terminated) do begin
PacketReceivePacket(FpAdapter, FpPacket, TRUE, @FdwRxBytes);
if (not Terminated) then
Synchronize(SyncParseEvent);

Inc(FRxPacketSeq);
end;
end;

procedure TIngusSnifferThread.SyncParseEvent;
var
sPacket: TIngusPacketBase;
pEthernetHdr: PETHERNET_HDR;
pIPHeader: PIP_RHDR;
nProto, nIPProto: integer;
begin
if (FpPacket = nil) then exit;

pEthernetHdr := PETHERNET_HDR(@(FpPacket^.Buffer[0]));
nProto := TOUSHORT(@(pEthernetHdr^.Protocol[0]));

case nProto of
//IP
PROTO_IP: begin
pIPHeader := PIP_RHDR(@(pEthernetHdr^.Data[0]));
nIPProto := pIPHeader^.Protocol;

case nIPProto of
//ICMP
1: sPacket := TIngusICMPPacket.Create( FMacAddr, @(FpPacket^.Buffer[0]) );
//TCP
6: sPacket := TIngusTCPPacket.Create(FMacAddr, @(FpPacket^.Buffer[0]));
//UDP
17: sPacket := TIngusUDPPacket.Create(FMacAddr, @(FpPacket^.Buffer[0]));
else
sPacket := TIngusIPPacket.Create(FMacAddr, @(FpPacket^.Buffer[0]));
end;
end;
else
sPacket := TIngusPacketBase.Create( FMacAddr, @(FpPacket^.Buffer[0]) );
end;

//Call Event handler
if Assigned(FParsePacketEvent) then
FParsePacketEvent( FRxPacketSeq, @(FpPacket^.Buffer[0]), FdwRxBytes, sPacket );
sPacket.Free;

end;

procedure TIngusSniffer.GetAdapterNameList;
var
i: integer;
begin
//Get Adapter names
if (PacketGetAdapterNames(@FAdapterDescs[0], MAX_ADAPTER_COUNT, @FAdapterCount) = FALSE) then
begin
//Error....
exit;
end;

for i := 0 to FAdapterCount-1 do begin
FAdapterNames.Add(StrPas(FAdapterDescs.szAdapterDesc));
end;
end;

function TIngusSniffer.GetMacAddr: PChar;
begin
Result := @FuMac; // FP 12/05/99
end;

constructor TIngusSniffer.Create;
begin
inherited Create;

FAdapterNames := TStringList.Create;
//Get Adapter Names
GetAdapterNameList;
FbStartSnoop := FALSE;
end;

destructor TIngusSniffer.Destroy;
begin
if FbStartSnoop then StopSnoop; //Avoid Blue-Screen :)
FAdapterNames.Free;

inherited Destroy;
end;

function TIngusSniffer.StartSnoop(nAdapterIndex: integer): Boolean;
var
i: integer;
begin
Result := False;
if (FbStartSnoop) then exit;
if (nAdapterIndex >= FAdapterCount) then exit;

//Open Adapter
FhAdapter := PacketOpenAdapter(FAdapterDescs[nAdapterIndex].szAdapterName);
if (FhAdapter = 0) then begin
//Error in open adapter...
exit;
end;

//Get Adapter Description
if (PacketAdapterDesc(LPADAPTER(FhAdapter), @FuBuffer[0], sizeof(FuBuffer), @i) = TRUE) then
begin
if Assigned(FAfterGetAdapterDesc) then
FAfterGetAdapterDesc(TRUE, StrPas(@FuBuffer[0]));
end
else begin
//Error
if Assigned(FAfterGetAdapterDesc) then
FAfterGetAdapterDesc(FALSE, '');
end;

//Get Current Mac Address
if (PacketGetAddress(LPADAPTER(FhAdapter), @FuMac[0], 6, @i) = TRUE) then
begin
if Assigned(FAfterGetMacAddress) then
FAfterGetMacAddress(TRUE, @FuMac[0]);
end
else begin
//Error
if Assigned(FAfterGetMacAddress) then
FAfterGetMacAddress(FALSE, nil);
end;

//Select Filter mode
if (PacketSetFilter(LPADAPTER(FhAdapter), NDIS_PACKET_TYPE_PROMISCUOUS) = TRUE) then
begin
if Assigned(FAfterSetFilter) then
FAfterSetFilter(TRUE, NDIS_PACKET_TYPE_PROMISCUOUS);
end
else begin
//Error
if Assigned(FAfterSetFilter) then
FAfterSetFilter(FALSE, NDIS_PACKET_TYPE_PROMISCUOUS);
end;

//Allocate Packet
FpPacket := LPPACKET( PacketAllocatePacket(LPADAPTER(FhAdapter)) );
if (FpPacket = Nil) then begin
//Error...
PacketCloseAdapter(LPADAPTER(FhAdapter));
exit;
end;

//set the packet's buffer and its max. length
PacketInitPacket(FpPacket, @FuBuffer[0], 1520);
FbStartSnoop := TRUE;

//Create Thread
FIngusThread := TIngusSnifferThread.Create; //Create Suspended Thread
FIngusThread.MacAddr := @FuMac[0];
FIngusThread.Adapter := LPADAPTER(FhAdapter);
FIngusThread.Packet := FpPacket;
FIngusThread.OnParsePacket := FParsePacketEvent;
FIngusThread.Resume; //Resume thread -> Execute

Result := TRUE;
end;

procedure TIngusSniffer.StopSnoop;
begin
if not FbStartSnoop then exit;
FIngusThread.Terminate;

//close the underlying adapter
PacketCloseAdapter(LPADAPTER(FhAdapter));
//free packet
PacketFreePacket(FpPacket);
FbStartSnoop := FALSE;

FIngusThread.Free;
end;

end.

Отговор
в отговор на delphi sourcer_anon #15

sledwashtiat molia :)))

koito si misli che ima raboti koito ne mogat da se napishat na delphi

Отговор
в отговор на delphi sourcer_anon #16

Страхотен си. Да а.. от висока класа си.

Вече съм 100% съгурен че за Delphi няма граници.
Наистина, ти ми го доказа нагледно, до сега винаги си задавах въпроса "дали Delphi може всичко", е от днес аз вече знам отговора "Да Delphi е голям и може обсолютно всичко"

До Всички начинаещи: Захващайте се с Delphi без да му мислите, и без това пазара е залят с книги.

PS: много се дразнех, че трябва да пиша VxD на VC.

Отговор
в отговор на delphi sourcer_anon #17

Прати ми ако можеш......

Прати ако можеш един работещ проект на VxD за Delphi (може да е най-простия примерно за клавиатура или джойстик каквото сам решиш)на адрес: flamewords@dir.bg

Предварително ти благодаря.

PS: Да не забравиш допълнителните модули към проекта, без тях няма да мога да го компилирам.

Отговор
в отговор на AcidMemory #18

Отг: Защо?

towa e wqrno 4e na Delphi movesh da napishesh wsi4ko no syshto taka e wqrno 4e C e po gywkawo

taka 4e izwod
koj kwoto hareswa na towa da pishe

Отговор