复制文件到系统目录
知识准备:
SDK:Software Develop Kits
API:Application Programming Class
SDK相当于是一系列的API的集合
PSDK(Platform SDK)
MFC:Microsoft Foundation Class
Win32->MFC(MFC对win32进行了封装,更易于使用)
C/C++ SDK:跨平台SDK(基于各平台SDK)
函数:GetModuleFilename //获取自身路径
GetSystemDirectory //获取系统路径
GetWindowsDirectory //获取Windows路径
CopyFile //拷贝文件到指定文件夹
wcscat(strcat的宽字符版)
1、字符函数一般用宽字符版,为什么?最开始的C语言是在英语环境下出现的,作为英语,用一个字节表示其所有字符足以。但是一个国际化的软件必须能够表示不同的字符,而这些数量庞大的字符无法使用一个字节来表示,后来引入了宽字符,UNICODE应运而生。宽字符在内存中占用的空间比多字节和单字节字符多,但处理速度更快,因为很多系统的内核包括Windows NT内核都是从底层向上使用Unicode编码的。另外,在多字节编码中一次只能表示一个区域设置,Unicode编码可以毫无障碍地在世界上任何书面语言的字符中转换。为了文本处理的方便,许多系统内部采用了将多字节字符和单字节字符都转换称宽字符的办法。所以与字符有关的函数都采用宽字节版本。
2、64位windows操作系统可以向下兼容32位的程序,这得益于windows操作系统的WOW64子系统,。WOW64子系统使32位程序能够在基于 x64 版本的Windows操作系统上运行而不用修改。如果向win32文件夹拷贝64位程序,系统将自动优化,将64位程序拷贝到WOW64目录下。
3、GetModuleFilename返回的是文件的路径,但是并不包括文件本身,而CopyFile函数只能将文件复制到指定目录下,而不能复制文件夹。所以应该对自身文件路径做一定的补充。
#include "stdafx.h"
#include<Windows.h>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t strSelfDire[MAX_PATH] = {};
wchar_t strSystemDire[MAX_PATH] = {};
wchar_t strWindowsDire[MAX_PATH] = {};
GetModuleFileNameW(0, strSelfDire, MAX_PATH);
GetSystemDirectoryW(strSystemDire, MAX_PATH);
GetWindowsDirectoryW(strWindowsDire, MAX_PATH);
wcscat_s(strSystemDire, L"\\CopySelfDemo.exe");
/*虽然Windows的路径用的都是单斜杠,但是在编程中反斜杠是
转义前导字符如果路径中刚好有类似转义字符开头的,那么
就会引起问题,而 \\ 才是代表的是反斜杠。*/
if (!CopyFileW(strSelfDire, strSystemDire, FALSE))
{
DWORD dwError = GetLastError();
cout << dwError << endl;
}
return 0;
}
获取程序管理员权限:
项目属性->链接器->清单文件->UAC执行级别->Administrator
编程过程中犯的错及发现:
wcscat_s函数第一个参数是system的路径,并不是自己程序的路径。通过调试发现自己的strSelfDire的路径是包含了程序的,而strSystemDirectory的路径到了sys32,按理来说是可以(将xxx文件拷贝到某某文件夹),但是却不行,还必须提供一个名字(这个名字居然可以不和原文件相同>_<)。
VS2013可以在Debug下拉菜单的配置管理器中新建x64的平台。
WinSocket
知识准备:
IP类型(同一时间是唯一的)
环回IP:127.x.x.x本机IP(本机IP:127.0.0.1)
内网IP:10.x.x.x 192.x.x.x局域网IP
公网IP:由ISP(网络服务提供商)
其他IP:实验性
端口:16位0-655352
程序通过端口和外界通信
Sock:windows对sock进行了封装。
Sock = IP+端口
架构:B/S架构 C/S架构
步骤:
WSAStartup//初始化
socket->TCP/UDP //连接方式(一个安全,一个快)
服务端:
bind->sockaddr->inet_addr//绑定IP地址与端口
listen//监听
accept//接受连接
客服端:
Connect->sockaddr->inet_addr//连接服务器
send sendto//(TCP)发送消息
recv recvfrom //(TCP)接受消息
服务端:
#include "stdafx.h"
#include<WinSock2.h> //WinSock2.h应该放在windows.h之前
#include<Windows.h>
#pragma comment(lib,"ws2_32")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData = {};
WSAStartup(MAKEWORD(2, 2), &wsaData);
//socket(通信协议族TCP/IP,通信模式,协议)
//SOCK_STREAM(流模式)-----IPPROTO_TCP
//SOCK_DGRAM(包模式)------IPPROTO_UDP
SOCKET sockServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in addrServer = {};
addrServer.sin_family = PF_INET;//指定通信协议族
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrServer.sin_port = htons(10086);
bind(sockServer, (SOCKADDR*)&addrServer, sizeof(addrServer));
listen(sockServer, 10);
SOCKET sockClient = {};
SOCKADDR addrClient = {};
int nSize = sizeof(addrClient);
sockClient = accept(sockServer,&addrClient,&nSize);
printf("客户端已链接");
closesocket(sockServer);
closesocket(sockClient);
WSACleanup();
return 0;
}
客户端:
#include "stdafx.h"
#include<WinSock2.h>
#include<Windows.h>
#pragma comment(lib,"ws2_32")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData = {};
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET sockClient = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in addrServer = {};
addrServer.sin_family = PF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrServer.sin_port = htons(10086);
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(addrServer));
closesocket(sockClient);
WSACleanup();
return 0;
}