2011-01-06 9 views
-2

この出力はどのようなものですか(どの文字セット)、どうすればそれを意味のあるものに変換できますか? alt textperlを使って文字列の文字を解釈するのに助けが必要

use Win32::API; 

$EnumProcesses= new Win32::API('psapi', 'EnumProcesses','PNP'); 

$aBuffer = " " x 4096; 
$bBuffer = " " x 4096; 

$EnumProcesses->Call($aBuffer,4096,$bBuffer); 
print $aBuffer,"\n",$bBuffer,"\n"; 
+3

あなたは何をしようとしていますか?私は、Win32 APIを使用していても心が弱いのではないので、おそらくCPANモジュールがあり、あなたが望むことを大騒ぎにすることはないと思っています。 – Hugmeir

+0

私はこれに対する解決策が別のモジュールmanを使うことではないと思います。明らかに、私はWin32 :: APIをperlで動かそうとしています。 Win32 :: APIを使用している – nebulus

+2

はそれ自身の目標ではありません。 Win32 :: APIを使って何か*しようとしています。あなたの究極の目標は何ですか? –

答えて

6

あなたがEnumProcessesマニュアルを読み、exampleが、その中にリンクがありますか?あなたは文字データをまったく扱っていないようです。 EnumProcessesは、プロセスごとに1つ、Nの4バイト(またはDWORD)レコードを持つ$abufferを入力します。この4バイトの値は、単なる数字であり、4文字ではありません。

特定のプロセスに関する詳細を知りたい場合は、OpenProcessまたはPrintProcessNameAndIDなどの関数に、この4バイトの数値(Win APIドキュメントでは「プロセス識別子」と呼ばれます)をフィードする必要があります。ここで

は4バイトのリトルエンディアン番号として結果を表示するコードです:

use Modern::Perl; # strict, warnings, 5.10 features 
use Win32::API; 

my $EnumProcesses= new Win32::API('psapi', 'EnumProcesses','PNP'); 

my $process_ids_packed = " " x 4096; 
my $num_processes_packed = " " x 4; # you don't need 4096 here. 

$EnumProcesses->Call($process_ids_packed,4096,$num_processes_packed); 

my ($num_processes) = unpack "V", $num_processes_packed; 
my @process_ids = unpack "V$num_processes", $process_ids_packed; 

for (@process_ids) { 
    say; 
} 

そして、ここではその結果です:

C:\Users\pgp\Documents\src\tmp>perl winapi.pl 
0 
4 
252 
392 
464 
472 
520 
536 
544 
596 
692 
748 
780 
788 
912 
964 
412 
456 
908 
1116 
1212 
1228 
1460 
1492 
1520 
1528 
1576 
1724 
1740 
1748 
1988 
2028 
312 
2288 
2544 
2592 
2756 
3004 
3116 
3216 
3340 
3048 
2792 
1320 
2868 
3760 
2404 
4196 
2692 
4084 
1768 
538976288 
538976288 
538976288 
538976288 
538976288 
[... lots more lines ...] 
538976288 
538976288 
538976288 
538976288 
538976288 
538976288 
0

ここでは、最終的な結果です。

use strict; 
use warnings; 
use Win32::API; 

my $EnumProcesses = new Win32::API('psapi','EnumProcesses','PNP'); 
my $process_ids_packed = "\0" x 4096; 
my $num_processes_packed = "\0" x 4; 

$EnumProcesses->Call($process_ids_packed,4096,$num_processes_packed); 
my ($num_processes) = unpack "V", $num_processes_packed; 

my $buffer = "\0" x $num_processes; #Allocate buffer of proper-size 
$EnumProcesses->Call($buffer,$num_processes,$num_processes_packed); 

print "Number of processes: ",$num_processes/4,"\n"; 

my @process_ids = unpack "V$num_processes", $buffer; 

for (@process_ids) { 
    print $_,"\n"; 
} 

ありがとうございます!

+0

なぜEnumProcessesをもう一度呼び出すのですか?私の解決法と同じように、一度だけ呼び出す必要があります。 –

+0

あなたのソリューションにはプロセスID用の固定バッファがあります。私のことはしません。これは、 '53976288'を持たないPIDの配列をインスタンス化するために行われ、バッファによっても制約を受けません。 – nebulus

+0

@seaworthy 53976288は、バッファのクレームされた有効部分にあります。 'unpack 'を使ってV $ num_processes"は '$ buffer'から' $ num_processes'エントリだけを抽出します。 1024以上のプロセスがある場合、 '$ num_processes'は1024のままです(ドキュメントの状態と同じです)ので、私のコードよりも多くをフェッチしません。最後に、1プロセスあたり4バイトが必要なので、必要なスペースは '$ total_number_of_processes * 4'です。 –

関連する問題