VB6.0をWindows7で利用するには?

解決


VBとうしろう  2011-07-17 14:21:39  No: 102985  IP: [192.*.*.*]

Win XPのVB6.0プログラムをWin7で移行した際の以下エラーの回避策をご教授下さい。(VB6.0は素人ですがよろしくお願いします)
(環境)  VB6.0 SP6 → Win 7 Pro SP1へ移行
        サーバ:SQL Server 2000 SP4 ……クライアントよりODBC接続
        クライアント: Access97 mdbを持ち、サーバDBとODBC接続したテー        ブルとクエリのみを保有
(質問)  Win7でVBプログラムをステップ実行した場合のみ、以下エラーとな        る原因と回避策をご教授下さい。尚、コンパイル→EXEから実行した        場合は正常に動作します。
(エラーメッセージ)    
        「実行時エラー '3011'  オブジェクト'(クエリ名)'は見つかりませ        んでした。オブジェクトは存在しているかまたは、名前やパス名が
        正しいか確認して下さい」
        尚、ステップ実行のエラーとなる場所は
          Set MyQD = MyDB.QueryDefs("クエリ名") の直後のSQL文です。
          MyQD.SQL = "select * from テーブル名 where 〜    
          上記:MyQD.SQL = 〜の行でエラーとなります。
        Win XP上でのステップ実行時は当然、エラーは出ません。
是非とも、お助け下さい。よろしくお願いします。

編集 削除
魔界の仮面弁士  2011-07-17 20:19:03  No: 102986  IP: [192.*.*.*]

たとえば、ODBC もしくは ini ファイル等のミスによって
接続先が間違っているという可能性は無いでしょうか。


接続先が同一なのに OS によって結果が異なってしまうようであれば、
クエリ/テーブル/列名などに、日本語を含んでいないかどうかを
確認してみてください。

半角英数字だけの名前であれば特に問題は起きないのですが、
特定の文字(たとえば長音記号)を含んでいた場合、
OS によって異なる動作となりうることが報告されています。

[SQL ServerのWindows XPにおける日本語長音の影響]
http://web.archive.org/web/20060512053107/http://www.occn.zaq.ne.jp/manga/olap-update/update.html


以下、関連情報として
http://www.gizcollabo.jp/vbtomo/log/archive/choshoqa_497_2.html

編集 削除
VBとうしろう  2011-07-17 22:57:09  No: 102987  IP: [192.*.*.*]

魔界の仮面弁士様  早速のご回答ありがとうございます。
  ・ODBCの接続先は正しいですが、ご指摘の「iniファイル」とはどこにある
    ファイルで、どんなことを確認すればよろしいのですか。
  ・クエリ/テーブル/列名に日本語は使用しておりません。
※system下のocx,dll等でWin7の場合、考慮することとかはありますか。
  ソースプロジェクトからのステップ実行とコンパイルしたEXEからの実行
  で何故、違いが出るのか素人の私には理解できません。
  WinXPではOKなので、Win7との違いということになりますが、Win7では
  Access97を使用できませんが、その当りに何かあるのでしょうか??

編集 削除
魔界の仮面弁士  2011-07-18 00:56:38  No: 102988  IP: [192.*.*.*]

> ご指摘の「iniファイル」とはどこにある
自作アプリが使用している設定ファイルのことです。

接続文字列等を別ファイルで管理せず、プログラム中に
ハードコーティングしているのであれば無視してください。


以下、追加確認として:

・VB6.EXE を管理者モードで起動させた時とそうでないときで
  結果は変わりますか?

・DAO をお使いのようですが、SQL Server への接続は
  どのように行っていますか?
    (1) mdb からの ODBC リンクテーブル経由で接続
    (2) パススルークエリーで接続
    (3) ODBCDirect にて接続


> Win7でVBプログラムをステップ実行した場合のみ、以下エラー
IDE (統合開発環境) からの実行でも、F8でのステップ実行ではなく
F5 での実行の場合は、エラーにならないという事ですか?


> Set MyQD = MyDB.QueryDefs("クエリ名") の直後のSQL文です。
使用している DAO のバージョンおよび Service Pack は何ですか?

