图片 1

免费短信平台函数说明,delphi断点无效

图片 1

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

此短信平台,援助法国wavecom短信猫.有VB及DELPHI示例程序

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;

 

var
pplayer: PlayerInfo; {那一个将会已指针的秘技传送给线程, 它应当是全局的}
T_Event: Cardinal = 0; //事件内核

错误表达
0 成功
-1 连接短信平台倒闭
-2 命令实行倒闭
-3 无可读短信

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

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

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

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

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

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

gameh, childhwnd, filehwnd: int64;
TextFile: TStringList;
filepath: string;
Curp: PlayerInfo; {因为指针参数给的点每天都在变,
需用线程的一些变量存起来}
//偶尔变量
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^;

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

//这里起头往下断点无效,会活动跳过
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开端是循环
//战败了双重再开二个窗口,记得关闭这么些窗口

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

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

function GetSmsParams(var SendSmsCnt, HaveNotSendCnt, ReciveSmsCnt,
HaveNotReadSmsCnt: integer): integer; stdcall;
函数表明:
赢得平台的有关参数
参数表达:
SendSmsCnt 发件箱的总短信数
HaveNotSendCnt 未发的短信数量
ReciveSmsCnt 收件箱中已接纳短信的数据
HaveNotReadSmsCnt 未读短信的数码

except
result := false;
ExitThread;
end;

 

end;

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,”));

 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;

end;

不知道怎么,logingame线程,传递的自定义结构体参数过多,会传递不许确,并且当中有注释的地点会断点无效,运行起来会活动跳过这段代码,求大神解救,多谢。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注