2015.12.16 vs2015 编译能过,和1的唯一区别就是使用字符串找handle,是的,就这么点
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
class CUser
{
public:
CUser();
virtual~CUser();
char* WcharToChar(wchar_t* wc);//宽字节转单字节
char* WcharToChar(wchar_t* wc, int& cs);//宽字节转单字节
wchar_t* CharToWchar(char* c); //单字节转宽字节
wchar_t* CharToWchar(char* c, int& cs); //单字节转宽字节
void Release();//释放资源
private:
char* m_char;
wchar_t* m_wchar;
};
/
/*字符类型 wchar_t char
/*获取字符长度 wcslen() strlen()
/*连接两个字符串 wcscat() strcpy()
/*复制字符串 wcscpy() strcpy()
/*比较两个字符串 wcscmp() strcmp()
/*具体参数详见www.linuxidc.com*/
CUser::CUser()
:m_char(NULL)
, m_wchar(NULL)
{
}
CUser::~CUser()
{
Release();
}
char* CUser::WcharToChar(wchar_t* wc)
{
Release();
int len = WideCharToMultiByte(CP_ACP, 0, wc, wcslen(wc), NULL, 0, NULL, NULL);
m_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, wc, wcslen(wc), m_char, len, NULL, NULL);
m_char[len] = '\0';
return m_char;
}
char* CUser::WcharToChar(wchar_t* wc, int& cs)
{
Release();
int len = WideCharToMultiByte(CP_ACP, 0, wc, wcslen(wc), NULL, 0, NULL, NULL);
m_char = new char[len + 1];
cs = sizeof(char)* (len + 1);
WideCharToMultiByte(CP_ACP, 0, wc, wcslen(wc), m_char, len, NULL, NULL);
m_char[len] = '\0';
return m_char;
}
wchar_t* CUser::CharToWchar(char* c)
{
Release();
int len = MultiByteToWideChar(CP_ACP, 0, c, strlen(c), NULL, 0);
m_wchar = new wchar_t[len + 1];
MultiByteToWideChar(CP_ACP, 0, c, strlen(c), m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}
wchar_t* CUser::CharToWchar(char* c, int& cs)
{
Release();
int len = MultiByteToWideChar(CP_ACP, 0, c, strlen(c), NULL, 0);
m_wchar = new wchar_t[len + 1];
cs = sizeof(wchar_t) * (len + 1);
MultiByteToWideChar(CP_ACP, 0, c, strlen(c), m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}
void CUser::Release()
{
if (m_char)
{
delete m_char;
m_char = NULL;
}
if (m_wchar)
{
delete m_wchar;
m_wchar = NULL;
}
}
CUser m_u;
#define STR_SIZE 1024
struct G_NOTIFY_DATA
{
G_NOTIFY_DATA()
{
memset(this, 0, sizeof(G_NOTIFY_DATA));
}
time_t timeStamp;
char data[STR_SIZE];
void Clear()
{
memset(data, 0, sizeof(data));
}
};
int main(int argc , char* argv[])
{
if (argv[1] == 0) {
SECURITY_ATTRIBUTES SA;
SA.bInheritHandle = true;
SA.lpSecurityDescriptor = NULL;
SA.nLength = sizeof(SECURITY_ATTRIBUTES);
//HANDLE hd = CreateFileMapping(INVALID_HANDLE_VALUE, &SA, PAGE_READWRITE, 0, sizeof(G_NOTIFY_DATA), NULL);
WCHAR MapName[20] = L"Self_Test";
HANDLE hd = CreateFileMapping(INVALID_HANDLE_VALUE, &SA, PAGE_READWRITE, 0, sizeof(G_NOTIFY_DATA), MapName);
STARTUPINFO SI;
ZeroMemory(&SI, sizeof(SI));
SI.cb = sizeof(STARTUPINFO);
WCHAR title[STR_SIZE] = L"test";
SI.lpTitle = title;
PROCESS_INFORMATION PI;
ZeroMemory(&PI, sizeof(PI));
char cmdstr[STR_SIZE] = {};
sprintf_s(cmdstr, STR_SIZE, "\"%s\" %d", argv[0], hd);
WCHAR wappname[STR_SIZE] = {};
WCHAR wcmdstr[STR_SIZE] = {};
WCHAR* pwchar = NULL;
int cse = 0;
pwchar = m_u.CharToWchar(cmdstr, cse);
memcpy_s(wcmdstr, sizeof(wcmdstr), pwchar, cse);
pwchar = m_u.CharToWchar(argv[0], cse);
memcpy_s(wappname, sizeof(wappname), pwchar, cse);
BOOL bSuc = CreateProcess(wappname, wcmdstr, 0, 0, true, CREATE_NEW_CONSOLE,0,0,&SI,&PI);
Sleep(1000);
G_NOTIFY_DATA gData;
char* pmap = (char*)MapViewOfFile(hd, FILE_MAP_WRITE, 0, 0, 0);
if (pmap) {
string str;
while (true) {
getline(cin, str);
if (str.length() < sizeof(G_NOTIFY_DATA)) {
gData.timeStamp = time(0);
gData.Clear();
memcpy_s(gData.data, sizeof(gData.data), str.c_str(), str.length());
memcpy_s(pmap, sizeof(G_NOTIFY_DATA), &gData, sizeof(G_NOTIFY_DATA));
if (str[0] == 'Q')
break;
}
str.clear();
//getline(cin, str);
}
WaitForSingleObject(PI.hProcess, INFINITE);
UnmapViewOfFile(pmap);
CloseHandle(PI.hProcess);
CloseHandle(hd);
return 0;
}
}
else {
WCHAR MapName[20] = L"Self_Test";
//HANDLE fhd = (HANDLE)atoi(argv[1]);
HANDLE fhd = OpenFileMapping(FILE_MAP_READ, FALSE, MapName);
time_t oldStamp = 0;
G_NOTIFY_DATA* cmdstr = (G_NOTIFY_DATA*)MapViewOfFile(fhd, FILE_MAP_READ, 0,0,0);
while (true) {
if (cmdstr != NULL) {
if (cmdstr->data[0] != 'Q') {
if (oldStamp != cmdstr->timeStamp) {
printf_s("child: %s [%d][%I64d]\n", cmdstr->data, strlen(cmdstr->data), cmdstr->timeStamp);
oldStamp = cmdstr->timeStamp;
}
}
else
break;
}
Sleep(100);
}
if (cmdstr)
UnmapViewOfFile(cmdstr);
return 0;
}
return 0;
}