Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2016, 13:25   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Неправильная работа приложения при компиляции MSVS (процессы, потоки)

Делаю неубиваемое приложение на винапи, но возникла проблема: если я компилирую код Pelles C, все хорошо, запускаются два процесса, которые следят друг за другом и перезапускают друг друга. Но если я компилирую MSVS 2015, второй процесс не запускается, и приложение закрывается после нажатия на крестик. Почему так? Что я делаю не так в студии?

Код:
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "intrinsic.h"

#pragma comment(lib, "user32.lib")

#define ID_KEY_FIELD	3000
#define ID_KEY_ENTER	3001


void TrackChildProcess(LPVOID param)
{
	while (1)
	{
		STARTUPINFO si;
		PROCESS_INFORMATION pi;
		CHAR szExePath[MAX_PATH];
		CHAR szCmdLine[MAX_PATH];
		DWORD pid = GetCurrentProcessId();

		GetModuleFileName(GetModuleHandle(NULL), szExePath, MAX_PATH);
		wsprintf(szCmdLine, "%s %d\0", szExePath, pid);

		ZeroMemory(&si, sizeof(STARTUPINFO));
		si.cb = sizeof(STARTUPINFO);
		CreateProcess(NULL,
			szCmdLine,
			NULL,
			NULL,
			FALSE,
			CREATE_NEW_CONSOLE,
			NULL,
			NULL,
			&si,
			&pi);

		WaitForSingleObject(pi.hProcess, INFINITE);
	}
}

void TrackParentProcess(LPVOID hParentProcess)
{
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	CHAR szExePath[MAX_PATH];

	WaitForSingleObject((HANDLE)hParentProcess, INFINITE);

	GetModuleFileName(GetModuleHandle(NULL), szExePath, MAX_PATH);

	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	CreateProcess(NULL,
		szExePath,
		NULL,
		NULL,
		FALSE,
		CREATE_NEW_CONSOLE,
		NULL,
		NULL,
		&si,
		&pi);
	ExitProcess(0);
}

void ShowMainWindow(void);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HANDLE hParentProcess = NULL;
	DWORD  ProcessID = 0;

	if (lpCmdLine != NULL)
		ProcessID = atoi(lpCmdLine);

	if (ProcessID == 0)
	{
		CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TrackChildProcess, NULL, 0, NULL);
	}
	else
	{
		hParentProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
		if (hParentProcess)
		{
			CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TrackParentProcess, (LPVOID)hParentProcess, 0, NULL);
			while (1)
			{
				Sleep(500);
			}
		}
	}

	// Main logic goes here...
	ShowMainWindow();
}

void RegisterWndClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
	WNDCLASSEX wc;

	wc.cbSize = sizeof(wc);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = Proc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = GetModuleHandle(NULL);
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = CreateSolidBrush(RGB(0x14, 0x14, 0x14));;
	wc.lpszMenuName = NULL;
	wc.lpszClassName = szName;
	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

	if (!RegisterClassEx(&wc))
	{
		MessageBox(NULL, TEXT("Cannot register class"), TEXT("Error"), MB_OK);
	}
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rect;

	switch (uMsg)
	{
	case WM_CREATE:
		CreateWindow(TEXT("EDIT"),
			NULL,
			WS_VISIBLE | WS_CHILD | ES_LEFT | ES_AUTOHSCROLL,
			10, 280, 350, 20,
			hWnd,
			(HMENU)ID_KEY_FIELD,
			NULL,
			NULL);
		CreateWindow(TEXT("BUTTON"),
			TEXT("Unlock"),
			WS_VISIBLE | WS_CHILD | ES_LEFT,
			370, 280, 150, 20,
			hWnd,
			(HMENU)ID_KEY_FIELD,
			NULL,
			NULL);
		break;
	case WM_PAINT:
		hDC = BeginPaint(hWnd, &ps);
		GetClientRect(hWnd, &rect);
		EndPaint(hWnd, &ps);
		break;
	case WM_CTLCOLOREDIT:
	{
		HDC hdc = (HDC)wParam;
		HWND hwnd = (HWND)lParam;
		if (GetDlgCtrlID(hwnd) == ID_KEY_FIELD)
		{
			SetTextColor(hdc, RGB(0x51, 0x51, 0x51));
			SetBkColor(hdc, RGB(0x29, 0x29, 0x29));
			return (LRESULT)CreateSolidBrush(RGB(0x29, 0x29, 0x29));
		}
		break;
	}
	case WM_SIZE:
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}

void ShowMainWindow(void)
{
	HWND hMainWnd;
	MSG msg;

	RegisterWndClass(WndProc, TEXT("Info"), COLOR_WINDOW);
	hMainWnd = CreateWindow(TEXT("Info"), TEXT("Info"),
		WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		CW_USEDEFAULT, 0, 550, 350, (HWND)NULL, (HMENU)NULL,
		(HINSTANCE)GetModuleHandle(NULL), NULL);

	if (!hMainWnd)
	{
		MessageBox(NULL, TEXT("Can\'t create main window."), TEXT("Error"), MB_OK);
		return GetLastError();
	}

	ShowWindow(hMainWnd, SW_SHOW);

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}
Aoizora вне форума Ответить с цитированием
Старый 18.11.2016, 18:32   #2
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Почему-то GetModuleFileName(GetModuleHandle(N ULL), szExePath, MAX_PATH); вместо пути записывает в буфер символ С.
Aoizora вне форума Ответить с цитированием
Старый 18.11.2016, 19:13   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

стоит изучить разницу между юникодом и анси.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.11.2016, 19:28   #4
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Да, я уже решил проблему. Прочитать главу у Рихтера про кодировки и переходить на юникод.
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка возникающая при компиляции приложения Vedaslav Общие вопросы Delphi 2 29.04.2016 21:29
приложения для masm32 ошибка при компиляции deathz0r Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 01.11.2013 15:08
Ошибка при компиляции приложения под MacOS demiancz Общие вопросы Delphi 2 02.03.2012 02:18
неправильная работа при инициализации переменной }|{opa KopHeB Помощь студентам 0 02.02.2011 04:32
Ошибки при компиляции приложения Autosrv из эгзамплов Lich87 Общие вопросы C/C++ 2 02.06.2010 09:48