Thanks, Sisyphus. I've posted this question on perlmonks.
but I don't understand below warning:
C:\MinGW\perl\lib\CORE/proto.**h:2567:19: note: expected 'struct SV * const'
but argument is of type 'struct AV *'
I does return a SV* other than AV*.

On Wed, Sep 7, 2011 at 11:47 AM, Sisyphus <sisyph...@optusnet.com.au> wrote:

>
> ----- Original Message ----- From: "Xiao Yafeng" <xyf.x...@gmail.com>
> To: "inline" <inline@perl.org>
> Cc: "Sisyphus" <sisyph...@optusnet.com.au>
> Sent: Wednesday, September 07, 2011 2:28 AM
> Subject: strange line
>
>
>
>  I wrote a simple snippet to list processes name and pid on windows. but
>> the
>> output returns a strange line. below is the code:
>>
>>>
>>>
>>>
>>> use strict;
>>>
>> use warnings;
>>
>> use Inline C => DATA =>
>>          LIBS => '-luser32 -lkernel32 -lpsapi';
>>
>> my $a = process_list();
>> map { print; print get_proc_name($_);print "\n"; } @{$a};
>>
>>
>> __END__
>> __C__
>>
>> #include <windows.h>
>> #include <stdio.h>
>> #include <tchar.h>
>> #include <psapi.h>
>>
>> char* get_proc_name( int processID )
>> {
>>   TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
>>
>>
>>   HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
>>                                  PROCESS_VM_READ,
>>                                  FALSE, processID );
>>
>>
>>   if (NULL != hProcess )
>>   {
>>       HMODULE hMod;
>>       DWORD cbNeeded;
>>
>>       if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
>>            &cbNeeded) )
>>       {
>>           GetModuleBaseName( hProcess, hMod, szProcessName,
>>                              sizeof(szProcessName)/sizeof(**TCHAR) );
>>       }
>>   }
>>
>>   CloseHandle( hProcess );
>> return szProcessName;
>> }
>>
>>
>>
>>
>>
>> SV* process_list(){
>>
>> DWORD aProcesses[1024], cbNeeded, cProcesses;
>>   unsigned int i;
>> EnumProcesses( aProcesses, sizeof(aProcesses),  &cbNeeded );
>>
>> cProcesses = cbNeeded / sizeof(DWORD);
>> AV* AV_procs = newAV();
>>   for ( i = 0; i < cProcesses; i++ )
>>   {
>>       if( aProcesses[i] != 0 )
>>       {
>>           av_push(AV_procs, newSViv( aProcesses[i] ) );
>>       }
>>   }
>>   return newRV_inc(AV_procs);
>> }
>>
>>
>>
>> __OUTPUT__
>>
>> C:\>perl test.pl
>> 4P ?F >                       <==    strange line
>> 292<unknown>
>> 372<unknown>
>> 432<unknown>
>>
>
> Haven't yet had a chance to take a thorough look at this.
> I inserted the following near the beginning of your script:
>
> use Inline C => Config =>
>   BUILD_NOISY => 1;
>
> That way you get to see any compiler warnings that are emitted during the C
> compilation, and with my cc-4.5.2 build of perl-5.14 I saw:
>
> try_pl_f4a3.xs: In function 'get_proc_name':
> try_pl_f4a3.xs:35:1: warning: function returns address of local variable
> try_pl_f4a3.xs: In function 'process_list':
> try_pl_f4a3.xs:57:5: warning: passing argument 2 of 'Perl_newRV' from
> incompatible pointer type
> C:\MinGW\perl\lib\CORE/proto.**h:2567:19: note: expected 'struct SV *
> const' but argument is of type 'struct AV *'
>
> Whether there's anything relevant there, I don't know.
>
> I get different output to you, of course. But in the middle of the output I
> also got one odd-looking line:
>
> 1348┤aæ☻↑:ñ $   ↑:ñ  ~↑☻
>
> When I switched to a gcc-3.4.5 build of perl-5.12, I found out what 1348
> really was:
> 1348TomTomHOMERunner.exe
>
> But then I got a strange line at the beginning of the output:
>
> 4ð¬─w4§Å ↑
> whereas, with gcc-4.5.2, that had been:
> 4<unknown>
>
> This is probably a good question for somewhere like perlmonks, where
> there's people with a good understanding of windows itself.
>
> Cheers,
> Rob
>

Reply via email to