Tuesday, 2 April 2013

Running commands after exe exit


I needed a EXE to call it's related uninstall.exe when it had finished running. There are many solutions to this but I was after something short and sweet.

Here's what I came across.
http://stackoverflow.com/a/3458433/2237946

so modified to my requirements..


std::string g_PostScript;
int main()
{

g_PostScript+="notepad.exe \"hello.txt\" & "; //add a command
g_PostScript+="uninstall.exe & "; //and another one..

//time to exit
ApplyPostScript();
return 0;
}
void ApplyPostScript()
{
if (g_PostScript.length()==0)
return;
g_PostScript="cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & "+g_PostScript;
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};

CreateProcess(NULL, (LPSTR)g_PostScript.c_str(), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}

Monday, 25 March 2013

Why is this header being included?

Often I'll find a visual studio project not compiling as a header file generates an error. Then I realise there's no need for that header to be needed as it's totally unrelated.
So why is it being included?
It can take a lot of guesswork to track down the reason in a large project, but here's a quick method of showing the whole header tree for a cpp.

Add "/ShowIncludes" to the command line options for that cpp. A recursive list is displayed of each included file. Hopefully an unnecessary header file can be identified to enable this tree to be pruned.

Alternatively set the compile option:
http://msdn.microsoft.com/en-us/library/hdkef6tk(v=vs.80).aspx

Wednesday, 6 March 2013

Vijay World: P4EXP Windows Explorer Integration - Problem Solve...

Vijay World: P4EXP Windows Explorer Integration - Problem Solve...: There were lots of issues  and i was struggling to use p4exp which come in bundle with p4v setup. i Couldn't configure it properly for a...

I forget this one every time when installing perforce explorer integration. Duh.

Subst drives only visible to some applications?

Well this had me stumped for a while. I have a Z drive mapped to a folder on C using VisualSubst.

Yet some applications would deny that the Z drive existed. Very odd.

Finally it dawned on me - the applications which could not see Z were running as administrator.

The solution? Run VisualSubst again, this time as administrator and the drive mapping will not be listed.. add it here and voilá. All applications can now see your mapped drive letter.

--


For a better solution, see http://en.wikipedia.org/wiki/SUBST#Method_3

Sunday, 13 January 2013

UPnP - auto port forwarding in C++ for windows

How hard can it be?

I want my windows program to be able to automatically configure the router to forward a port.
I soon find some source code https://compilr.com/tntblow/asdas/upnpnat.cpp
..yes it works!
I eventually need to use this in my program so I incorporate the source into my project, use it, but it doesn't work. "discovery error is Fail to find an UPNP NAT.". Odd.
I last tested the source ages ago while on XP, and now on Win7. I wonder.. I run the program on and old xp laptop and success, UPNP NAT is found, although further errors occur.

Time for another solution..
A-ha, windows includes some UPnP support!
http://msdn.microsoft.com/en-gb/library/windows/desktop/aa382290(v=vs.85).aspx
Erm.. only seems to search for the UPnP device, and it's not clear how to actually configure the thing. Hmm, shelve that..

The search continues. "class PortForward"
http://social.msdn.microsoft.com/Forums/en-GB/netfxnetcom/thread/41701acc-22d5-42d1-87e1-7f4dd5f1b666
Looking promising.. but lots of compile errors to sort out.. hmm

ooh something else, maybe even simpler!
http://forum.emule-project.net/index.php?showtopic=34100

How odd, spmc is always NULL after this..

get_StaticPortMappingCollection(&spmc);


Maybe this is an XP vs Win7 thing.
Well this doesnt look very promising..
http://support.microsoft.com/kb/928233

More searching..
MiniUPnp. Surely..
Oooh there are prebuild win32 exes.. Grab! Run!

C:\MiniUPnP>upnpc-static.exe -a 192.168.0.2 53200 43300 UDP
upnpc : miniupnpc library test client. (c) 2006-2012 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.0.1:49153/gateway.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1
Socket error: connect, 0
Found a (not connected?) IGD : http://192.168.0.1:49152/upnp/control/WANIPConnection
Trying to continue anyway
Local LAN ip address : 192.168.0.2
Socket error: connect, 0
ExternalIPAddress = (
Socket error: connect, 0
AddPortMapping(43300, 53200, 192.168.0.2) failed with code -3 (UnknownError)
Socket error: connect, 0
GetSpecificPortMappingEntry() failed with code -3 (UnknownError)
InternalIP:Port = ╦t^±╩t☺:_
external (:43300 UDP is redirected to internal ╦t^±╩t☺:_ (duration=╦t┴úð¯H■() 

Yikes. Not good.

I have UPnP enabled in my router, and it list entries there from other members of the LAN, so I would expect the problem lies in the code.

Back to "class PortForward" listed earlier..
Compiles.. run and get:
PortForward::Access Nat->get_StaticPortMappingCollection succeeded, but left Collection null

Same old story, bah!!!

Apps like shareaza must have a go at this, and the source is available!
Running shareaza, viewing log..



[23:45:14] Windows Firewall setup for UPnP succeeded.
[23:45:14] Trying to setup port mappings using NAT UPnP...
[23:45:19] Trying to setup port mappings using Control Point UPnP...
[23:45:19] Accepting incoming TCP connections on 0.0.0.0 port 0.
[23:45:19] Listening for UDP datagrams on 0.0.0.0 port 0.
[23:45:19] Found UPnP device: WANConnectionDevice (ChildLevel: 0, UID: uuid:ab5d9077-0710-4373-a4ea-5192c8781666)
[23:45:29] Traversing the service list of UPnP device failed.


Well that's looking like a non-starter.

Maybe my trusty old netgear DG834G router is only partially UPnP compatible?









Tuesday, 18 October 2011

Why is my application slow?

I've used plenty of CPU / GPU profiling solutions on various platforms before, so when it finally became time to profile a win32 app I had written I looked around for a decent method.
This turned out to be surprisingly hard! Nothing decent was built into Visual Studio professional. I don't have the Team edition, so I cannot comment there, although why such a fundamental thing as a profiler is not present by default is a mystery.
Sure, I could go old skool and fill my code with clock checking around suspect functions, but surely there's a faster way.

VTune - this I just did not get on with. Pricey too. Had to system restore in the end to get my system back up.

AMD CodeAnalyst - promising, but not there yet.

Windows performance analysis tools (Xperf) - I'm happy in a command line environment, but this just got too fiddly.

Very Sleepy - Within one minute of download I had all the bottlenecks in my application in front of me.. even with call stacks. HURRAH!!

...so a mega thumbs up to http://www.codersnotes.com/sleepy
Free too!

and another.. also shows source line. A bit more techy, but still free!
http://lukestackwalker.sourceforge.net/


Monday, 21 March 2011

Windows XP - Cant open applications? Window elements missing?

I've been using XP for years, usually doing 10 things at once, and therefore having plenty of windows open. Eventually I'll open an explorer window and it will look malformed, or I'll run an application and it will start acting very strange.
The solution I've had to employ is to close down some of the lesser-needed windows and then try again, usually with success. It's as if there's a memory leak, but there's no sign of any lack of free memory.
This mystery plagued me for so long until I eventually found the cause and a fix.. An internal memory heap needed to be expanded to accommodate all these windows!

It involves a registry tweak and a reboot, but microsoft have provided a foolproof fix to run, which I used and it's finally removed the only problem I've had with XP. Wish I had found it years ago.. argh!
http://support.microsoft.com/kb/126962 (Scroll down and click on "Fix It")

Install, reboot, open all the windows you want without fear of hitting any hidden limits. (well, eventually maybe!)