Win32-Process-CommandLine version 0.01
======================================

This module tries to get command line parameters that is passed to when starting
a program. In windows, there is no existing tool for finding out the process's 
parameters. From task manager, only process names are displayed. So starting a 
program with different parameters several times, it's hard to tell a process 
with what options. This module requires a C compiler.

e.g. from windows Start->Run, type
notepad c:\boot.ini
2988 is its process id.

	$pid = 2988;
	Win32::Process::CommandLine::GetPidCommandLine($pid, $str);

The program name and parameters will be returned to $str.
In windows 2003 server, value of $str is
	"C:\WINDOWS\system32\notepad.exe" c:\boot.ini

This module is a good example of how to write C subroutines to extend Perl's ability.
I have never done this before, so I encountered lots questions probably others will
have as well. My procedures and advices:
- Develop the C program and keep the calling interface as simple as possible
	. Try not to use Win32 data type that don't have corresponding Perl type.
	  Then you have to come up with type map file.

	. CommandLine.h only has calling interface
	  int GetPidCommandLine( int pid, char* cmdParameter);

	. CommandLine.c introduces some win32 knowledge:
	  - The win2k/win2003/winXP are using UTF16 internally and little endian.
	    Get familiar with wchar_t and its functions
		ASCII, single byte	    
		31    32    33    00
		---------------------
		1     2     3     \0

		MBCS
		31 00	32 00	33 00	00 00
		-----------------------------
		1 	2 	3 	\0

	  - Convert Unicode string to ANSI(multi-byte) string
	  	WideCharToMultiByte(CP_OEMCP, 0, wstr, -1, NULL, 0, NULL, NULL);

	  - Write debug log if _DEBUG is defined when compiling.
	  	hOut = CreateFile("_pidCmdLine.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 
	  	FILE_ATTRIBUTE_NORMAL, NULL);
	  	
	  	WriteFile (hOut, wstr, wcslen(wstr) * 2, &nOut, NULL)

	  - Compile to an win32 executable file
	  	cd exe
	  	cl CommandLine.c
	  	CommandLine.exe 2988	

- Use h2xs to generate module skeleton: h2xs -x -n Win32::Process::CommandLine CommandLine.h
	. copy 2 C header files to new folder
	. There're tons of details about Perl internal data types and xs usages, but I just 
	  use simple things.
	. Edit CommandLine.xs. h2xs doesn't do following things for you.
	  - copy essential C code from CommandLine.c, then paste it above 
	    MODULE = Win32::Process::CommandLine	PACKAGE = Win32::Process::CommandLine

	  - Add infer face declaration. OUTPUT section informs Perl which variables are updated 
	    after calling.
		int
		GetPidCommandLine(pid, cmdParameter)
			int pid
			char* cmdParameter
		OUTPUT:
			cmdParameter
- Add file names to MANIFEST that you want to distribute with package.

- Following instruction in INSTALLATION to compile and install
	A dll is built and install to Perl directory.
	This module uses win32 APIs, it will be fast to get information.

- Test
	nmake test		#run test.pl
	test_one_pid.pl		#ask for one PID 
	test_all_pid.pl		#try to print all process's parameters

- Pack for Distribution
	nmake dist	

INSTALLATION

To install this module type the following:

   perl Makefile.PL
   make
   make test
   make install

DEPENDENCIES

This module requires these other modules and libraries for testing:

  Win32::Process
  Win32::Process::Info

COPYRIGHT AND LICENCE

Copyright (C) 2007 by Jing Kang (kxj@hotmail.com)

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