また、.QueryDefs.Count が 0 を返していたりはしませんか?
0 以外を返す場合は、『For Each MyQD In MyDB.QueryDefs』などで
QueryDef オブジェクトを列挙して、どのようなクエリーが
返されるのかを調べてみてください。


なお、Access VBA での実行時と VB からの実行時とで、DAO の動作は
異なることがあるのでご注意を。(今回の話とは関係無いとは思いますが)
http://www.gizcollabo.jp/vbtomo/boards/vbdatabase.php?do=leaf&num=1941


> コンパイルしたEXEからの実行で何故、違いが出るのか

※コンパイルモードの違い。
→「P-Code」と「ネイティブ コード」とを切り替えた時に、結果が変化しますか?

※実行パスの違い。
→カレントディレクトリからの相対パスで処理している箇所があれば、
  絶対パスでの指定に切り替えてみてください。


> ※system下のocx,dll等でWin7の場合、考慮することとかはありますか。
ごめんなさい、特に思い当たりません。
(というか、Win7 + VB6 の組み合わせを試したことがありません…)

強いて言えば、インストーラーを用いずにアプリを手動配布する場合に、
OS が 32bit か 64bitかを気を付ける程度でしょうか。
(64bit OS では、32bit用DLL を System32 に配置しない、など)
今回は開発環境からの実行なので、関係無さそうですけれども。

編集 削除
VBとうしろう  2011-07-18 10:35:37  No: 102989  IP: [192.*.*.*]

魔界の仮面弁士様  お世話様です。

> 自作アプリが使用している設定ファイルのことです。
→プログラムでのハードコーティングです。……素人ですみません。

> VB6.EXE を管理者モードで起動させた時とそうでないときで
  結果は変わりますか?
→結果は同じです。

> DAO をお使いのようですが、SQL Server への接続は
  どのように行っていますか?
→mdb からの ODBC リンクテーブル経由で接続しています。

> IDE (統合開発環境) からの実行でも、F8でのステップ実行ではなく
  F5 での実行の場合は、エラーにならないという事ですか?
→F5での実行も、F8からの実行時と同様のエラーとなります。

> 使用している DAO のバージョンおよび Service Pack は何ですか?
→DAOバージョンとはプロジェクトの参照設定のことでしようか?
  たとすれば、DAO 2.5/3.51 Compatibility Library でファイルは
  Programfiles\〜\DAO\dao2535.tll です。
  尚、上記フォルダ内には dao2535.tllの外に DAO350.dllとDAO360.dllが
  ありましたが、DAO360.dllはAccess2000以降で利用かるDLLだと思いますが
  アクセス許可制限でリネーム・削除不可です。
  又、Service Pack はAccess97のSPのことですか?→だとしましたら、
  Win7ではAc97はインストール不可ですので今すぐに確認はできませんが、
  Office 97 SR1だったように思います。

> .QueryDefs.Count が 0 を返していたりはしませんか?
→ 今回のエラーは「Set MyQD = MyDB.QueryDefs("QW_01") 」のSQL記述で
   でしたので、この記述の直後に以下を追加→クエリは見つかります。
    For i = 1 To MyDB.QueryDefs.Count
        If MyDB.QueryDefs(i).Name = "QW_01" Then
             MsgBox "クエリ:QW_01は存在します。"
        End If
    Next i

以上、よろしくお願いします。

編集 削除
魔界の仮面弁士  2011-07-18 12:44:29  No: 102990  IP: [192.*.*.*]

> →mdb からの ODBC リンクテーブル経由で接続しています。
今回の場合、QueryDef はパススルーでは無いのですね?
(QueryDef の Connect プロパティが未設定)

で、mdb 上の選択クエリーを取得する事はできているけれども、
その SQL 文を書き換えようとしたところで問題が発生した、と。



