>

线程-delphi断点无效,自动跳过代码

- 编辑:乐百家599手机首页 -

线程-delphi断点无效,自动跳过代码

function GetSmsParams(var SendSmsCnt, HaveNotSendCnt, ReciveSmsCnt,
HaveNotReadSmsCnt: integer): integer; stdcall;
函数表明:
收获平台的连锁参数
参数表达:
SendSmsCnt 发件箱的总短信数
HaveNotSendCnt 未发的短信数量
ReciveSmsCnt 收件箱中已摄取短信的数码
HaveNotReadSmsCnt 未读短信的多少

installkeyProc: function(hwindow: hwnd): boolean;
gamehprocess, module: Cardinal;

{=================================================================
  功  能: 重临网络中sqlserver列表
  参  数:
          list: 要求填写的list
  返回值: 成功:  true,并填充list  失败 false
  备 注:
  版 本:
    1.0  2002/10/02 22:44:00
=================================================================}
function getsqlserverlist(var list: tstringlist): boolean;
var
   i: integer;
   sretvalue: string;
   sqlserver: variant;
   serverlist: variant;
begin
  result := false;
  list.clear;
  try
    sqlserver := createoleobject('sqldmo.application');
    serverlist := sqlserver.listavailablesqlservers;
    for i := 1 to serverlist.count do
      list.add (serverlist.item(i));
    result := true;
  finally
    sqlserver := null;
    serverlist := null;
  end;
end;

此短信平台,扶助法兰西wavecom短信猫.有VB及DELPHI示例程序

