<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.shelek.ru/index.php?action=history&amp;feed=atom&amp;title=FAQ%3AWinAPI_VCPP%3A%D1%81%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B</id>
		<title>FAQ:WinAPI VCPP:самообновление запущенной программы - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.shelek.ru/index.php?action=history&amp;feed=atom&amp;title=FAQ%3AWinAPI_VCPP%3A%D1%81%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B"/>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI_VCPP:%D1%81%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;action=history"/>
		<updated>2026-05-26T18:41:06Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://wiki.shelek.ru/index.php?title=FAQ:WinAPI_VCPP:%D1%81%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;diff=745&amp;oldid=prev</id>
		<title>RXL: Новая: ===Каким способом exe файл может заменить самого себя?===  К примеру, программа должна обновляется через In...</title>
		<link rel="alternate" type="text/html" href="https://wiki.shelek.ru/index.php?title=FAQ:WinAPI_VCPP:%D1%81%D0%B0%D0%BC%D0%BE%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;diff=745&amp;oldid=prev"/>
				<updated>2009-10-03T13:03:48Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: ===Каким способом exe файл может заменить самого себя?===  К примеру, программа должна обновляется через In...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Каким способом exe файл может заменить самого себя?===&lt;br /&gt;
&lt;br /&gt;
К примеру, программа должна обновляется через Internet и хочет обновить свой exe-файл. Но так как он в данный момент запущен, это будет, естественно, невозможно сделать напрямую.&lt;br /&gt;
Один из способов - сделать копию экзешника и из него обновиться&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// путь к старому файлу&lt;br /&gt;
#define def_exeNAMEup	&amp;quot;c:\\myprog_toupdate.exe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// путь к новому файлу (уже &amp;quot;скачали&amp;quot;:) )&lt;br /&gt;
#define def_exeNAMEdnld	&amp;quot;c:\\myprog_downloaded.exe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define def_keyUdate	&amp;quot;/update&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::UpdateItself()&lt;br /&gt;
{&lt;br /&gt;
	// добыча полного имени экзешника&lt;br /&gt;
	CString csFullExeName;&lt;br /&gt;
	{&lt;br /&gt;
		CString csAppName = GetCommandLine();&lt;br /&gt;
		csAppName.Delete(0,1);&lt;br /&gt;
		csAppName.Replace('\&amp;quot;', '\0');&lt;br /&gt;
		csFullExeName = (const char*)csAppName;&lt;br /&gt;
	}&lt;br /&gt;
	// теперь csFullExeName - содержит искомый путь&lt;br /&gt;
&lt;br /&gt;
	// делаем копию экзешника с другим именем&lt;br /&gt;
	CopyFile(csFullExeName, def_exeNAMEup, 0);&lt;br /&gt;
&lt;br /&gt;
	// передаём в параметры нового процесса ключ и путь к текущему файлу&lt;br /&gt;
	CString csParams = def_keyUdate;&lt;br /&gt;
&lt;br /&gt;
	csParams += &amp;quot; &amp;quot;;&lt;br /&gt;
	csParams += csFullExeName;&lt;br /&gt;
&lt;br /&gt;
	// запускаем копию&lt;br /&gt;
	STARTUPINFO si;&lt;br /&gt;
	PROCESS_INFORMATION pi;&lt;br /&gt;
&lt;br /&gt;
	ZeroMemory(&amp;amp;si, sizeof(si));&lt;br /&gt;
	si.cb = sizeof(si);&lt;br /&gt;
	ZeroMemory(&amp;amp;pi, sizeof(pi));&lt;br /&gt;
&lt;br /&gt;
	if (CreateProcess(def_exeNAMEup, def_keyUdate, 0, 0, 0, 0, 0, 0, &amp;amp;si, &amp;amp;pi))&lt;br /&gt;
	{&lt;br /&gt;
		// завершаем текущий процесс&lt;br /&gt;
		ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CTESTFAQApp::ExitFromMyApp()&lt;br /&gt;
{&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL CTESTFAQApp::InitInstance()&lt;br /&gt;
{&lt;br /&gt;
	// смотрим, не запущено ли для апдейта?&lt;br /&gt;
	CString txt;&lt;br /&gt;
&lt;br /&gt;
	txt = m_lpCmdLine;&lt;br /&gt;
&lt;br /&gt;
	if (txt.Find(def_keyUdate) == 0)&lt;br /&gt;
	{&lt;br /&gt;
		// делаем айдейт&lt;br /&gt;
		txt.Replace(def_keyUdate, &amp;quot;&amp;quot;);&lt;br /&gt;
		txt.TrimLeft();&lt;br /&gt;
&lt;br /&gt;
		CString csFullExeName = txt;&lt;br /&gt;
&lt;br /&gt;
		// берём откуда то уже скачанный файл обновления&lt;br /&gt;
		// ...&lt;br /&gt;
		CString csFull_Downloaded_ExeName = def_exeNAMEdnld;&lt;br /&gt;
&lt;br /&gt;
		// копируем файл (обновляем старый то есть)&lt;br /&gt;
		CopyFile(csFull_Downloaded_ExeName, csFullExeName, 0);&lt;br /&gt;
&lt;br /&gt;
		// запускаем обновлённого мученника&lt;br /&gt;
		STARTUPINFO si;&lt;br /&gt;
		PROCESS_INFORMATION pi;&lt;br /&gt;
&lt;br /&gt;
		ZeroMemory(&amp;amp;si, sizeof(si));&lt;br /&gt;
		si.cb = sizeof(si);&lt;br /&gt;
		ZeroMemory(&amp;amp;pi, sizeof(pi));&lt;br /&gt;
&lt;br /&gt;
		if (CreateProcess(csFullExeName, 0, 0, 0, 0, 0, 0, 0, &amp;amp;si, &amp;amp;pi))&lt;br /&gt;
			ExitFromMyApp();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// ...&lt;br /&gt;
	// ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ:WinAPI VCPP]]&lt;/div&gt;</summary>
		<author><name>RXL</name></author>	</entry>

	</feed>