php调用dos命令执行exe文件获取信息

php调用编译的exe文件,php只有权限,没有操作exe可执行文件的权限,但是php可以用exec执行dos命令,exe文件可以用程序遍历窗口,编辑器传值,封装为dos命令传到窗口中,然后操作按钮或者文件抓到返回信息。感谢茂茂大神的帮忙,代码如下:

#include <cstdio>
#include <windows.h>
#include <string>
#include <atlconv.h>
using namespace std;

int main(int argc,char * argv[])
{

USES_CONVERSION; //这个宏是为了下面使用 A2W 将ascii转换成unicode
//下面findwindow 根据程序窗口字符串来查找主窗口,可以用spy++,没有的话跟我拿我写的一个
HWND hParent = FindWindow(NULL,L"Safe3 Web漏洞扫描系统企业版v10.1   Crack  By  Lkou[LCG]   Http://www.52pojie.cn");
//判断输入的网址是否为空,为空提示退出
if (argv[1] == NULL){
printf("输入格式:set.exe http://www.baidu.com");
return 0;
}
//将参数网址转换成宽字符串
wstring str(A2W(argv[1]));
//判断主窗口是否找到,没找到提示退出
if (hParent == NULL)
{
printf("没有找到匹配窗口,请确定safe3已经运行\n");
return 0;

}
//printf("%d",hParent); //测试用的
//找到主窗口,接下来遍历子窗口
HWND hchild = GetWindow(hParent, GW_CHILD);
HWND hButton = NULL;
BOOL flag = FALSE;
//循环遍历子窗口,有些子窗口嵌套在其他子窗口内,这个代码遍历不出来的,因为只是要那个编辑框,还有按钮,所以深层遍历我就没写
//如果需要,知道原理后,自己很容易实现

while (hchild != NULL)
{
RECT rcchild;

//得到子窗口的大小
GetWindowRect(hchild, &rcchild);
//得到的子窗口大小是相对于整个屏幕坐标系的,所以要调用下面函数转换,得到相对于主窗口的大小
//我们这里只关心left ,top成员就够了
ScreenToClient(hParent, (LPPOINT)&rcchild);
//printf("找到%d ID:%d 窗口位置:%d %d\n",hchild,GetDlgCtrlID(hchild),rcchild.left,rcchild.top);

//根据位置判断是否是按钮
if (rcchild.left == 676 && rcchild.top == 27)
{
hButton = hchild;

if (flag == TRUE)
{
//ShowWindow(hButton, SW_SHOW);//可以隐藏按钮,测试是否能真正操作那个按钮
SendMessage(hButton, BM_CLICK,0,0); //发送click消息,点击
}
}
//×××注意:这里不知道先遍历出来按钮还是先遍历出来 编辑框,所以用了个flag,以防止,编辑框还没内容的时候 点击按钮
//调式很多次都是先遍历出来编辑框的
//这里就是判断是否是编辑框,如果是的话,那么就发消息
if (rcchild.left == 25 && rcchild.top == 29)
{
::SendMessage(hchild,EM_SETSEL,0,-1);
::SendMessage(hchild, WM_CLEAR, 0, 0);
//上面这两个消息是清空编辑框
//下面的循环是吧我们参数的字符床发送到编辑框上面,解决了中文乱码问题

for (int i = 0; i < str.length(); i++)
::SendMessage(hchild,WM_CHAR,str.at(i),NULL);
if (hButton != NULL)
{
//这里也只是看是按钮先遍历出来还是编辑框
::SendMessage(hButton,BM_CLICK, 0, 0);
break;
}
else
flag = TRUE;

}
//如果都不是的话那么我们就遍历下一个子窗口
hchild = GetWindow(hchild, GW_HWNDNEXT);

}
return 0;
}

C++网络编程学习笔记

1、IP网络中的每台主机都有一个IP地址;
它是逻辑地址;
因特网上的IP地址具有全球唯一性;
4个字节,192.168.0.16
2、OSI将网络分为 TCP/IP模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口
物理层
相同层次之间不可以直接通信,是虚拟通信。下层向上层提供服务,实际通信在最底层完成。各层之间单向依赖。
3、DNS是将DNS解析为IP地址。
应用层:Telnet、FTP、HTTP、DNS、SMTP、POP3。
传输层:TCP实现数据的完整性,例如下载安装包;UDP实现数据的及时性,例如网络视频电话。
4、数据封装:在数据前面加上特定的协议头部。
5、TCP和UDP可以使用同样的端口,1024以下的端口保留给预定义的服务。windows socket只支持AF_INET网际域.
6、在网络协议中需要指定网络字节顺序,TCP/IP使用16位整数和32位整数的高位先存格式,PC机采用的是低位先存格式。
套接字:流式套接字(基于TCP)、数据报套接字(基于UDP),原始套接字。
7、基于TCP的socket编程
服务器端程序:
创建套接字;
将套接字绑定到一个本地地址和端口上bind
将套接字设为监听模式,准备接受客户请求listen
等待客户请求,当请求到来,返回一个新的对应于此次连接的套接字accept
用返回的套接字和客户端进行通信send/recv。
返回,等待另一客户的请求。
关闭套接字。
客户端程序:
创建套接字;
向服务器发送连接请求connect
和服务器进行通信send/recv
关闭套接字。
8、基于UDP的socket编程
服务器端(接收端)程序:
创建套接字
绑定套接字到本地地址和端口上bind
等待接受数据recvfrom
关闭套接字
客户端(发送端)程序:
创建套接字
发送数据sendto
关闭套接字
9、Alt+F8实现代码的整齐。
10、0535code.com是回路地址。可以在同一台机子上通信。
11、将两个工程添加到一个工作区中,在工作区中点右键”添加工程”。取消”编译微型条”,选中”组建”.
12、基于TCP/IP的socket代码:

