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)
以下省略
宜しくお願いします。
タスクID(プロセスID)自体がunsigned longですから
Long型でも動作します。
こんにちは。
>タスクID(プロセスID)自体がunsigned longですから
>Long型でも動作します。
確かに動作はしますが。
Shell関数の戻り値はDoubleですよね?
lret = Shell("D:\db1.mdb", vbNormalFocus)
Long ← Doble
これで問題ないのかと?
Shell関数の戻り値はDoubleですが、プロセスIDがLongなんで
Long以上の値は返りません。
Dim a As Double
Dim b As Long
a = 100000
b = a
とやったのと同じです。
VBはそのような言語です。
とSayさんは言っています。
暗黙のキャストが気持ち悪いなら、
lret = CLng(Shell("...
とコーディングすればいいかと。
> タスクID(プロセスID)自体がunsigned longですから
> Long型でも動作します。
VBのLong型って、unsigned longではなく、signed longですよね。
&H7FFFFFFFを超える値が来ても大丈夫なのですか?
オーバーフローはしません。
MsgBox CLng(&HFFFFFFFF)
> オーバーフローはしません。
でもが確認したいのは、そういう話ではなくて……。
……例えば、Shell関数の戻り値が &H99999999 だった場合に、
CDbl("-1717986919") という値で返されるのか、それとも
CDbl("+2576980377") という値で返されるのか、という話です。
前者の形式で返されるなら、戻り値の型は Long でも十分ですが、
それをあえてDoubleで返しているという事は、Longを超える値として
返される可能性があるのではないか……? という事を尋ねています。
VB6のヘルプを見る限りでは、&H8000000 を超える値が、正負
どちらの値として返されるのかという、明確な記述が無いので、
でもも蓮見さん同様、『これで問題ないのかと?』思うのです。
万一、正値になる仕様だったら、オーバーフローしちゃいますよね。
> ……例えば、Shell関数の戻り値が &H99999999 だった場合に、
「実行されたタスクのプロセスID が unsigned long の 0x99999999
だった場合の Shell 関数の戻り値」のような意味で書いてます。(_o_)
こんな感じ?
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
あっ…だめだ。
推量や経験則で語っても始まりませんので、
正確なことがお知りになりたい場合、
マイクロソフトにお問い合わせください。
さもなくば、ヘルプの使用例にあるように
Variantで受けておくのが無難でしょう。
戻り値を Long で受けても問題ないのかどうかを
問い合わせた事はあります。その上で、先のSayさんの
「…とコーディングすればいい」という発言の根拠を
でもは尋ねています。わかりにくくてごめんなさい。(_o_)
昔尋ねたときに、戻り値がプロセスIDであるという事と、
Variant や Double で受ける分には問題無いという事は、
答えてもらいましたが、Long で受けるという事に関しては
答えてもらっていませんので、とーっても気になるのです。
ツイート | ![]() |