> MyQD.SQL = "select * from テーブル名 where 〜    
> 上記:MyQD.SQL = 〜の行でエラーとなります。
FROM の後に指定するオブジェクトを、
  (1) mdb 上のテーブルにした場合
  (2) mdb 上のODBCリンクテーブルにした場合
  (3) mdb 上のテーブルに対する選択クエリーにした場合
  (4) mdb 上のODBCリンクテーブルに対する選択クエリーにした場合
に変更してみた場合、これらすべてがエラーになるのでしょうか?



>  たとすれば、DAO 2.5/3.51 Compatibility Library で
コンパチライブラリの使用はできるだけ避けてください。
それは、VB4→VB5の移行用に使われていたライブラリです。
http://support.microsoft.com/kb/141796/ja


Access 97 形式に接続する場合には、DAO 3.5x か DAO 3.6 を
使用してください。(12.0 以降は使わない方が無難です)

ベストなのは 3.5x ですが、OS との相性が悪い場合は
3.6 の利用も検討してみてください。


> 又、Service Pack はAccess97のSPのことですか?→だとしましたら、
違います。Access ではなく、JET の Service Pack の方です。
(ちなみに Access 97 に Service Pack はありません。Service Release ですね。)


また、現在インストールされているランタイムのバージョンが、
  DAO 3.5x の場合: Jet 3.5 Service Pack 3
  DAO 3.6  の場合: Jet 4.0 Service Pack 8
のものよりも古いもので無いことを確認しておいてください。
http://support.microsoft.com/kb/172733/ja
http://support.microsoft.com/kb/239114/ja


>  Programfiles\〜\DAO\dao2535.tll です。
tll ではなく tlb ですよね(Type Library)。
C:\Program Files\Common Files\Microsoft Shared\DAO\DAO2535.TLB

編集 削除
魔界の仮面弁士  2011-07-18 13:27:16  No: 102991  IP: [192.*.*.*]

> Access 97 形式に接続する場合には、DAO 3.5x か DAO 3.6 を
> 使用してください。(12.0 以降は使わない方が無難です)

> ベストなのは 3.5x ですが、OS との相性が悪い場合は
> 3.6 の利用も検討してみてください。

以下、参考情報として。Win7 ではなく Vista での動作報告ですけれども。

http://social.technet.microsoft.com/Forums/ja-JP/windowsvistasoftwareja/thread/5b455c79-c7e0-41ce-a84c-3ce45947856a

編集 削除
VBとうしろう  2011-07-18 18:09:39  No: 102992  IP: [192.*.*.*]

魔界の仮面弁士様    お手数をおかけします。

> FROM の後に指定するオブジェクトを、
>   (1) mdb 上のテーブルにした場合
>   (2) mdb 上のODBCリンクテーブルにした場合
>   (3) mdb 上のテーブルに対する選択クエリーにした場合
>   (4) mdb 上のODBCリンクテーブルに対する選択クエリーにした場合
> に変更してみた場合、これらすべてがエラーになるのでしょうか?
→いずれの場合も同じエラーとなりました。

> コンパチライブラリの使用はできるだけ避けてください。
→それを利用しない場合はVB側の参照設定で何をすればよろしいのですか?

> Access 97 形式に接続する場合には、DAO 3.5x か DAO 3.6 を
> 使用してください。(12.0 以降は使わない方が無難です)
→12.0とは参照設定で指定する「Microsoft Access 11.0 Object Library」
  のようなことですか。ACCESSVBAモジュールはこの参照設定はしますが、
  今回のVBではこの参照設定はしてありません。(他の者が作成したPG)
  又、DAO3.6を使用する場合、VBプログラム変更が必要になりますか。
  参照設定をDAO3.6 Object LibraryにするだけではNGですか。

> また、現在インストールされているランタイムのバージョンが、
>   DAO 3.5x の場合: Jet 3.5 Service Pack 3
>   DAO 3.6  の場合: Jet 4.0 Service Pack 8
> のものよりも古いもので無いことを確認しておいてください。
→Jetのバージョンは以下の通りでした。(3.51, 4.0の両方あります)
    ・3.51  MSJET35.dll … 3.51.2723.0 → SP2
            MSJTER35.dll〜MSLTUS35.dll → 全て、3.51.0623.0
    ・4.0   MSJET40.dll … 4.0.9756.07 でVista SP1よりもさらに
            新しいバージョンです。 ---->新らしすぎますか?
