Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re^2: odd line in windows

by xiaoyafeng (Chaplain)
on Sep 07, 2011 at 09:22 UTC ( #924573=note: print w/ replies, xml ) Need Help??


in reply to Re: odd line in windows
in thread odd line in windows

Many Thanks, BrowserUk! Returning a variable on stack is a fundamental mistake indeed. I change

TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

into
TCHAR * szProcessName = (TCHAR*) malloc( MAX_PATH * sizeof(TCHAR) );

it looks like working well now. but sequenced question is, how free this memory I allocate in C?

That said. I wonder why you aren't using Win32::Process::Info?

I don't using Wi32::Process::Info is because it's running a bit slowly. it uses variable way to get Process info and return too large info to me. In my case, I just want to check process name.





I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction


Comment on Re^2: odd line in windows
Select or Download Code
Re^3: odd line in windows
by Anonymous Monk on Sep 07, 2011 at 09:27 UTC
Re^3: odd line in windows
by BrowserUk (Pope) on Sep 07, 2011 at 09:39 UTC
    I change = TEXT("<unknown>"); into = (TCHAR*) malloc( MAX_PATH * sizeof(TCHAR) ); it looks like working well now. but sequenced question is, how free this memory I allocate in C?

    You should not be using malloc(). Did you miss my mention of Newx(), Newxc() Newxz() and the associated link?

    how free this memory I allocate in C?

    If you followed the link, you would have seen Safefree()

    In my case, I just want to check process name.

    I tend to use tasklist for that:

    perl -E"my @tasks = map[ (split)[0,1] ], `tasklist /nh`; say qq[@$_] f +or @tasks"

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
Re^3: odd line in windows
by syphilis (Canon) on Sep 07, 2011 at 15:14 UTC
    but sequenced question is, how free this memory I allocate in C?

    One way is to create a copy, free the memory, then return the copy.

    The following rewrite of get_proc_name() works for me, and frees the memory:
    SV * get_proc_name( int processID ) { char * szProcessName; SV * outsv; Newxz(szProcessName, MAX_PATH, char); HANDLE hProcess = OpenProcess ( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNee +ded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, MAX_PATH + - 1); } else { szProcessName[0] = '#'; szProcessName[1] = 0; } } else { szProcessName[0] = '*'; szProcessName[1] = 0; } CloseHandle( hProcess ); outsv = newSVpv(szProcessName, 0); Safefree(szProcessName); return outsv; }
    Cheers,
    Rob

      You only need do one or the other. Not both.

      That is, if you are going to copy the string into an SV in order to return it, there is no reason not to allocate the local copy on the stack:

      char* get_proc_name( int processID ) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); SV * outsv; ... outsv = newSVpv(szProcessName, 0); return outsv; }

      You save an alloc and free that way.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        You save an alloc and free that way

        Yes - I think that's a better approach.
        (However, specifying a return type of char * and then returning an SV * is something that doesn't work well for me ;-)
        I find the following works as expected (without any need to dynamically allocate/free memory) , and doesn't throw any warnings:
        SV * get_proc_name( int processID ) { char szProcessName[MAX_PATH] = {0}; HANDLE hProcess = OpenProcess ( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNee +ded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, MAX_PATH + - 1); } else { szProcessName[0] = '#'; szProcessName[1] = 0; } } else { szProcessName[0] = '*'; szProcessName[1] = 0; } CloseHandle( hProcess ); return newSVpv(szProcessName, 0); }
        Cheers,
        Rob

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://924573]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (7)
As of 2014-10-23 11:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (125 votes), past polls