Shellでmdbを起動して待機


蓮見  2003-12-26 20:30:09  No: 81158

VBからmdbを起動して終了まで待機させるとかのサンプルで
よくこのようなものが紹介されています、Shellを使った場合、
Shellの戻り値はDoble型ですから、Doble→Longへの
型変換がここでは行われてしまって、問題とか起こりえないでしょうか?

このようなコーディングは間違っているのでしょうか?

Dim hProcess As Long
Dim lret As Long ' As Doble

lret = Shell("D:\db1.mdb", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, lret)

以下省略

宜しくお願いします。


Say  2003-12-29 03:38:24  No: 81159

タスクID(プロセスID)自体がunsigned longですから
Long型でも動作します。


蓮見  2003-12-31 01:24:55  No: 81160

こんにちは。

>タスクID(プロセスID)自体がunsigned longですから
>Long型でも動作します。

確かに動作はしますが。

Shell関数の戻り値はDoubleですよね?

lret = Shell("D:\db1.mdb", vbNormalFocus)
Long ← Doble

これで問題ないのかと?


ねろ  2003-12-31 04:21:26  No: 81161

Shell関数の戻り値はDoubleですが、プロセスIDがLongなんで
Long以上の値は返りません。
Dim a As Double
Dim b As Long
a = 100000
b = a
とやったのと同じです。
VBはそのような言語です。
とSayさんは言っています。


Say  2004-01-06 02:44:13  No: 81162

暗黙のキャストが気持ち悪いなら、
lret = CLng(Shell("...
とコーディングすればいいかと。


でも  2004-01-06 22:06:34  No: 81163

> タスクID(プロセスID)自体がunsigned longですから
> Long型でも動作します。
VBのLong型って、unsigned longではなく、signed longですよね。
&H7FFFFFFFを超える値が来ても大丈夫なのですか?


Say  2004-01-09 00:46:31  No: 81164

オーバーフローはしません。

MsgBox CLng(&HFFFFFFFF)


でも  2004-01-22 01:09:42  No: 81165

> オーバーフローはしません。
でもが確認したいのは、そういう話ではなくて……。

……例えば、Shell関数の戻り値が &H99999999 だった場合に、
CDbl("-1717986919") という値で返されるのか、それとも
CDbl("+2576980377") という値で返されるのか、という話です。

前者の形式で返されるなら、戻り値の型は Long でも十分ですが、
それをあえてDoubleで返しているという事は、Longを超える値として
返される可能性があるのではないか……? という事を尋ねています。

VB6のヘルプを見る限りでは、&H8000000 を超える値が、正負
どちらの値として返されるのかという、明確な記述が無いので、
でもも蓮見さん同様、『これで問題ないのかと?』思うのです。

万一、正値になる仕様だったら、オーバーフローしちゃいますよね。


でも  2004-01-22 01:23:11  No: 81166

> ……例えば、Shell関数の戻り値が &H99999999 だった場合に、

「実行されたタスクのプロセスID が unsigned long の 0x99999999
 だった場合の Shell 関数の戻り値」のような意味で書いてます。(_o_)


いちゆ  2004-01-22 01:52:30  No: 81167

こんな感じ?

Public Function dtoL(ByVal d As Double) As Long
Dim b(1 To 4) As Byte
d = Abs(d)
b(4) = Int(d / &H1000000): d = re(d, &H1000000)
b(3) = Int(d / &H10000):   d = re(d, &H10000)
b(2) = Int(d / &H100):     d = re(d, &H100)
b(1) = d 'Int(d / &H1)
Debug.Print b(1); b(2); b(3); b(4)
dtoL = (b(4) And &H7F) * &H1000000 + b(3) * &H10000 + b(2) * &H100& + CLng(b(1))
If b(4) And 128 Then dtoL = 2147483647 - dtoL - 1 '補数処理
End Function


いちゆ  2004-01-22 01:54:00  No: 81168

あっ…だめだ。


Say  2004-01-22 02:23:59  No: 81169

推量や経験則で語っても始まりませんので、
正確なことがお知りになりたい場合、
マイクロソフトにお問い合わせください。

さもなくば、ヘルプの使用例にあるように
Variantで受けておくのが無難でしょう。


でも  2004-01-22 03:01:05  No: 81170

戻り値を Long で受けても問題ないのかどうかを
問い合わせた事はあります。その上で、先のSayさんの
「…とコーディングすればいい」という発言の根拠を
でもは尋ねています。わかりにくくてごめんなさい。(_o_)

昔尋ねたときに、戻り値がプロセスIDであるという事と、
Variant や Double で受ける分には問題無いという事は、
答えてもらいましたが、Long で受けるという事に関しては
答えてもらっていませんので、とーっても気になるのです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加