/*Server.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
//终止使用套接字DLL库
WSACleanup( );
return;
}

//1、创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
/*第一个参数对于TCP/IP协议的套接字,只能是AF_INET或PF_INET,第二个参数对于
1.1版本的socket,只支持两种类型的套接字,SOCK_STREAM指定产生流式套接字,
SOCK_DGRAM产生数据报套接字,第三个参数为零时自动选择合适的协议。*/

//2、绑定套接字到一个本地地址和端口上
SOCKADDR_IN addSrv;
//htonl是把u_long类型转换为网络字节序
//htons是把u_short类型转换为网络字节序
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
//unsigned   short   sin_port;
addSrv.sin_port=htons(4000);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));

//3、将套接字设为监听模式,准备接受客户请求
listen(sockSrv,5);
SOCKADDR_IN addClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addClient,&len);
//accept函数第三个参数必须赋初始值,初始值为结构体的长度。否则函数调用失败



//4、用返回的套接字和客户端进行通信
char sendBuf[100];
sprintf(sendBuf,"hello,haha %s",inet_ntoa(addClient.sin_addr));
//inet_ntoa函数是将网络IP地址转换为字符串
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);

//4、关闭套接字
closesocket(sockConn);
}
}


/*Client.cpp*/
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

//1、创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

//2、向服务器发送连接请求
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("0535code.com");//设置SOCKET的IP为本机。
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4000);//端口为4000,服务端和客户端的端口一定要相同.否则是连不

上的
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//根据addrSrv连接服务端

//3、和服务器进行通信
char recvBuf[100];
recv(sockClient,recvBuf,100,0);//接收100字符
printf("%s\n",recvBuf);        //显示
send(sockClient,"hello",strlen("hello")+1,0);    //发送一个hello

//4、关闭套接字
closesocket(sockClient);            //关闭
WSACleanup();                        //清理
}

13、基于UDP/IP的socket代码:

