Cdbl("&h" & "100000000") '0が8個です
これをWIN98 で実行するとオーバーフローエラーになります。
XP環境では問題無く 4294967296 を返します。
OSの制限かなにかでしょうか?
また、WIN2000ではどうでしょうか?
WIN2000環境をお持ちの方、一度テストしていただけないでしょうか?
よろしくお願いします。
おぉ、これは気が付きませんでした。
OLEコンポーネントのバージョンによる違いですかね。
> また、WIN2000ではどうでしょうか?
当方のWindows 2000 Serverでは駄目でした。
# Windows Server 2003ではどうかな?
Windows 2000 ProfessionalとWindows NT4
どちらともオーバーフローでした。
魔界の仮面弁士さん、okuさん
テストありがとう御座います。
WIN2000,NTともだめとなると XP のみ可能と言うことですか。
ちなみにOLEコンポーネントのバージョンとは、どの様に調べればわかりますか?
XP と 98のを比較してみようと思います。
ただ、どちらもSP5を適用済みではあるのですが。
よろしくお願いします。
今回の場合、CDbl関数が VarR8FromStr APIを呼び出すでしょうから、
調べるとすれば、まずは oleaut32.dll ですかね。
当方 XP Proでは、3.50.5016.0。
2000 Serverでは、3.40.4518.0でした。
Option Explicit
Private Declare Function VarR8FromStr Lib "OLEAUT32" _
(ByVal strIn As Long, _
ByVal lcid As Long, _
ByVal dwFlags As Long, _
ByRef pdblOut As Double) As Long
Private Const LOCALE_NOUSEROVERRIDE As Long = &H80000000
Private Const LANG_JAPANESE As Integer = &H11
Private Const LCID_JAPANESE As Long = LANG_JAPANESE
Private Sub Form_Load()
Text1.Text = "&H100000000"
End Sub
Private Sub Command1_Click()
Dim strIn As String
Dim dblOut As Double
Dim lngRet As Long
strIn = Text1.Text
lngRet = VarR8FromStr(StrPtr(strIn), LCID_JAPANESE, LOCALE_NOUSEROVERRIDE, dblOut)
If lngRet <> 0 Then
On Error Resume Next
Err.Raise lngRet
MsgBox "HRESULT: 0x" & Hex(lngRet) & vbCrLf _
& "Error: " & CStr(Err.Number) & vbCrLf _
& Err.Description, vbExclamation
On Error GoTo 0
Else
MsgBox Format(dblOut, "#,0.0000"), vbInformation
End If
End Sub
なお、Win2000用のOLEAUT32.DLL をネットワークドライブ経由で、
Private Declare Function VarR8FromStr Lib "W:\OLEAUT32.DLL" …
のようにして、WinXP上から呼び出したところ、やはり
"&H10000000" は問題なく変換できるものの、
"&H100000000"がオーバーフローする事を確認しました。
なお、DLL Help Databaseによると、Windows 2003 Server では、
このDLLは Version 5.2.3790.0 となっているようです。
# 2003をインストールしてないので、確認できていませんけれども。
すいません、訂正です。(;_;)
> 当方 XP Proでは、3.50.5016.0。
> 2000 Serverでは、3.40.4518.0でした。
XP Professionalが、3.50.5016.0 で、
2000 Serverの方が、2.40.4518.0 でした。m(_ _;)m
> Private Const LANG_JAPANESE As Integer = &H11
> Private Const LCID_JAPANESE As Long = LANG_JAPANESE
それと、上記は
Private Const LCID_JAPANESE As Long = &H411&
だと思います。修正ミスです。m(_ _)m
ところで……。
> なお、Win2000用のOLEAUT32.DLL をネットワークドライブ経由で、
上記とは逆に、WinXPのOLEAUT32.DLLを、Win2000から呼び出したところ、
"&H100000000"はオーバーフローせずに変換されました。
という事で、『3.50.5016.0』と『2.40.4518.0』の2種でしか
試していませんので、未確定ではありますが、恐らくは、
OLEAUT32.DLL Version 3.50.5014.0 以上であれば変換可能だが、
Version 2.40.4518.0 以下ではオーバーフローする。
という事になると思います。(さて、何へぇ〜獲得できるかな?)
>> XP と 98のを比較してみようと思います。
手元に Win98機が無いので比較できませんが、バージョン表を見る限り、
98系では、2.40系以下のOLEAUT32.DLLが使われているようですね。
3.50系以降のバージョンは、今の所、OS添付以外の方法では配布されていない
みたいなので、多分、98では変換不能だと思います。
という事で、XP未満および9X系の場合は、自前で進数変換処理を書くしか無いかと。(^_^;)
魔界の仮面弁士さん。こんにちは。
おっしゃる通り、oleaut32.dll のバージョンのようです。
WIN98SE は 2.40.4518 でした。
WIN98SE にoleaut32.dll 2.50.5016.0 をインストールしたところ 98SE でも問題
なく動作しました。
ありがとう御座いました。
蛇足ですが、標準のディストビューションウィザードでは、oleaut32.dllを最新に指定
してくれないので、強引ですが SETUP.LST を書き換えてテストしました。
> WIN98SE にoleaut32.dll 2.50.5016.0 をインストールしたところ
「2.50.5016.0」というファイルは、存在を確認していないので分かりませんが、
「3.50.5016.0」に関しては、再頒布できないかも知れません。
http://support.microsoft.com/servicedesks/fileversion/moreinfo.asp?Id=256377
oleaut32.dll自体は再頒布可能ファイルですが、その影響範囲は、
VB(VS)開発環境のパッケージ、もしくはそのService Packに
含まれるファイルのみとなっているおり、WindowsやInternet Explorerなどに
含まれるものは、基本的には再頒布できないと聞いています。
下記ページの[噂5]にある、マイクロソフトからの回答を参照してみてください。
http://www.galliver.co.jp/writing/vbm_tokushu/sp/index.html
どうしても必要なのであれば、そのファイルをインストーラに含める前に、
そのバージョンを再頒布しても良いかどうかを、マイクロソフトに
問い合わせておく事を強くお奨めします。もし、再頒布権の無いファイルを
インストールパッケージに含めてしまうと、ライセンス違反になりますので。
=== 以下は蛇足 ===
Win98へインストール可能な「比較的最近の製品」として、
『.NET Framework 1.1 再頒布可能パッケージ』があります。
もし、このパッケージに 3.50系のoleaut32.dll が含まれていれば、
これを予めインストールしておいて貰うことで、対応できるかも?
ライセンスの件、ご指摘いただきありがとう御座います。
とりあえず、98環境は基に戻します。(VPC上なので復帰しておきます。)
.NET Framework 1.1については調べてみます。
とりあえずは、自前で変換処理を書いて対処します。
ツイート | ![]() |