Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[winAPI] Otwieranie programu od nowa

Ostatnio zmodyfikowano 2016-07-05 11:04
Autor Wiadomość
mikson
Temat założony przez niniejszego użytkownika
[winAPI] Otwieranie programu od nowa
» 2016-07-01 21:37:46
Witajcie,

Jak mogę "zresetować" mój program, aby okno i kontrolki narysowały się od nowa, ogólnie zamknąć i otworzyć ponownie?
Zaznaczam, że chcę to zrobić bez użycia
ShellExecute()
, ponieważ wystarczy, że ktoś zmieni nazwę pliku *.exe i już kaplica. :)

Z góry dziękuję za pomoc.
Pozdrawiam
P-149597
mateczek
» 2016-07-02 13:48:47
chcesz przerysować okno czy zrestartować aplikację?? jeśli to drugie to chyba bez drugiego programu(procesu)działającego w tle się nie obejdzie
P-149606
j23
» 2016-07-02 19:20:40
@mateczek, a po co drugi program? Przecież aplikacja może odpalić drugą instancję samej siebie.

@mikson, użyj GetModuleFileName żeby pobrać pełną ścieżkę do pliku *.exe, wtedy zmiana nazwy nie będzie miała wpływu na "restart".



PS, nie wnikam w zasadność takiego restartowania aplikacji.
P-149622
Szadziu
» 2016-07-03 21:05:13
a po co GetModuleFileName  jak main jest uruchamiane z argumentami, a pierwszy z nich to nazwa programu?
P-149651
Elaine
» 2016-07-04 09:04:28
Nieprawda, już o tym kiedyś pisałem.

Ani standard C++, ani Windows, ani POSIX tego nie gwarantują.

W przypadku wywołania w rodzaju:
C/C++
// POSIX:
execl( "foo", "foo.file", static_cast < const char *>( nullptr ) );
// Windows:
wchar_t commandLine[] = L"foo.file";
STARTUPINFOW startupInfo { };
startupInfo.cb = static_cast < DWORD >( sizeof( startupInfo ) );
PROCESS_INFORMATION processInfo;
CreateProcessW( L"foo.exe", commandLine, nullptr, nullptr, FALSE, 0, nullptr, nullptr, & startupInfo, & processInfo );
argv[0] to będzie "foo.file", nie nazwa programu. Przy odpowiednio szczęśliwych warunkach można w ten sposób spowodować eskalację uprawnień.

Nie ma dobrego przenośnego sposobu na pobranie nazwy programu. Pod Windowsem można użyć GetModuleFileName, pod Linuksem odczytać cel symlinku /proc/self/exe, Solaris ma getexecname, Mac OS X: _NSGetExecutablePath, w przypadku FreeBSD do tego służy sysctl z argumentami {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}, ale niestety nie istnieje nic ustandaryzowanego w POSIX.
P-149659
j23
» 2016-07-04 10:49:05
@Szadziu, ano po to, że poza funkcją main nie masz dostępu do tych argumentów. Możesz oczywiście stworzyć jakąś zmienną globalną ze ścieżką. Tylko po co, skoro jest już funkcja, którą możesz wywołać w każdym miejscu programu?
P-149663
Szadziu
» 2016-07-04 22:52:58
@Alueril: tego nie wiedziałem, dobrze się dowiedzieć:) dzięki za info.

@j23: Nikt o globalnych zmiennych nie mówił. Można przekazać jako argument, trzymać jako membera w klasie itd. To że często coś jest łatwiejsze nie znaczy, że jest lepsze.
P-149682
j23
» 2016-07-05 11:04:00
@Szadziu, nie chodzi o sposób przekazywania, tylko o bezsensowność takiego podejścia. Zresztą zmienna globalna to był przykład, który jest najprostszy w realizacji i użyciu.
P-149689
« 1 »
  Strona 1 z 1