/*Server.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
//终止使用套接字DLL库
WSACleanup( );
return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4001);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[50];
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);

closesocket(sockSrv);
WSACleanup();
}


/*Client.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )

编译原理

刚看C/C++群里有人问一个程序的输出结果,代码如下:

#include <iostream>
using namespace std;
void main()
{
int a=4 ;
a=(a++)+(++a)+(a--)+(--a);
cout<<a;
}

隐约的看了下,以为输出结果是20,用VC++编译了一下,结果却是19,然后其他编译器的结果也都不同。

JAVA?? :20
VC++?? :19
VS2005?:16

为什么会结果不同呢,这就设计到编译原理的问题了,每种编译器的编译原理各不相同,所以导致结果也不同。

 

网痴C排序算法

#include "stdio.h"
main()
{int a[11];
int i,j,t;
printf("请输入十个数字:\n");
for(i=1;i<11;i++)
{
scanf("%d",&a[i]);
printf("继续输入:\n");
}
for(j=1;j<11;j++)
for(i=1;i<10-j;i++)
if (a[i]>a[i+1] )
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("输出:\n");
for(i=1;i<11;i++)
printf("%d < ",a[i]);
}

修改的C排序算法,有时间好好整理一下C的各种排序和,链表。。。

C++生成文章RSS地图程序

今晚想用C++写一个文章列表的程序,很简单的小程序,可是就是出现问题了,贴代码:

#include "stdafx.h"
int main()
{
int i=1;
int sum=0;
while(sum<=1000)
{
i++;
sum=i+1;
printf("http://www.0535code.com/article.asp?id=%d\n",sum);  //system("pause");
}
return 0;
}

这个程序看起来没问题的。可是就是有问题,输出的时候是从703开始的,而不是从1到1000,理论上程序是没问题的,难道是变量类型,想了又想,还是不晓得程序问题出现在那里了,之后问了下同事,同事要我加上system(“pause”);这句,加上去后,回车一下输出一行,一直按着回车后到了最后,看看开始还是703,然后同事说控制台显示不了那么多,没有那么多行,可以保存到文件里,就可以看到全部了,原来是这个问题,贴下正确代码:

#include "stdafx.h"
int main()
{
FILE *pf = fopen("C:\\article.html","w+");
int i=1;
int j=0;
while(i<=1000)
{
j=i++;
fprintf(pf,"<a href=http://www.0535code.com/article.asp?id=%d>http://www.0535code.com/article.asp?id=%d</a>\n<br>",j,j);
}
fclose(pf);
return 0;
}

编程学习网 原创C++生成文章RSS地图程序源码

C++经典面试题之一

题目(王小鹏老师):给两个变量,不用第三个变量怎么交换两个变量的值?
回答(范鹏远老师):通过两个数的和先相加赋给其中一个变量,然后减去另一个变量赋给第一个变量这样就可以交换。
回答(王小鹏老师):还可以通过位移来实现交换两个变量的值。
程序代码如下(高龙云老师写):

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a=3,b=4;
a=a+b;
b=a-b;
a=a-b;
cout<<a<<endl;
cout<<b<<endl;
}

C++小技巧-考你智商

#include <stdio.h>
void main()
{
printf("%d\n",1);
}

考题(马琦明老师出):上面控制台程序修改main函数里面部分,不允许有分号(;)输出上述数字?
说明:咦,这是一个智商问题,当时我是没想到怎么解决这问题,智商没那么高,真有智商高的人,不承认不行。
答案(范鹏远老师答): 程序中用IF语句

#include <stdio.h>
void main()
{
if(printf("%d\n",1))
{
}
}

北京某公司的面试题之一

题目是这样的:
编写一个字符串分割模块,用户可以在屏幕上输入任意字符串和分割字符,然后点击‘分割’按钮,结果显示在一个listbox控件上。
例如:I love beijing and china, 按字符i分割的话成为五个句子
i
love bei
ji
ng and chi
na
这个题刚开始看了一下,很简单,但是写程序的时候会发现很多问题了,到现在还是没有完全完善好这程序,没那么多时间去完善了,先把写的发出来吧,有时间再去完善吧,也希望高人们指教,谢谢。

CString str; //字符串
CString stop; //分割字符
CString strsave;
UpdateData(TRUE); //刷新文本内容
GetDlgItem(IDC_EDIT1)->GetWindowText(str);
GetDlgItem(IDC_EDIT2)->GetWindowText(stop);

int len=str.GetLength();
int lensave;
while(str.Find(stop))
{
lensave=str.Find(stop);
strsave=str.Left(lensave);
CString strout=strsave+stop;
//MessageBox(strout);
m_list.AddString(strout);//要关联对象变量,使用指针的话,不可以保存多个值
if (strout==stop)
{
break;
}
str=str.Right(len-lensave-1);
len=str.GetLength();
}
//此程序存在两个问题,第一当输入第一个字符为查找字符时,直接转到判断退出了
//第二就是用指针CListbox保存后的值都是第一个值,所以要关联对象变量,但是添加顺序是乱的
//期待高手解决吧。。。

几天后??? QQ:大连—虬(610512037) 帮完善了。

CString str; //字符串
CString stop; //分割查找字符
CString strsave;//分割后部分字符串
UpdateData(TRUE); //刷新文本内容

GetDlgItem(IDC_EDIT1)->GetWindowText(str);
GetDlgItem(IDC_EDIT2)->GetWindowText(stop);
CListBox *plist=(CListBox *)GetDlgItem(IDC_LIST1);
//获取原始字符串长度
int len=str.GetLength();
//找到第一个分割字符位置
int lensave = str.Find(stop);
while( len > 0 )
{
strsave=str.Left(lensave);
CString strout=strsave+stop;
//如果strout以空格开头,则删除空格
if (strout[0] == ' ')
{
int lentemp = strout.GetLength();
strout = strout.Right(lentemp - 1);
}
//每次都从list末尾插入
plist->InsertString(-1,strout);
str=str.Right(len - lensave - 1);
lensave = str.Find(stop);
len=str.GetLength();
//如果当前剩余字符串已经没有分隔符,则直接将剩余字符串插入list末尾
if ((lensave == -1) && ( len != 0))
{
plist->InsertString(-1,str);
break;
}
}

MFC模态与非模态对话框整理

今晚写了下,老出错误,拿出一起的总结,顺便也分享一下:
模态显示对话框:

CAboutDlg dlg;//第一个 类名 类对象
dlg.DoModal();//类对象的 模态显示方法
非模态显示对话框:

CAboutDlg *dlg= new CAboutDlg;
//定义指针,如果是对象局部变量会暂时释放内存,见不到对话框,或者声明为全局或者用指针分配内存
dlg->Create(IDD_ABOUTBOX,this);
dlg->ShowWindow(SW_SHOW);//显示对话框
/*注意用完了,需要释放指针所指向的内存*/