Fri Jun 12 09:37:57 2020: Request 132811 was acted upon. Transaction: Ticket created by ralf.neuba...@wido.bv.aok.de Queue: PAR-Packer Subject: Win32: Crash a week after start Broken in: (no value) Severity: (no value) Owner: Nobody Requestors: ralf.neuba...@wido.bv.aok.de Status: new Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=132811 >
Hi, I just found out why PAR::Packer-generated executables tend to crash when I interact with them after I started them some days ago and they stayed mostly idle in the task bar -- this also happened on Win7, but I analyzed it under Win10: https://support.microsoft.com/en-us/help/4506040/temp-folder-with-logon-session-id-is-deleted-unexpectedly You can imagine a program behaving strange or crashing when it wants to load modules, resources or data files from its PAR_TEMP directory, but everything but the already open DLLs has vanished. I don't know exactly which windows versions are affected, but I don't want to give programs to users that suddenly crash out of nowhere, they might lose trust into the programs. I don't know if there can be a better solution than documenting this behaviour. Of course one can set PAR_GLOBAL_TEMP or PAR_GLOBAL_TMPDIR, but you have to use wrapper scripts or an installer that find a suitable directory on the user's machine and set the variables for the process or globally -- which a bit defeats the 'one executable, no installer, just double-click the file I gave you' purpose of PAR::Packer. So the workaround I found is (without the Win32API::File-doesn't-exist-on-non-Win32 handling): if ('CODE' eq ref $INC[-1] && $^O eq 'MSWin32' && !$ENV{PAR_GLOBAL_TEMP} && !$ENV{PAR_GLOBAL_TMPDIR}) { use File::Find; use Win32API::File qw(:ALL); #use threads; #(async { no warnings 'File::Find'; find +{ no_chdir => 1, wanted => sub { # ignore result, handle stays open until program terminates -f and createFile $_, 'r ke', 'rw'; }, }, $ENV{PAR_TEMP}; } #)->detach; } Is there a better way? Mit freundlichen Grüßen Ralf