検討のご指摘があったDAO 4.0の利用ですが、前から変更したいと思って
MDBをAccess97→2003に変換、DAOを4.0に参照変更し実行してみましたが
実行しても、何の反応もなく手も足も出ない状況です。(素人ですので)
今後はWin7マシンでの開発となり、Win7ではAccess97は動かないし、
Access97MDBを2000や2003に変更すれば、プログラムが動かないし……
上記移植を行う場合、行わなければならない作業概要を列挙していただき
たくお願いします。 ----> それを基に移植・検証を検討したいと思います
が、その前に本問題を解決しないと、前に進めないので
よろしくお願いします。

編集 削除
魔界の仮面弁士  2011-07-18 20:38:23  No: 102993  IP: [192.*.*.*]

>> コンパチライブラリの使用はできるだけ避けてください。
>→それを利用しない場合はVB側の参照設定で何をすればよろしいのですか?
先述したように、DAO 3.5x もしくは DAO 3.6 に変更してみてください。
ファイル名で言えば、DAO2535.TLB の代わりに
DAO350.DLL もしくは DAO360.DLL を使うという事です。

ただ、先述の URL によれば、
》[プロジェクトの参照設定]を「DAO 3.51」として実行すると「Vista」上で
》エラーが発生します。(95/98/ME/XP上では正常に動作しています。)
とのことなので、Win7 でも同種の問題が発生するかもしれません。


> → Jetのバージョンは以下の通りでした
3.5 の方は過去のバージョンのようですね。


> 新らしすぎますか?
「新しすぎる」という事は無いので、上位のバージョンの方が望ましいです。

個々のファイルは、Microsoft Update のセキュリティ更新などにより、
更新される事があります。そうした複数の更新をひとつにまとめた物が
いわゆる "Service Pack" ですが、実際にはそれより細かい頻度で
コンポーネントのバージョンは更新されているはずです。

たとえば、Jet 4.0 の Service Pack は SP8 が最新であり、
そこには DAO360.DLL の 3.60.8025.0 というバージョンが含まれています。
しかし、当方環境の物は 3.60.9512.0 というより新しいバージョンです。
(このバージョンのファイルは、MS08-028 等によって提供されています)
http://www.microsoft.com/japan/technet/security/bulletin/ms08-028.mspx


> DAO 4.0の利用ですが
DAO に 4.0 というバージョンはありませんよ。



> Access97MDBを2000や2003に変更すれば、プログラムが動かないし……
そうなんですよね…。

ここは(Access の掲示板ではなく)VB の掲示板なので、
細かい話については割愛しますが、過去の経験上、97 から 2000〜2007 への
Access VBA の変換は、いろいろと修正が必要となってしまうようです。

VBA を用いず、VB6 からデータベースとしてのみ利用するだけなら、
殆どの場合、DAO の更新だけで利用できるみたいなのですけれどね。


> その前に本問題を解決しないと、前に進めないので

先に示した URL では、
》「XP互換モード」で実行したら、Vista上(「DAO3.51」)でも
》エラーが発生しなくなりました。
という報告があったかと思いますが、互換モードの設定は試されましたか?

http://support.microsoft.com/kb/279792/ja
http://support.microsoft.com/kb/935762/ja
http://msdn.microsoft.com/ja-jp/windows/dd882526
http://support.microsoft.com/kb/2297924/ja
http://support.microsoft.com/kb/929427/ja

編集 削除
VBとうしろう  2011-07-19 22:33:38  No: 102994  IP: [192.*.*.*]

魔界の仮面弁士様  お世話様です。大分前進しましたのでご報告します。

