DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンソールプログラミングのウィンドウハンドルについて

環境/言語:[.NET Framework1.1, C#]
分類:[.NET]

tar32.dll を使って、*.gz のファイルを解凍するプログラムを作っています。

そのとき、P/Invoke で呼び出す API の中で、引数にウィンドウハンドルが必要になります。
ここで、コンソールのウィンドウハンドルを聞いてくる部分をどう処理すればいいのか疑問に思いました。
私は今のところ、(IntPtr)null を渡していますが、果たしてそれが正しいのかどうか、教えてください。

(IntPtr)null を渡しても解凍はできているようですが、これが正しい処理なのかどうか不安になりました。

以下に私の書いたコードを示します。

using System;
using System.Runtime.InteropServices;

public class ExtGZIP
{
[DllImport("tar32.dll", SetLastError=true, CharSet=CharSet.Ansi)]
static extern int Tar(IntPtr _hwnd, string _szCmdLine, string _szOutput, int _dwSize);

public ExtGZIP()
{}

public void GZIPExpand(string srcPath)
{
string command = @"-x "+ srcPath;

// このメソッドの最初の引数 (IntPtr)null は正しいのでしょうか?
int ret = ExtGZIP.Tar((IntPtr)null, command, null, 0);
Console.WriteLine(ret);
}

[STAThread]
static void Main(string[] args)
{
ExtGZIP ez = new ExtGZIP();
ez.GZIPExpand(@".\bin.gzip");
}

}
tar32 のドキュメントがアレだったので、代わりに Unlha32 の該当部分です。

>_hwnd UNLHA32.DLL を呼び出すアプリのウィンドウのハンドル。
> UNLHA32.DLL は実行時にこのウィンドウに対して EnableWin-
> dow() を実行しウィンドウの動作を抑制します。ウィンドウ
> が存在しないコンソールアプリの場合や,指定する必要のな
> い場合は NULL を渡します。後述の API で EnableWindow()
> の対象ウィンドウを変更することもできます。


ところで、IntPtr には Zero 静的フィールドがあり、これを使えば多少便利です。
回答ありがとうございます。
Unlha32 のドキュメントに載っていたのですね。確認しました。

> ところで、IntPtr には Zero 静的フィールドがあり、これを使えば多少便利です。

(IntPtr)null の部分を IntPtr.Zero に書き換えました。ありがとうございます。
解決済み!
> そのとき、P/Invoke で呼び出す API の中で、引数にウィンドウハンドルが必要になります。
> ここで、コンソールのウィンドウハンドルを聞いてくる部分をどう処理すればいいのか疑問に思いました。
> 私は今のところ、(IntPtr)null を渡していますが、果たしてそれが正しいのかどうか、教えてください。
>
> (IntPtr)null を渡しても解凍はできているようですが、これが正しい処理なのかどうか不安になりました。

一般解はありません。
ウィンドウハンドルとして NULL を許容する関数もあれば、そうでないものもあります。

その関数のドキュメントで「NULL が許容される」旨の説明がされていないなら避けるべきでしょう。

ですが、それでも与えるべきウィンドウ(ハンドル)が存在しないなら

・このまま「動いているからよし」とする
・「正しい動作が期待できるのかどうか」作者に問い合わせる

のどちらかを選択することになると思います。
返信ありがとうございます。

> その関数のドキュメントで「NULL が許容される」旨の説明がされていないなら避けるべきでしょう。

はい。NULL が許容されるかどうか、ドキュメントを見てもわかりませんでした。
Unlha32.dll のドキュメントに書いてあることを参考にしようと思います。

> ですが、それでも与えるべきウィンドウ(ハンドル)が存在しないなら
>
> ・このまま「動いているからよし」とする
> ・「正しい動作が期待できるのかどうか」作者に問い合わせる
>
> のどちらかを選択することになると思います。

私はどちらにするか迷いました。
tar32.dll のドキュメントには明記されていなかったので、
一時は作者に問い合わせることも考えました。

作者のページ
http://openlab.ring.gr.jp/tsuneo/tar32/
では、

>> 基本的なAPIの使い方はUNLHA32.DLLとほぼ同じです。
>> UNLHA32.DLLのドキュメントを参考にしてください。

とありましたので、NULL(IntPtr.Zero)として使用することにしました。

どうもありがとうございます。
すみません。もう一度「解決済み」をチェックします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板