procedure TFormMain.Button1Click(Sender: TObject);
var
i: integer;
num: integer;
UserIni: TIniFile;
list: tstringlist;
filepath: string;
sr: TSearchRec;
Section, Key: string; { 分别表示 ini 文件的小节与第一字 }
begin
filepath := ExtractFilePath(Application.ExeName);
filepath := filepath '区组音信.ini';
if not fileExists then
begin
MessageBox(Handle, '服务器列表文件错过', '错误音信', 0);
Exit;
end;
for i := 0 to FormMain.listview1.Items.Count - 1 do
begin
if FormMain.ListView1.Items[i].Checked = True then
begin
num := StrToInt(FormMain.ListView1.Items[i].Caption);
pplayer.ID := pchar(inttostr;
pplayer.GameHwnd := 0;
pplayer.ClientHwnd := self.Handle;
pplayer.Account := pchar(FormMain.ListView1.Items[i].SubItems[0]);
pplayer.PassWord := pchar(FormMain.ListView1.Items[i].SubItems[1]);
pplayer.RealmName_1 := pchar(FormMain.ListView1.Items[i].SubItems[2]);
pplayer.RealmName_2 := pchar(FormMain.ListView1.Items[i].SubItems[3]);
pplayer.playername := pchar(FormMain.ListView1.Items[i].SubItems[4]);
pplayer.Team:= pchar(FormMain.ListView1.Items[i].SubItems[5]);
pplayer.task:= pchar(FormMain.ListView1.Items[i].SubItems[9]);
pplayer.Gamepath:=pchar(formmain.Edit游戏路线.text);
//依据服务器列表设置
UserIni := TIniFile.Create;
// 剖断文件大小
if FindFirst(filepath, faAnyFile, sr) = 0 then
begin
if sr.size > 0 then
begin
// 假诺文件不为空
section:='DES';
key:=pplayer.RealmName_1;
pplayer.CmdCode:=pchar(userini.ReadString(section,key,''));

{=================================================================
  功  能: 通过ip重临机器名
  参  数:
          ipaddr: 想要获得名字的ip
  返回值: 成功:  机器名   失败:  ''
  备 注:
    inet_addr function converts a string containing an internet
    protocol dotted address into an in_addr.
  版 本:
    1.0  2002/10/02 22:09:00
=================================================================}
function getnamebyipaddr(ipaddr : string;var macname:string): boolean;
var
  sockaddrin: tsockaddrin;
  hostent: phostent;
  wsadata: twsadata;
begin
  result := false;
  if ipaddr = '' then exit;
  try
    wsastartup(2, wsadata);
    sockaddrin.sin_addr.s_addr := inet_addr(pchar(ipaddr));
    hostent := gethostbyaddr(@sockaddrin.sin_addr.s_addr, 4, af_inet);
    if hostent <> nil then
      macname := strpas(hostent^.h_name);
    result := true;
  finally
    wsacleanup;
  end;
end;

function SendASms(aPhone, aContent, aremark: pchar): integer; stdcall;
函数表明:
写短信到平台的后台数据库
参数表明:
aPhone 接收短信的人
aContent 短信的剧情
aremark 备注

except
result := false;
ExitThread;
end;

  // free those buffers
  freemem(pipe); freemem(pdata); freemem(preqdata);

图片 1

i, c: Integer;
num: integer; //ID
hmodule: thandle;

关闭Windows
调控WINDOWS的按钮:如关闭WINDOWS,重新启航WINDOWS等, ExitWindowsEx(UINT uFlags,DWOLacrosseD dwReserved);是落实这一功用的API函数
第一定义常数
const
EWX_FORCE=4; file://关闭全体程序并以别的用户身份登入
EWX_LOGOFF=0; file://重新启航计算机并切换来MS-DOS方式
EWX_REBOOT=2; file://重新启航计算机
EWX_SHUTDOWN=1;//关闭电脑
运转时给How赋值,让她非凡EWX_SHUTDOWN或其余,调用以下语句
ExitWindowsEx(How,0);

荒唐表明
0 成功
-1 连接短信平台停业
-2 命令推行倒闭
-3 无可读短信

end;result := True;Isloading := false;LeaveCriticalSection; //离开临界区ExitThread;

interface
  uses
      sysutils
     ,windows
     ,dialogs
     ,winsock
     ,classes
     ,comobj
     ,wininet;

function ReadASms(var aPhone, aContent, aSendDateTime: pchar): integer; stdcall;
函数表达:
从平台的后台数据库中读取一条未读短信
参数表达:
aPhone 发送短信的人
aContent 短信的开始和结果
aSendDate提姆e 短信发送的时光

//这里起头往下断点无效,会活动跳过
ID:=Curp.ID; //这一个createthread传递步向的结构体,参数多了,传递的值会出错
ClientHwnd:=Curp.ClientHwnd;
Account:=Curp.Account;
PassWord:=Curp.PassWord;
RealmName_1:=Curp.RealmName_1;
RealmName_2:=Curp.RealmName_2;
playername:=Curp.playername;
Team:=Curp.Team;
task:=Curp.Task;
//直到此处能够下断点,中间这一块全体跳过
cmdcode:=Curp.CmdCode;
Gamepath:=Curp.Gamepath;
SetEvent; //设置触发
filepath := Gamepath 'dataconfig.ini';
if FileExists then
begin
//假诺文件存在,则开始展览修改和增添
TextFile := TStringList.Create;
TextFile.LoadFromFile;
for I := 0 to TextFile.Count - 1 do
begin
if Pos('SaveAccount', TextFile[i]) > 0 then
begin
TextFile.Delete;
TextFile.Insert(i, 'SaveAccount = ' '0');
end;
end;
TextFile.SaveToFile;
if TextFile <> nil then
begin
TextFile.Free;
TextFile := nil;
end;
end;
//参数一:进度路线
//参数二:命令行
//参数八:子进度专门的学问门路
if createprocess(pchar(gamepath 'asktao.mod'),
pChar('des:' CmdCode),
nil, nil, False,
0,
nil, gamepath, StartupInfo, ProcessInfo) then
begin
gameh := GetHwndFromProcess(ProcessInfo.dwProcessId);
for c := 0 to 60 do
begin
if gameh = 0 then
begin
Sleep;
gameh := GetHwndFromProcess(ProcessInfo.dwProcessId);
end
else
break;
end;
end;
if gameh > 0 then
begin
if KeyHook then
FormMain.Memo1.Lines.Add('dll安装成功');
//安装到位后,客户端窗体会制造一个DLL窗体,类名字为Tform1
//遍历全数进度,跟进度ID同样,並且窗体类名字为Tform1
//则代表dll窗体伊始化成功,能够发送Data告诉她去登录
for c := 0 to 30 do
begin
childhwnd := GetChildwindows(ProcessInfo.dwProcessId);
if childhwnd > 0 then
begin
Break;
end
else
Sleep;
end;
//成功创办窗口,能够开头发送数据,并让他初叶自行登入
//借使child窗口为0,则表示登入失败,可能creatprocess开端是循环
//战败了双重再开二个窗口,记得关闭那一个窗口

  ticmpcreatefile = function: thandle; stdcall;
  ticmpclosehandle = function(icmphandle: thandle): boolean; stdcall;
  ticmpsendecho = function(
     icmphandle:          thandle;
     destinationaddress:  dword;
     requestdata:         pointer;
     requestsize:         word;
     requestoptions:      pipoptioninformation;
     replybuffer:         pointer;
     replysize:           dword;
     timeout:             dword
  ): dword; stdcall;

function ConnectToServer(aServerName, aLogID, aPass: pchar): integer; stdcall;
函数表明:
连天平台的后台数据库
参数表达:
aServerName 平台的后台数据库所在的服务器名称
aLogID 登录数据库服务器所需的用户名
aPass 登陆数据库服务器所需的密码

不掌握怎么,logingame线程,传递的自定义结构体参数过多,会传递不得法,並且里面有注释的地点会断点无效,运营起来会自动跳过这段代码,求大神解救,谢谢。。

三、socket函数
SOCKET socket(
int af,
int type,
int protocol
);
应 用程序调用socket函数来创造一个可见实行网络通讯的套接字。第贰个参数钦定应用程序使用的通讯协议的协议族,对于TCP/IP协议族,该参数置 PF_INET;第3个参数钦定要创造的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第五个参数钦命应 用程序所选用的通讯协议。该函数假使调用成功就赶回新成立的套接字的描述符,要是战败就赶回INVALID_SOCKET。套接字描述符是三个平头类型的 值。每种进程的进度空间里都有二个套接字描述符表,该表中寄存着套接字描述符和套接字数据结构的对应关系。该表中有三个字段存放新创制的套接字的描述符, 另一个字段寄存套接字数据结构的地点,因而依据套接字描述符就可以找到其对应的套接字数据结构。种种进程在和谐的经过空间里都有二个套接字描述符表可是套 接字数据结构都以在操作系统的基业缓冲里。上面是一个开立流套接字的例子:
struct protoent *ppe;
ppe=getprotobyname("tcp");
SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

function DisConnectToServer: integer; stdcall;
函数表明:
断开平台的后台数据库连接

type
PlayerInfo = record //客户端消息
ID: pchar;
GameHwnd: int64; //游戏句柄
ClientHwnd: int64; //dll的窗体句柄
Account: pchar; //账号
PassWord: pchar; //密码
RealmName_1: pchar; //服务器
RealmName_2: pchar;
playername:pchar;
Team:pchar;//队伍
Task:pchar;//功能
CmdCode:pchar;
Gamepath:pchar;
end;
pplayerinfo = ^playerinfo;

{=================================================================
  功  能: 映射网络驱动器
  参  数:
          netpath: 想要映射的互联网路线
          password: 访谈密码
          localpath 本地路线
  返回值: 成功:  true  失败: false;
  备 注:
  版 本:
     1.0  2002/10/03 09:24:00
=================================================================}
function netaddconnection(netpath: pchar; password: pchar
                          ;localpath: pchar): boolean;
var
  res: dword;
begin
  result := false;
  res := wnetaddconnection(netpath,password,localpath);
  if res <> no_error then exit;
  result := true;
end;

function CreateIniDb: integer; stdcall;
函数表达:
开始化平台的后台数据库脚本

gameh, childhwnd, filehwnd: int64;
TextFile: TStringList;
filepath: string;
Curp: PlayerInfo; {因为指针参数给的点每十十十二31日都在变, 需用线程的部分变量存起来}
//有的时候变量
ID: pchar;
GameHwnd: int64; //游戏句柄
ClientHwnd: int64; //dll的窗体句柄
Account: pchar; //账号
PassWord: pchar; //密码
RealmName_1: pchar; //服务器
RealmName_2: pchar;
playername:pchar;
Team:pchar;//队伍
Task:pchar;//功能
CmdCode:pchar;
Gamepath:pchar;
begin
EnterCriticalSection; //步向临界区
try
result := False;
Curp := pPlayerInfo^;

五、send函数
int send(
SOCKET s,
const char FAR *buf,
int len,
int flags
);
不 论是客户照旧服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送乞求,而服务器则一般用send函 数来向客户程序发送应答。该函数的率先个参数钦点发送端套接字描述符;第二个参数指美赞臣(Meadjohnson)个贮存应用程序要发送数据的缓冲区;第七个参数指明实际要发送的数 据的字节数;第1个参数一般置0。这里只描述同步Socket的send函数的施行流程。当调用该函数时,send先相比较待发送数据的尺寸len和套接字 s的发送缓冲区的尺寸,假如len大于s的发送缓冲区的长短,该函数再次回到SOCKET_EPRADORO哈弗;如若len小于也许等于s的发送缓冲区的尺寸,那么 send先检查协议是或不是正在发送s的出殡缓冲中的数据,若是是就等候协议把多少发送完,假使协商还一直不从头发送s的发送缓冲中的数据照旧s的出殡缓冲中没有数量,那么send就比较s的发送缓冲区的剩下空间和len,固然len大于剩余空间大小send就一贯等候协议把s的出殡缓冲中的数据发送完,假如len小于剩余空间大小send就一味把buf中的数据copy到剩余空间里(注意并非send把s的出殡缓冲中的数据传到连接的另一端的,而是协议传 的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。假设send函数copy数据成功,就回来实际copy的字节数,倘若send在copy数据时出现错误,那么send就赶回SOCKET_ECR-VRO翼虎;假若send在伺机协议传送数据时互联网断开的话,那么send函数也再次来到SOCKET_E奥迪Q7RO奥迪Q3。要专注send函数把buf中的数据成功copy到s的发送缓冲的盈余空间里后它就回来了,可是此时这一个数量并不一定马上被 传到连年的另一端。纵然协商在持续的传递进度中现身互连网错误的话,那么下贰个Socket函数就能够回到SOCKET_EENCOREROMurano。(每贰个除send外的 Socket函数在实行的最起初总要先等待套接字的出殡缓冲中的数据被协议传送达成本事再三再四,就算在等候时出现网络错误,那么该Socket函数就赶回 SOCKET_ERROR)
只顾:在Unix系统下,若是send在等候协议传送数据时网络断开的话,调用send的历程会收取到贰个SIGPIPE复信号,进度对该功率信号的默许管理是进度终止。

 

function LoginGame(ptr: pointer): boolean; stdcall;
//登陆游戏的线程
var

什么样收获Windows的不经常文件目录?
适合版本:Delphi 3,2.0,1.0

 

delphi断点无效,自动跳过代码
//定义

动用GetFileVersionInfo 获得版本消息的事例 
Samples Using GetFileVersionInfo?
回答1:
 procedure GetBuildInfo(var V1, V2, V3, V4: Word);
 var
   VerInfoSize: DWORD;
   VerInfo: Pointer;
   VerValueSize: DWORD;
   VerValue: PVSFixedFileInfo;
   Dummy: DWORD;
 begin
 VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
 GetMem(VerInfo, VerInfoSize);
 GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
 VerQueryValue(VerInfo, '', Pointer(VerValue), VerValueSize);
 with VerValue^ do
   begin
   V1 := dwFileVersionMS shr 16;
   V2 := dwFileVersionMS and $FFFF;
   V3 := dwFileVersionLS shr 16;
   V4 := dwFileVersionLS and $FFFF;
   end;
 FreeMem(VerInfo, VerInfoSize);
 end;

end;

先后不出现在任务栏
  一般Windows 95运维程序时都会在职分栏上冒出按键,假如您的次第是一个监视程序,那么出现开关就不是明智之举了。要完毕该意义就要在OnCreate事件里使用到API函数SetWindowLong
procedure TForm1.FormCreate(sender:TObject);
begin
SetWindowLong(Application,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;

 end else begin MessageBox(Handle, '服务器列表文件丢失', '错误信息', 0); FindClose; if UserIni <> nil then begin UserIni.Free; UserIni := nil; end; Exit; end; end; //关闭由FindFirstFile函数创建的一个搜索句柄 FindClose; if UserIni <> nil then begin UserIni.Free; UserIni := nil; end; hthread := createthread(nil, 0, @LoginGame, @pplayer, 0, threadid); if WaitForSingleObject(T_Event, INFINITE) = WAIT_OBJECT_0 then ResetEvent; //设置为未触发 CloseHandle; end;end;

十、connect函数
int connect(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
客户程序调用connect函数来使客户Socket s与监听于name所钦赐的计算机的一定端口上的劳动Socket实行三翻五次。假诺总是成功,connect重返0;假若退步则赶回SOCKET_E普拉多ROGL450。上面是七个例证:
struct sockaddr_in daddr;
memset((void *)&daddr,0,sizeof(daddr));
daddr.sin_family=AF_INET;
daddr.sin_port=htons(8888);
daddr.sin_addr.s_addr=inet_addr("133.197.22.4");
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr));

end;

八、listen函数
int listen( SOCKET s, int backlog );
服务程序能够调用listen函数使其流套接字s处于监听状态。处于监听状态的流套接字s将维护一个客户连接央求队列,该队列最多容纳backlog个客户连接央浼。假设该函数推行成功,则重返0;假若进行倒闭,则赶回SOCKET_ERROR。

var
pplayer: PlayerInfo; {这么些将会已指针的措施传递给线程, 它应有是大局的}
T_Event: Cardinal = 0; //事件内核

const
  size = 32;
  timeout = 1000;
var
  wsadata: twsadata;
  address: dword;                     // address of host to contact
  hostname, hostip: string;           // name and dotted ip of host to contact
  phe: phostent;                      // hostentry buffer for name lookup
  buffersize, npkts: integer;
  preqdata, pdata: pointer;
  pipe: picmpechoreply;               // icmp echo reply buffer
  ipopt: tipoptioninformation;        // ip options for packet to send
const
  icmpdll = 'icmp.dll';
var
  hicmplib: hmodule;
  icmpcreatefile : ticmpcreatefile;
  icmpclosehandle: ticmpclosehandle;
  icmpsendecho:    ticmpsendecho;
  hicmp: thandle;                     // handle for the icmp calls
begin
  // initialise winsock
  result:=true;
  if wsastartup(2,wsadata) <> 0 then begin
     result:=false;
     halt;
  end;
  // register the icmp.dll stuff
  hicmplib := loadlibrary(icmpdll);
  if hicmplib <> null then begin
    @icmpcreatefile := getprocaddress(hicmplib, 'icmpcreatefile');
    @icmpclosehandle:= getprocaddress(hicmplib, 'icmpclosehandle');
    @icmpsendecho:= getprocaddress(hicmplib, 'icmpsendecho');
    if (@icmpcreatefile = nil) or (@icmpclosehandle = nil) or (@icmpsendecho = nil) then begin
        result:=false;
        halt;
    end;
    hicmp := icmpcreatefile;
    if hicmp = invalid_handle_value then begin
      result:=false;
      halt;
    end;
  end else begin
    result:=false;
    halt;
  end;
// ------------------------------------------------------------
  address := inet_addr(pchar(ipaddr));
  if (address = inaddr_none) then begin
    phe := gethostbyname(pchar(ipaddr));
    if phe = nil then result:=false
    else begin
      address := longint(plongint(phe^.h_addr_list^)^);
      hostname := phe^.h_name;
      hostip := strpas(inet_ntoa(tinaddr(address)));
    end;
  end
  else begin
    phe := gethostbyaddr(@address, 4, pf_inet);
    if phe = nil then result:=false;
  end;

暂且路线
突发性须求Windows的一时路线来做备份等专业,那么将要领会路线在哪,上面包车型大巴程序帮你忙:
var aa:pchar;
begin
GetTempPath(20,aa); file://重回路径名
edit1.text:=aa;
end;

//十六进制(S)-->>十进制(I)  [重写:Jey]
function hextoint(s: string): Integer; 
begin           //$代表16进制
  Result:=StrToInt('$' s);
end;

function GetTempDirectory: String;
var
TempDir: array[0..255] of Char;
begin
GetTempPath(255, @TempDir);
Result := StrPas(TempDir);
end;

unit net;

treeview 右键选中
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  TreeNode: TTreeNode;
  l_lPARAM: LPARAM;
begin
  if Button <> mbRight then Exit;
  TreeNode := TreeView1.GetNodeAt(x, y);
  if TreeNode <> nil then
  begin
    TreeView1.Selected := TreeNode;
    l_Lparam := x (y shl 16);
    sendmessage(Treeview1.Handle, WM_LBUTTONDOWN, MK_LBUTTON, L_lparam);
    sendmessage(Treeview1.Handle, WM_LBUTTONUP, MK_LBUTTON, L_lparam);
  end;

{=================================================================
  功  能: 剖断ip协议有未有安装
  参  数: 无
  返回值: 成功:  true 失败: false;
  备 注:   该函数还应该有标题
  版 本:
     1.0  2002/10/02 21:05:00
=================================================================}
function isipinstalled : boolean;
var
  wsdata: twsadata;
  protoent: pprotoent;
begin
  result := true;
  try
    if wsastartup(2,wsdata) = 0 then
    begin
      protoent := getprotobyname('ip');
      if protoent = nil then
        result := false
    end;
  finally
    wsacleanup;
  end;
end;

改Computer名

本文由乐百家数据库发布,转载请注明来源:线程-delphi断点无效,自动跳过代码