perlのリファレンスはC言語のポインタのように実アドレスを示してないとの事。
では、例えば GetDiskFreeSpaceExのような、数値をポインタで受け取るような関数は、どのように使ったらよいのでしょうか。
use Win32::API;
my $DLL=new Win32::API('Kernel32', 'GetDiskFreeSpaceEx', 'PNNN', 'N');
my $n1=0;
my $n2=0;
my $n3=0;
my $rc=$DLL->Call('c:\\', \$n1, \$n2, \$n3);
これではエラーになります。。。。当然か。。。。
No.1ベストアンサー
- 回答日時:
以下のようにしてください。
---------------------------------
my $GetDiskFreeSpaceEx =
new Win32::API(
"Kernel32", "GetDiskFreeSpaceEx","PPPP","N") || die;
my $p1 = pack("q",0);
my $p2 = pack("q",0);
my $p3 = pack("q",0);
my $ret = $GetDiskFreeSpaceEx->Call("c:\\",$p1,$p2,$p3);
if ($ret == 0){ die };
my $a1 = unpack("q",$p1);
my $a2 = unpack("q",$p2);
my $a3 = unpack("q",$p3);
print "Free=$a1 Total=$a2 TotalFree=$a3\n";
-----------------------------------------------------------
私の環境での実行結果です。
Free=853746626560 Total=920236060672 TotalFree=853746626560
GetDiskFreeSpaceExの第2、第3、第4パラメータは64ビット型符号なし整数へのポインター
になります。ですので、"PPPP"を指定します。
$p1,$p2,$p3が64ビットの符号なし整数を作成しています。
呼び出し後、unpackを行い、perlでそのまま扱える整数の$a1,$a2,$a3に変換しています。
私もWin32::APIを使用するのは初めてでしたので、念のためC言語でGetDiskFreeSpaceEx
を呼び出して、同一の値が取得できたことを確認しましたので、たぶん、あっているかと思います。
すばらしい回答、ありがとうございました。
残念なことに、私の環境では、pack("q",0) で、"q"がinvalidだと怒られてしまいましたが、ポインターの使い方という意味では、十分理解できました。感謝いたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 「名詞 of 名詞」において、どちらも同一人物が主体となったり所有する名詞の適切な各限定詞について 2 2022/08/18 11:32
- 英語 英文について教えて下さい。 2 2022/06/14 10:37
- 英語 高校英語の問題 1 2023/05/23 15:29
- 英語 【英語】 新しい職場の人と仲良くできるか心配です。 ①I'm worried I won't get 4 2022/06/26 21:19
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- 英語 a lot of my homeworkはありか? 5 2022/10/13 16:50
- 英語 英語ができる方に質問です。 以下の文がネイティブの方に伝わるかどうかを確認していただけないでしょうか 7 2022/12/16 14:54
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Strawberry Perl for Windows ...
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlプログラミング 空白行削除
-
perlをバージョンアップしたら...
-
LinuxにおいてのPerlのプログラ...
-
Perlのエラーについてご教授く...
-
Perlで時間の計算
-
perl 初等プログラミングについて
-
アルファベットに付いて質問し...
-
perlでリテラル値はメモリにど...
-
perlのプログラミング 部分入れ...
-
Perlで特定文字列から特定文字...
-
TeraPadエディターの操作方法に...
-
INDIRECT 横に再度抽出したい
-
ラズベリーパイ初心者です。 ラ...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perl 強制終了の回避について
-
Win32でInputBoxを実装するには?
-
VHDLについてですが何がお...
-
Perl/TkでURLを既定のブラウザ...
-
LWPでHTMLが取得できないことが...
-
Perl LWPでのIPv6エラー
-
LWP::Simpleでのgetについて
-
mechanizeのタイムアウト処理に...
-
TwitterAPI1.1でGetメソッド(...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
LCD ディスプレイを Raspberry ...
-
モジュールとは何ですか
おすすめ情報