stdcall是什么意思?(30分)

  • 主题发起人 tswhoney
  • 开始时间
T

tswhoney

Unregistered / Unconfirmed
GUEST, unregistred user!
是不是用stdcall申明的函数不用在type中申明?
如:
type
....
private
.....
此处是否不用function socketthread(prt:pointer):integer;stdcall;


implementation
function socketthread(prt:pointer):integer;stdcall;
type
...
begin
...
end;
 
是可以被windows系统调用的意思
 
那在何时调用呢?这段函数没有在任何事件中调用,但却编译执行了,奇怪!!!
 
stdcall是Windows API的标准调用方式。如果不是作成dll被其他程序(特别是用其它工具,如VC开发的)调用,
一般不用加。
 
stdcall是Windows API的标准调用方式,参数是从右向左传递。
 
同意楼上兄弟
 
是一种调用规则,包括参数的压栈顺序、是由调用者负责释放栈还是子程序负责等。
 
stdcall是Windows API的标准调用方式,那在什么时候执行function里面的程序?
 
同意beyzhzj的说法。
 
stdcall是调用方式,stdcall是windows标准调用方式,他的参数在压栈时,是从右到依次左压栈的
dephi默认是从左到右压栈的。

 
谢谢以上各位朋友的回答,但我现在想知道的是该函数在整个程序中是何时被调用的?就是说我的程序中有很多按钮,但都没有调用这个函数,可函数却执行了,是怎么执行的?
 
把你的代码添出来,要不然怎么知道???
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Buttons,winsock;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
SBar: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
const threadcount=5;
lengthconst=4*1024;
defaulthttpport=80;
listenport=7392;
var serversocket:tsocket;
g_critical:trtlcriticalsection;
pathofprogram:string;
stop:boolean;
filenum:integer;

{$define record}

function socketthread(prt:pointer):integer;stdcall;
type bufarray=array[1..lengthconst] of byte;
var
isa:sockaddr_in;
isa_len:integer;
acceptsocket:tsocket;
targethost:pchar;
targetport:integer;
rec:file of byte;
str:string[255];

procedure sendbuf(var buf:bufarray;len:integer;sock:tsocket);
var
client:tsocket;
ca:sockaddr_in;
hostinfo:phostent;
hostaddr:u_long;
i:integer;
begin
client:=socket(pf_inet,sock_stream,ipproto_ip);
if client=invalid_socket then
begin
str:=timetostr(now)+'为连接远程服务器创建socket错误!'+#13#10;
blockwrite(rec,str[1],length(Str));
exit;
end;
ca.sin_family:=pf_inet;
ca.sin_port:=htons(targetport);
hostaddr:=inet_addr(targethost);
if (hostaddr=-1) then
begin
hostinfo:=gethostbyname(targethost);
if hostinfo<>nil then
ca.sin_addr:=(pinaddr(hostinfo.h_addr_list^))^
else
begin
str:=timetostr(now)+'主机'+strpas(targethost)+'转换成ip地址错误!'+#13#10;
strdispose(targethost);
blockwrite(Rec,str[1],length(Str));
closesocket(client);
closesocket(sock);
exit;
end;
end
else ca.sin_addr.S_addr:=hostaddr;
strdispose(targethost);
if connect(client,ca,sizeof(ca))<>0 then
begin
str:=timetostr(now)+'连接服务器端socket错误!'+#13#10;
blockwrite(Rec,str[1],length(Str));
closesocket(client);
closesocket(sock);
exit;
end
else
begin
str:=timetostr(now)+'连接服务器端socket成功!'+#13#10;
blockwrite(Rec,str[1],length(Str));
for i:=1 to len do buf:=not buf;
len:=send(client,buf,len,0);
if len=socket_error then
begin
str:=timetostr(now)+'向服务器端socket发送数据错误!'+#13#10;
blockwrite(Rec,str[1],length(Str));
closesocket(client);
closesocket(sock);
exit;
end;

try
len:=recv(client,buf,lengthconst,0);
while len>0 do
begin
{$ifdef record}
blockwrite(Rec,buf[1],len);

