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.
| [reply] [d/l] [select] |
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 | [reply] [d/l] |
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.
| [reply] [d/l] |
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 | [reply] [d/l] [select] |