|
|
//WindowsProject3.cpp: 定义应用程序的入口点。
|
|
|
//
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
|
|
|
|
|
#include <WinSock2.h>
|
|
|
#include <Windows.h>
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include <ShObjIdl.h>
|
|
|
|
|
|
#pragma comment(lib,"WS2_32.lib")
|
|
|
|
|
|
#include "WindowsProject2.h"
|
|
|
#include <string.h>
|
|
|
|
|
|
#define MAX_LOADSTRING 100
|
|
|
|
|
|
// 全局变量:
|
|
|
HINSTANCE hInst; // 当前实例
|
|
|
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
|
|
|
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
|
|
|
|
|
|
// 此代码模块中包含的函数的前向声明:
|
|
|
ATOM MyRegisterClass(HINSTANCE hInstance);
|
|
|
BOOL InitInstance(HINSTANCE, int);
|
|
|
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
|
|
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
|
|
|
|
|
|
void MySock();
|
|
|
void MyCom();
|
|
|
|
|
|
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
|
|
|
_In_opt_ HINSTANCE hPrevInstance,
|
|
|
_In_ LPWSTR lpCmdLine,
|
|
|
_In_ int nCmdShow)
|
|
|
{
|
|
|
UNREFERENCED_PARAMETER(hPrevInstance);
|
|
|
UNREFERENCED_PARAMETER(lpCmdLine);
|
|
|
|
|
|
|
|
|
// TODO: 在此放置代码。
|
|
|
|
|
|
// 初始化全局字符串
|
|
|
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
|
|
|
LoadStringW(hInstance, IDC_WINDOWSPROJECT2, szWindowClass, MAX_LOADSTRING);
|
|
|
MyRegisterClass(hInstance);
|
|
|
|
|
|
// 执行应用程序初始化:
|
|
|
if (!InitInstance(hInstance, nCmdShow))
|
|
|
{
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT2));
|
|
|
|
|
|
MSG msg;
|
|
|
|
|
|
// 主消息循环:
|
|
|
while (GetMessage(&msg, nullptr, 0, 0))
|
|
|
{
|
|
|
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
|
|
|
{
|
|
|
TranslateMessage(&msg);
|
|
|
DispatchMessage(&msg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return (int)msg.wParam;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
// 函数: MyRegisterClass()
|
|
|
//
|
|
|
// 目的: 注册窗口类。
|
|
|
//
|
|
|
ATOM MyRegisterClass(HINSTANCE hInstance)
|
|
|
{
|
|
|
WNDCLASSEXW wcex;
|
|
|
|
|
|
wcex.cbSize = sizeof(WNDCLASSEX);
|
|
|
|
|
|
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
|
|
wcex.lpfnWndProc = WndProc;
|
|
|
wcex.cbClsExtra = 0;
|
|
|
wcex.cbWndExtra = 0;
|
|
|
wcex.hInstance = hInstance;
|
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT2));
|
|
|
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
|
|
|
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
|
|
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT2);
|
|
|
wcex.lpszClassName = szWindowClass;
|
|
|
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
|
|
|
|
|
|
return RegisterClassExW(&wcex);
|
|
|
}
|
|
|
|
|
|
struct MyStruct
|
|
|
{
|
|
|
wchar_t name[100];
|
|
|
int age;
|
|
|
|
|
|
};
|
|
|
|
|
|
//
|
|
|
// 函数: InitInstance(HINSTANCE, int)
|
|
|
//
|
|
|
// 目的: 保存实例句柄并创建主窗口
|
|
|
//
|
|
|
// 注释:
|
|
|
//
|
|
|
// 在此函数中,我们在全局变量中保存实例句柄并
|
|
|
// 创建和显示主程序窗口。
|
|
|
//
|
|
|
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
|
|
{
|
|
|
|
|
|
MyStruct *m = new MyStruct;
|
|
|
wcscpy_s(m->name, L"king");
|
|
|
m->age = 17;
|
|
|
|
|
|
hInst = hInstance; // 将实例句柄存储在全局变量中
|
|
|
|
|
|
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
|
|
|
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, m);
|
|
|
|
|
|
if (!hWnd)
|
|
|
{
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
ShowWindow(hWnd, nCmdShow);
|
|
|
UpdateWindow(hWnd);
|
|
|
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
//
|
|
|
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
|
|
|
//
|
|
|
// 目的: 处理主窗口的消息。
|
|
|
//
|
|
|
// WM_COMMAND - 处理应用程序菜单
|
|
|
// WM_PAINT - 绘制主窗口
|
|
|
// WM_DESTROY - 发送退出消息并返回
|
|
|
//
|
|
|
//
|
|
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
WCHAR mb_title[30] = L"My application";
|
|
|
MyStruct* m;
|
|
|
if (message == WM_CREATE)
|
|
|
{
|
|
|
CREATESTRUCT *pCreate = reinterpret_cast<CREATESTRUCT*>(lParam);
|
|
|
m = reinterpret_cast<MyStruct*>(pCreate->lpCreateParams);
|
|
|
LPTSTR lpsz = new TCHAR[10];
|
|
|
_itot_s(m->age, lpsz, 10, 10);
|
|
|
MessageBox(hWnd, lpsz, m->name, MB_OKCANCEL);
|
|
|
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)m);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
LONG_PTR ptr = GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
|
|
m = reinterpret_cast<MyStruct*>(ptr);
|
|
|
}
|
|
|
|
|
|
switch (message)
|
|
|
{
|
|
|
case WM_COMMAND:
|
|
|
{
|
|
|
int wmId = LOWORD(wParam);
|
|
|
// 分析菜单选择:
|
|
|
switch (wmId)
|
|
|
{
|
|
|
case IDM_ABOUT:
|
|
|
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
|
|
|
break;
|
|
|
case IDM_EXIT:
|
|
|
DestroyWindow(hWnd);
|
|
|
break;
|
|
|
default:
|
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case WM_PAINT:
|
|
|
{
|
|
|
PAINTSTRUCT ps;
|
|
|
HDC hdc = BeginPaint(hWnd, &ps);
|
|
|
// TODO: 在此处添加使用 hdc 的任何绘图代码...
|
|
|
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
|
|
|
EndPaint(hWnd, &ps);
|
|
|
}
|
|
|
break;
|
|
|
case WM_DESTROY:
|
|
|
PostQuitMessage(0);
|
|
|
break;
|
|
|
case WM_CLOSE:
|
|
|
wcscat_s(mb_title, 30, L"s");
|
|
|
if (MessageBox(hWnd, L"Really quit?", mb_title, MB_OKCANCEL) == IDOK)
|
|
|
{
|
|
|
DestroyWindow(hWnd);
|
|
|
}
|
|
|
|
|
|
MyCom();
|
|
|
|
|
|
// Else: User canceled. Do nothing.
|
|
|
return 0;
|
|
|
//break;
|
|
|
default:
|
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
// “关于”框的消息处理程序。
|
|
|
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
switch (message)
|
|
|
{
|
|
|
case WM_INITDIALOG:
|
|
|
return (INT_PTR)TRUE;
|
|
|
|
|
|
case WM_COMMAND:
|
|
|
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
|
|
|
{
|
|
|
EndDialog(hDlg, LOWORD(wParam));
|
|
|
return (INT_PTR)TRUE;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
return (INT_PTR)FALSE;
|
|
|
}
|
|
|
|
|
|
|
|
|
void MySock()
|
|
|
{
|
|
|
WSADATA data; //定义WSADATA结构体对象
|
|
|
WORD w = MAKEWORD(2, 0); //定义版本号码
|
|
|
char sztext[] = "欢迎你\r\n"; //定义并初始化发送到客户端的字符数组
|
|
|
::WSAStartup(w, &data); //初始化套接字库
|
|
|
SOCKET s, s1; //定义连接套接字和数据收发套接字句柄
|
|
|
s = ::socket(AF_INET, SOCK_STREAM, 0); //创建TCP套接字
|
|
|
sockaddr_in addr, addr2; //定义套接字地址结构
|
|
|
int n = sizeof(addr2); //获取套接字地址结构大小
|
|
|
addr.sin_family = AF_INET; //初始化地址结构
|
|
|
addr.sin_port = htons(75);
|
|
|
addr.sin_addr.S_un.S_addr = INADDR_ANY;
|
|
|
::bind(s, (sockaddr*)&addr, sizeof(addr)); //绑定套接字
|
|
|
::listen(s, 5); //监听套接字
|
|
|
printf("服务器已经启动\r\n"); //输出提示信息
|
|
|
|
|
|
while (true)
|
|
|
{
|
|
|
s1 = ::accept(s, (sockaddr*)&addr2, &n); //接受连接请求
|
|
|
if (s1 != NULL)
|
|
|
{
|
|
|
printf("%s已经连接上\r\n", inet_ntoa(addr2.sin_addr));
|
|
|
::send(s1, sztext, sizeof(sztext), 0); //向客户端发送字符数组
|
|
|
}
|
|
|
::closesocket(s); //关闭套接字句柄
|
|
|
::closesocket(s1);
|
|
|
::WSACleanup(); //释放套接字库
|
|
|
if (getchar()) //如果有输入,则关闭程序
|
|
|
{
|
|
|
return; //正常结束程序
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
::Sleep(100); //应用睡眠0.1秒
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
switch (message)
|
|
|
{
|
|
|
case WM_COMMAND:
|
|
|
{
|
|
|
int wmId = LOWORD(wParam);
|
|
|
// 分析菜单选择:
|
|
|
switch (wmId)
|
|
|
{
|
|
|
case IDM_ABOUT:
|
|
|
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
|
|
|
break;
|
|
|
case IDM_EXIT:
|
|
|
DestroyWindow(hWnd);
|
|
|
break;
|
|
|
default:
|
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case WM_PAINT:
|
|
|
{
|
|
|
PAINTSTRUCT ps;
|
|
|
HDC hdc = BeginPaint(hWnd, &ps);
|
|
|
// TODO: 在此处添加使用 hdc 的任何绘图代码...
|
|
|
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
|
|
|
EndPaint(hWnd, &ps);
|
|
|
}
|
|
|
break;
|
|
|
case WM_DESTROY:
|
|
|
PostQuitMessage(0);
|
|
|
break;
|
|
|
default:
|
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
// Register the window class
|
|
|
BOOL MyRegisterClass(HINSTANCE hInstance, int nCmdShow)
|
|
|
{
|
|
|
const wchar_t CLASS_NAME[] = L"Sample Window Class";
|
|
|
|
|
|
WNDCLASS wc = {};
|
|
|
|
|
|
wc.lpfnWndProc = MyWindowProc;
|
|
|
wc.hInstance = hInstance;
|
|
|
wc.lpszClassName = L"Second";
|
|
|
_T("abc");
|
|
|
|
|
|
RegisterClass(&wc);
|
|
|
|
|
|
HWND hwnd = CreateWindowW(L"Second", L"Second", WS_OVERLAPPEDWINDOW,
|
|
|
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
|
|
|
|
|
|
if (hwnd == NULL)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void MyCom()
|
|
|
{
|
|
|
// COM
|
|
|
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
|
|
|
if (SUCCEEDED(hr))
|
|
|
{
|
|
|
IFileOpenDialog * pFileOpen;
|
|
|
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, reinterpret_cast <void **> (&pFileOpen));
|
|
|
if (SUCCEEDED(hr))
|
|
|
{
|
|
|
hr = pFileOpen->Show(NULL);
|
|
|
if (SUCCEEDED(hr))
|
|
|
{
|
|
|
IShellItem * pItem;
|
|
|
hr = pFileOpen->GetResult(&pItem);
|
|
|
if (SUCCEEDED(hr))
|
|
|
{
|
|
|
PWSTR pszFilePaht;
|
|
|
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePaht);
|
|
|
|
|
|
// Display the file name to the user.
|
|
|
if (SUCCEEDED(hr))
|
|
|
{
|
|
|
MessageBox(NULL, pszFilePaht, L"File Path", MB_OK);
|
|
|
CoTaskMemFree(pszFilePaht);
|
|
|
}
|
|
|
pItem->Release();
|
|
|
}
|
|
|
}
|
|
|
pFileOpen->Release();
|
|
|
}
|
|
|
CoUninitialize();
|
|
|
}
|
|
|
} |