Cdbl("&h" & "100000000")をWIN98で正常に返すには?

解決


  2003-10-04 19:06:16  No: 108964

Cdbl("&h" & "100000000") '0が8個です

これをWIN98 で実行するとオーバーフローエラーになります。
XP環境では問題無く  4294967296   を返します。

OSの制限かなにかでしょうか?
また、WIN2000ではどうでしょうか?
WIN2000環境をお持ちの方、一度テストしていただけないでしょうか?

よろしくお願いします。


魔界の仮面弁士  2003-10-04 23:55:04  No: 108965

おぉ、これは気が付きませんでした。
OLEコンポーネントのバージョンによる違いですかね。

> また、WIN2000ではどうでしょうか?
当方のWindows 2000 Serverでは駄目でした。
# Windows Server 2003ではどうかな?


oku  URL  2003-10-05 07:39:49  No: 108966

Windows 2000 ProfessionalとWindows NT4
どちらともオーバーフローでした。


  2003-10-05 08:12:44  No: 108967

魔界の仮面弁士さん、okuさん
テストありがとう御座います。
 WIN2000,NTともだめとなると XP のみ可能と言うことですか。

ちなみにOLEコンポーネントのバージョンとは、どの様に調べればわかりますか?
XP と 98のを比較してみようと思います。
ただ、どちらもSP5を適用済みではあるのですが。

よろしくお願いします。


魔界の仮面弁士  2003-10-05 20:31:06  No: 108968

今回の場合、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をインストールしてないので、確認できていませんけれども。


魔界の仮面弁士  2003-10-05 20:56:19  No: 108969

すいません、訂正です。(;_;)

> 当方 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系の場合は、自前で進数変換処理を書くしか無いかと。(^_^;)


  2003-10-06 19:32:10  No: 108970

魔界の仮面弁士さん。こんにちは。

おっしゃる通り、oleaut32.dll のバージョンのようです。
WIN98SE は 2.40.4518 でした。

WIN98SE にoleaut32.dll 2.50.5016.0 をインストールしたところ 98SE でも問題
なく動作しました。
ありがとう御座いました。

蛇足ですが、標準のディストビューションウィザードでは、oleaut32.dllを最新に指定
してくれないので、強引ですが  SETUP.LST  を書き換えてテストしました。


魔界の仮面弁士  2003-10-06 20:29:31  No: 108971

> 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 が含まれていれば、
 これを予めインストールしておいて貰うことで、対応できるかも?


  2003-10-06 22:34:18  No: 108972

ライセンスの件、ご指摘いただきありがとう御座います。
とりあえず、98環境は基に戻します。(VPC上なので復帰しておきます。)

.NET Framework 1.1については調べてみます。
とりあえずは、自前で変換処理を書いて対処します。


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

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






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