> DAO350.DLL もしくは DAO360.DLL を使うという事です。
→参照設定をコンパチからDAO 3.6 Libraryに変更…Win7 PCの動作は以下
   1) 開発環境(F5, F8)、EXEとも正常動作
   2) Access2007ランタイムインストールPC → 正常に動作しますが、
      Access2000又は2003インストールPCで、CrystalReportのキック
      (ACTION=1)箇所でAccessのパスワード要求画面が出ます。
      この現象はAccessと連携してCrystalReportを使用する場合のバグで
      パッチがあるとの記事がありましたが、既にURLがクローズされて
      いました。引き続き調査中ですが、難航しております。
      アドバイスいただければ幸いです。

> 「XP互換モード」で実行
→ご報告がもれましたが、XP互換モードはWin7 PCで利用中です。

※今後ですが、魔界の仮面弁士様のご推奨のDAO 3.6に切り替えようと
  思っています。先を考えればコンパチのままでは、又問題が発生すると
  思いますので。  大変感謝しております。  よろしくお願いします。

編集 削除
魔界の仮面弁士  2011-07-20 01:13:22  No: 102995  IP: [192.*.*.*]

> Access2000又は2003インストールPCで、CrystalReportのキック
CrystalReport ではなく
Crystal Reports ですよ。複数形。

> (ACTION=1)箇所でAccessのパスワード要求画面が出ます。
そういう事象もあるのですね。


> この現象はAccessと連携してCrystalReportを使用する場合のバグで
> パッチがあるとの記事がありましたが、既にURLがクローズされて
> いました。引き続き調査中ですが、難航しております。
現象から探してみたところ、下記の記事が見つかりました。
これのことでしょうか?


http://www.hirano.cc/cgi-bin/cr/yyregi.cgi?mode=past&pastlog=1&page=130

》Re: Accessへの接続で  Hibi - 2004/10/01(Fri) 17:28 No.264
》だいぶ時間が経過したのですが、解決したので一応報告します。
》> VB6付属のCrystal Reports は古いバージョンなので、Access最新バージョンは接続できません。
》とのことだったのですが、下記サイトよりバッチを当てたらAccess2000でも接続できました。
http://www.agtech.co.jp/download/update/crystalreports/details/7pnewdao.html
》いろいろお騒がせしましたが、ありがとうございました。
》特に猿町様には、いろいろとご教授を頂き大変感謝しています。


> 引き続き調査中ですが、難航しております。
デッドリンクに対しては、「http://www.archive.org/」を試してみてください。
WaybackMachine と書かれたところに URL を入れると、過去のアーカイブを得られます。

そこから過去の記事を参照してみると、その記事が Crystal Reports の
『P2BDAO.DLL』の更新パッチであったという情報が得られます。

バイナリそのものはアーカイブからはダウンロードできない事が多いですが、
ファイル名さえ分かれば、それを手掛かりに、メーカーに問合せるとか、
あるいは Web 経由で捜索するという選択肢があるでしょう。


なお、Crystal Reports のサポート先は過去数回変更されています。

同製品は現在、SAP 社によって買収されていますが、過去バージョンの
製品については、SAPジャパンがサポートするのか、それとも
当時のメーカー(あるいはそこから依頼を受けたサポート会社)が行うのかは
分かりません。まずは問い合わせてみては如何でしょう。

# 古い製品だと、そもそもサポートが終了している可能性もありますが。

編集 削除
VBとうしろう  2011-07-20 20:56:19  No: 102996  IP: [192.*.*.*]

魔界の仮面弁士様    お世話になりました。

> (ACTION=1)箇所でAccessのパスワード要求画面
→ご案内いただいたURLよりCrystal Reportsのパッチ(7pnewdao.exe)を
  入手→インストール→以下検証を実施
    1) 参照設定を DAO 3.6 Library に変更
    2) データ項目記述表記を正しく変更、OpenQueryDef→QueryDefsに変更
    3) AccessMDBは97→2000形式、2003形式の両方でテスト
    4) Win XP SP2,SP3、Win 7 SP1マシンでテスト
  いずれも正常に動作→問題なしと判断→解決としました。
  
素人の質問にご丁寧にお付き合いいただき又、質問字句に誤りがあったり
で、ご迷惑をおかけしました。
今回のやりとりで、いろいろと勉強させていただきました。
感謝、感謝です。本当にありがとうございました。

編集 削除