{$endif}
send(sock,buf[1],len,0);
len:=recv(client,buf,lengthconst,0);
end;
finally
if len=socket_error then
str:=timetostr(now)+'从服务器端socket接受数据失败!'+#13#10
else
str:=timetostr(now)+'服务器连接终止!'+#13#10;
blockwrite(rec,str[1],length(str));
closesocket(client);
closesocket(sock);
end;
end;
end;
procedure transmit(sock:tsocket);
function searchsubstr(var buf:bufarray;len:integer):pchar;
var
pstr,tarstr,posstr,resstr:pchar;
begin
pstr:=stralloc(len+1);
pstr:=strlcopy(pstr,pchar(@buf[1]),len);
tarstr:=strpos(pstr,#13#10+'host:');
if tarstr=nil then
begin
strdispose(pstr);
result:=nil;
end
else
begin
tarstr:=tarstr+8;
posstr:=strpos(tarstr,#13#10);
if posstr=nil then
begin
strdispose(pstr);
result:=nil;
exit;
end;
resstr:=stralloc(posstr-tarstr+1);
resstr:=strlcopy(resstr,tarstr,posstr-tarstr);
tarstr:=strscan(resstr,';');
if tarstr<>nil then
begin
tarstr:=tarstr+1;
targetport:=strtoint(strpas(tarstr));
result:=strlcopy(resstr,resstr,tarstr-resstr-1);
end
else
result:=resstr;
strdispose(pstr);
end;
end;
var
buf:bufarray;
len:integer;
begin
len:=recv(sock,buf,lengthconst,0);
if len<=0 then
begin
str:=timetostr(now)+'从客户端socket(*'+inttostr(Sock)+'*)接受数据错误!'+#13#10;
blockwrite(Rec,str[1],length(Str));
closesocket(sock);
exit;
end;
str:=timetostr(now)+'从客户端socket(*'+inttostr(Sock)+'*)接受数据!'+#13#10;
blockwrite(Rec,str[1],length(Str));
{$ifdef record}
blockwrite(rec,buf[1],len);
{$endif}
targetport:=defaulthttpport;
targethost:=searchsubstr(buf,len);
if targethost=nil then
begin
str:=timetostr(now)+'为socket(*'+inttostr(sock)+'*)搜寻目标主机产错误!'+#13#10;
blockwrite(rec,str[1],length(Str));
closesocket(sock);
exit;
end;
sendbuf(buf,len,sock);
end;
begin
entercriticalsection(g_critical);
str:=pathofprogram+inttostr(filenum)+'.txt';
assignfile(Rec,str);
rewrite(Rec);
filenum:=filenum+1;
leavecriticalsection(g_critical);
isa_len:=sizeof(isa);
while not stop do
begin
entercriticalsection(g_critical);
acceptsocket:=accept(serversocket,@isa,@isa_len);
leavecriticalsection(g_critical);
if acceptsocket=invalid_socket then
begin
if not stop then
str:=timetostr(now)+'接受客户段错误!'+#13#10
else
str:=timetostr(now)+'接受停止!'+#13#10;
blockwrite(Rec,str[1],length(Str));
continue;
end
else
begin
str:=timetostr(now)+'接收客户端socket';
blockwrite(Rec,str[1],length(Str));
transmit(acceptsocket);
end;
end;
closefile(rec);
filenum:=filenum-1;
result:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
awsadata:twsadata;
begin
if wsastartup($0101,awsadata)<>0 then
begin
messagebox(handle,'不能启动winsock动态链接库!','错误',mb_ok);
exit;
end;
messagebox(handle,awsadata.szsystemstatus,'winsock动态连接库信息',mb_ok);
pathofprogram:=extractfilepath(paramstr(0));
initializecriticalsection(g_critical);
filenum:=1;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
sa:sockaddr_in;
thandle:hwnd;
i,j:integer;
threadid:dword;
begin
serversocket:=socket(pf_inet,sock_stream,ipproto_ip);
if serversocket=invalid_socket then
begin
messagebox(handle,pchar('创建套接字错误'),pchar('错误'),mb_ok);
exit;
end;
sa.sin_family:=pf_inet;
sa.sin_port:=htons(listenport);
sa.sin_addr.S_addr:=inaddr_any;
if bind(Serversocket,sa,sizeof(sa))=socket_error then
begin
messagebox(handle,pchar('绑定监听socket错误,请检查是否有服务在监听'+inttostr(listenport)+'端口!'),pchar('错误'),mb_ok);
caption:=inttostr(wsagetlasterror);
closesocket(serversocket);
exit;
end;
caption:=caption+'(监听'+inttostr(listenport)+'端口!)';
listen(Serversocket,5);
stop:=false;
for i:=1 to threadcount do
begin
thandle:=createthread(nil,0,@socketthread,nil,0,threadid);
if thandle=0 then
messagebox(handle,pchar('第'+inttostr(i)+'个线程不能创建!'),'提示',mb_ok);
end;
bitbtn2.Enabled:=true;
bitbtn1.Enabled:=false;
sbar.SimpleText:='代理程序执行中!';
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
tim:tdatetime;
succ:boolean;
begin
bitbtn2.Enabled:=false;
bitbtn1.Enabled:=false;
form1.Cursor:=crhourglass;
sbar.SimpleText:='正在停止代理程序,请稍后......';
stop:=true;
succ:=true;
if (closesocket(Serversocket)<>0) then
succ:=false;
tim:=now;
while (now-tim<0.0001)and(filenum>1) do
application.ProcessMessages;
if succ then
messagebox(handle,'关闭套接字成功!','提示',mb_ok)
else
messagebox(handle,'关闭监听socket错误!','提示',mb_ok);
bitbtn3.Enabled:=true;
bitbtn1.Enabled:=true;
sbar.SimpleText:='代理程序停止状态';
form1.Cursor:=crdefault;
caption:='winsock api示例----简单http代理';
application.ProcessMessages;

end;
end.
我想知道function socketthread(prt:pointer):integer;stdcall;在何时编译,因为没有事件调用,还有如何跟踪里面的内容?
 
是个线程,在线程创建以后就被运行,

for i:=1 to threadcount do
begin
thandle:=createthread(nil,0,@socketthread,nil,0,threadid);
if thandle=0 then
messagebox(handle,pchar('第'+inttostr(i)+'个线程不能创建!'),'提示',mb_ok);
end;
bitbtn2.Enabled:=true;
bitbtn1.Enabled:=false;
sbar.SimpleText:='代理程序执行中!';
end;
这段 代码执行后,就执行socketthread.
 
那为何我在函数中设了断点却无法调试呢?
 
应该不会的,你在这段代码的地方设断点。
entercriticalsection(g_critical);
str:=pathofprogram+inttostr(filenum)+'.txt';
assignfile(Rec,str);
rewrite(Rec);
filenum:=filenum+1;
leavecriticalsection(g_critical);
看看你的Debug选项,是不是  集成环境的。


 
各位会员你好:

现本人按成本价销售,每光盘20元,请需要的会员发邮件到:yeleiye@163.com


或汇到:开户行:招商银行武汉分行

    帐号:002731081747

     收款人:叶雷

   寄款后请发邮件确认,写明你的地址。本人收到款后,即寄光盘

1.软件名称: 商舟@海量邮箱窃取大师2002

.软件版本: v1.45

软件大小:1107KB

.软件简介:  

一套专门"窃取"某一域名下海量邮箱的网络邮箱搜集工具。只要输入您想要查找邮箱所在的域名如@yahoo.com等,系统便会采用多线程的工作方式自动从该域名所在的邮件服务器中提取邮件地址,速度奇快,最高可达2000个/分钟,正常速度也可以稳定在1000个/分钟左右。另外,由于本系统采用了独特的"模拟手工发信"技术,所有搜索到的邮箱地址都得到了实时的有效性检验,绝对真实可靠。内置自感应邮件地址生成引擎和批量邮箱自动保持技术,又能最大限度地保证运行此程序电脑的CPU和内存的绝对低消耗,特别适合长时间大批量邮件地址的搜集。想一天之内搜集上百万的邮箱吗?商舟@海量邮箱窃取大师让您梦想成真

2。软件名称: 拓易邮件巡捕

软件版本: v4.15

. 软件简介:  

从搜索引擎或任意网址开始搜索电子邮件,并沿着网址中的链接向下搜索。独有的定向功能,只收集同您业务相关的Email,可分行业分地区搜索。强大的搜索功能,最多500个搜索线程,一个小时能为您新增上千家客户。中英文多语种搜索,即可以搜索国外客户也可以搜索国内客户。从而能让您轻松建立自己的客户源,提升您的竞争力,扩大您的业务量。更为重要的是:邮件巡捕使用起来也非常方便,您只需配置几个参数即可。

3.软件名称: 拓易邮件特快

软件版本: v4.1

软件简介:  

是一款高速直达的专业邮件群发软件。强大的直接发送能力。内建邮件发送服务器,绕过您的SMTP服务器,直接把邮件发给收件人。高速特快。发送结束,收件人即可浏览到该邮件,没有通常利用SMTP服务器发送可能存在的延迟和延误。对一些紧急信息发送尤其重要。快速的群发能力。使用多线程技术,每小时能够发送几万份邮件,适合少量或大量的邮件发送。专业性一对一发送。收件人只能看到自己的邮箱。支持附件。自动删除重复的邮件地址。提供多个邮件列表整合排除功能。例如:能够排除上次已经发送过的邮件,避免重复发送。

4.软件名称: 高速邮址搜寻家

.

软件版本: v2.8

. 软件简介:  

一款专业级集电子邮件地址搜索和自动群发于一体的商务营销软件。您只需选择或输入某邮件服务商的邮件后缀如163.net/ 263.net/china.com/等软件自动连接DNS域名服务器查询该邮件服务器地址,然后采用尝试向服务器发信但实际上并没有发出的方式来判断邮件地址是否存在。如果选择搜索时自动发信,软件可在搜索的同时对找到的有效邮件地址发信。软件采用多线程技术,您可以自己调节线程数量,搜索速度飞快,一个小时能找到上万个真实有效的邮件地址。软件采用字典和穷举的方式搜索电邮并且您可以自己创建字典。搜索过程中不管人为中止或意外中断软件能自动保存搜索进程,下次可以从断点处继续搜索。如启动语音功能,则无论搜索中止或完成软件发出语音信号,便于操作者一边搜索、发送,一边干其它的事情如读书、看电视等。软件界面非常友好且能在任务栏隐藏程序图标,您可让软件在后台搜索/群发电邮,您在前台正常上网冲浪。

5.软件名称: 通科定向邮件地址搜索王

软件版本: v3.12

软件简介:  

高速搜索客户EMAIL地址:对上百家搜索引擎进行商情搜索,找到根源客户EMAIL地址。整合了大量珍贵的国内外商贸资源,直接找到根源客户联系方式。具有搜索范围广、客户定向准、地毯式扫描、搜索层次深、搜索速度快、中断保存功能、交替搜索功能、支持多语种、查询EMAIL对应网页等功能。拥有本套软件,将没有找不到的客户,没有做不成的生意。

6.软件名称: 通科邮件管理王

软件简介:  

高效管理庞大EMAIL地址数据库软件:几分钟内可处理达几百万、上千万(专业版)的EMAIL地址;百分百的去除重复地址;自动删除地址列表中不完善或者带有非法字符(如:“、。等)的EMAIL地址;删除Remove地址;EMAIL地址合并;EMAIL地址分割;可删除某个类型服务器(如:163、sina等等)的EMAIL地址;可删除某个地区(如:台湾tw、香港hk等等)的EMAIL地址;可删除某个行业(如:政府org、教育edu等等)的EMAIL地址(专业版提供);您可筛选出某个类型服务器(如:163、sina等等)的EMAIL地址;可筛选出某个地区(如:台湾tw、香港hk等等)的EMAIL地址;可筛选出某个行业(如:政府org、教育edu等等)的EMAIL地址。这样,您便可从庞大的数据库中提取您所需的EMAIL地址,使您发送EMAIL地址有的放矢。

7.软件名称: 飞龙邮件地址搜索器

.软件简介:  

新版改进系统的适应性,可顺利的在Win9x系统下使用,并清除了某些后缀不能搜索的BUG。本软件是用来搜索电子邮件地址的,采用了三种方式搜索电子邮件地址,三种搜索方式各有优缺点,但优缺点又可以互补。8.软件名称: 登录奇兵

.软件版本: V4.03

.软件简介:  

将您的网站在一个小时内同时自动登录到国内外知名的1300多个搜索引擎上。可以无限次登录。具备发送情况统计报告,登录失败引擎单独重新登录,采用多线程,登录速度快。最大限度提升你的网站浏览量。








 
to yeath:在哪儿设置集成调试?
 
菜单tools->debugger options->找到Integrated debugging
 
顶部